From 57bde371d686168f6644234a636161ea8bf205d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Z=C3=B6llner?= Date: Fri, 1 Mar 2024 23:32:47 +0100 Subject: [PATCH 001/304] Update deploy.md / Update path to docker-compose.yml The file seems to have been moved --- docs/my-website/docs/proxy/deploy.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 7ad7d8387..e07d59b91 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -269,9 +269,7 @@ curl https://litellm-7yjrj3ha2q-uc.a.run.app/v1/chat/completions \ **Step 1** -- (Recommended) Use the example file `docker-compose.example.yml` given in the project root. e.g. https://github.com/BerriAI/litellm/blob/main/docker-compose.example.yml - -- Rename the file `docker-compose.example.yml` to `docker-compose.yml`. +- (Recommended) Use the example file `docker-compose.yml` given in the project root. e.g. https://github.com/BerriAI/litellm/blob/main/docker-compose.yml Here's an example `docker-compose.yml` file ```yaml From 42da196092a6defcc23dd2c520b557d3597ad178 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 19:13:24 -0800 Subject: [PATCH 002/304] feat(proxy_server.py): return top 100 end users for a given key --- ...odel_prices_and_context_window_backup.json | 30 +++++++++++++++++++ litellm/proxy/_types.py | 4 +++ litellm/proxy/proxy_server.py | 23 ++++++++++++-- .../src/components/view_users.tsx | 15 ++++++++++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 4870025cb..66061acc4 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -2070,6 +2070,36 @@ "output_cost_per_token": 0.00000028, "litellm_provider": "perplexity", "mode": "chat" + }, + "perplexity/sonar-small-chat": { + "max_tokens": 16384, + "input_cost_per_token": 0.00000007, + "output_cost_per_token": 0.00000028, + "litellm_provider": "perplexity", + "mode": "chat" + }, + "perplexity/sonar-small-online": { + "max_tokens": 12000, + "input_cost_per_token": 0, + "output_cost_per_token": 0.00000028, + "input_cost_per_request": 0.005, + "litellm_provider": "perplexity", + "mode": "chat" + }, + "perplexity/sonar-medium-chat": { + "max_tokens": 16384, + "input_cost_per_token": 0.0000006, + "output_cost_per_token": 0.0000018, + "litellm_provider": "perplexity", + "mode": "chat" + }, + "perplexity/sonar-medium-online": { + "max_tokens": 12000, + "input_cost_per_token": 0, + "output_cost_per_token": 0.0000018, + "input_cost_per_request": 0.005, + "litellm_provider": "perplexity", + "mode": "chat" }, "anyscale/mistralai/Mistral-7B-Instruct-v0.1": { "max_tokens": 16384, diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 6612a462e..ca9dea969 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -260,6 +260,10 @@ class NewTeamRequest(LiteLLMBase): models: list = [] +class GlobalEndUsersSpend(LiteLLMBase): + api_key: Optional[str] = None + + class TeamMemberAddRequest(LiteLLMBase): team_id: str member: Optional[Member] = None diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 20fbb20ff..17e616e2b 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -4145,7 +4145,7 @@ async def global_spend_keys( tags=["Budget & Spend Tracking"], dependencies=[Depends(user_api_key_auth)], ) -async def global_spend_end_users(): +async def global_spend_end_users(data: GlobalEndUsersSpend): """ [BETA] This is a beta endpoint. It will change. @@ -4155,9 +4155,26 @@ async def global_spend_end_users(): if prisma_client is None: raise HTTPException(status_code=500, detail={"error": "No db connected"}) - sql_query = f"""SELECT * FROM "Last30dTopEndUsersSpend";""" - response = await prisma_client.db.query_raw(query=sql_query) + if data.api_key is None: + sql_query = f"""SELECT * FROM "Last30dTopEndUsersSpend";""" + + response = await prisma_client.db.query_raw(query=sql_query) + else: + """ + Gets the top 100 end-users for a given api key + """ + current_date = datetime.now() + past_date = current_date - timedelta(days=30) + response = await prisma_client.db.litellm_spendlogs.group_by( # type: ignore + by=["end_user"], + where={ + "AND": [{"startTime": {"gte": past_date}}, {"api_key": data.api_key}] + }, + sum={"spend": True}, + order={"_sum": {"spend": "desc"}}, # type: ignore + take=100, + ) return response diff --git a/ui/litellm-dashboard/src/components/view_users.tsx b/ui/litellm-dashboard/src/components/view_users.tsx index 00329e206..5b2b5f6de 100644 --- a/ui/litellm-dashboard/src/components/view_users.tsx +++ b/ui/litellm-dashboard/src/components/view_users.tsx @@ -10,17 +10,21 @@ import { TableCell, TableBody, Tab, + Text, TabGroup, TabList, TabPanels, Metric, Grid, TabPanel, + Select, + SelectItem, } from "@tremor/react"; import { userInfoCall, adminTopEndUsersCall } from "./networking"; import { Badge, BadgeDelta, Button } from "@tremor/react"; import RequestAccess from "./request_model_access"; import CreateUser from "./create_user_button"; +import Paragraph from "antd/es/skeleton/Paragraph"; interface ViewUserDashboardProps { accessToken: string | null; @@ -166,6 +170,17 @@ const ViewUserDashboard: React.FC = ({ +
+
+
+ Key + +
+
From 5e516522fb374eae45caa529c4a26cfa105a0d07 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 19:40:50 -0800 Subject: [PATCH 003/304] docs(azure.md): improve azure docs --- docs/my-website/docs/providers/azure.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/my-website/docs/providers/azure.md b/docs/my-website/docs/providers/azure.md index bc141810c..4b78f12be 100644 --- a/docs/my-website/docs/providers/azure.md +++ b/docs/my-website/docs/providers/azure.md @@ -3,9 +3,9 @@ api_key, api_base, api_version etc can be passed directly to `litellm.completion` - see here or set as `litellm.api_key` params see here ```python import os -os.environ["AZURE_API_KEY"] = "" -os.environ["AZURE_API_BASE"] = "" -os.environ["AZURE_API_VERSION"] = "" +os.environ["AZURE_API_KEY"] = "" # "my-azure-api-key" +os.environ["AZURE_API_BASE"] = "" # "https://example-endpoint.openai.azure.com" +os.environ["AZURE_API_VERSION"] = "" # "2023-05-15" # optional os.environ["AZURE_AD_TOKEN"] = "" From 739f4f05f60a75a99d2ec7aa3989fea975f5db57 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 22:45:54 -0500 Subject: [PATCH 004/304] add support for bedrock mistral models --- litellm/llms/bedrock.py | 14 +++++ litellm/llms/prompt_templates/factory.py | 2 + litellm/tests/test_bedrock_completion.py | 80 +++++++++++++++++------- 3 files changed, 72 insertions(+), 24 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index b7f1c5023..4806a57e2 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -492,6 +492,8 @@ def convert_messages_to_prompt(model, messages, provider, custom_prompt_dict): prompt = prompt_factory( model=model, messages=messages, custom_llm_provider="bedrock" ) + elif provider == "mistral": + prompt = prompt_factory(model=model, messages=messages, custom_llm_provider="bedrock") else: prompt = "" for message in messages: @@ -623,7 +625,16 @@ def completion( "textGenerationConfig": inference_params, } ) + elif provider == "mistral": + ## LOAD CONFIG + config = litellm.AmazonLlamaConfig.get_config() + for k, v in config.items(): + if ( + k not in inference_params + ): # completion(top_k=3) > amazon_config(top_k=3) <- allows for dynamic variables to be passed in + inference_params[k] = v + data = json.dumps({"prompt": prompt, **inference_params}) else: data = json.dumps({}) @@ -729,6 +740,9 @@ def completion( outputText = response_body["generations"][0]["text"] elif provider == "meta": outputText = response_body["generation"] + elif provider == "mistral": + outputText = response_body["outputs"][0]["text"] + model_response["finish_reason"] = response_body["outputs"][0]["stop_reason"] else: # amazon titan outputText = response_body.get("results")[0].get("outputText") diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 4ed4d9295..cc8d3d49b 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -674,6 +674,8 @@ def prompt_factory( return claude_2_1_pt(messages=messages) else: return anthropic_pt(messages=messages) + elif "mistral." in model: + return mistral_instruct_pt(messages=messages) try: if "meta-llama/llama-2" in model and "chat" in model: return llama_2_chat_pt(messages=messages) diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index a448fc3a5..4a9164019 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -1,33 +1,33 @@ # @pytest.mark.skip(reason="AWS Suspended Account") -# import sys, os -# import traceback -# from dotenv import load_dotenv +import sys, os +import traceback +from dotenv import load_dotenv -# load_dotenv() -# import os, io +load_dotenv() +import os, io -# sys.path.insert( -# 0, os.path.abspath("../..") -# ) # Adds the parent directory to the system path -# import pytest -# import litellm -# from litellm import embedding, completion, completion_cost, Timeout -# from litellm import RateLimitError +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +import pytest +import litellm +from litellm import embedding, completion, completion_cost, Timeout +from litellm import RateLimitError -# # litellm.num_retries = 3 -# litellm.cache = None -# litellm.success_callback = [] -# user_message = "Write a short poem about the sky" -# messages = [{"content": user_message, "role": "user"}] +# litellm.num_retries = 3 +litellm.cache = None +litellm.success_callback = [] +user_message = "Write a short poem about the sky" +messages = [{"content": user_message, "role": "user"}] -# @pytest.fixture(autouse=True) -# def reset_callbacks(): -# print("\npytest fixture - resetting callbacks") -# litellm.success_callback = [] -# litellm._async_success_callback = [] -# litellm.failure_callback = [] -# litellm.callbacks = [] +@pytest.fixture(autouse=True) +def reset_callbacks(): + print("\npytest fixture - resetting callbacks") + litellm.success_callback = [] + litellm._async_success_callback = [] + litellm.failure_callback = [] + litellm.callbacks = [] # def test_completion_bedrock_claude_completion_auth(): @@ -257,3 +257,35 @@ # # test_provisioned_throughput() + +def test_completion_bedrock_mistral_completion_auth(): + print("calling bedrock mistral completion params auth") + import os + + # aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] + # aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] + # aws_region_name = os.environ["AWS_REGION_NAME"] + + # os.environ.pop("AWS_ACCESS_KEY_ID", None) + # os.environ.pop("AWS_SECRET_ACCESS_KEY", None) + # os.environ.pop("AWS_REGION_NAME", None) + try: + response = completion( + model="bedrock/mistral.mistral-7b-instruct-v0:2", + messages=messages, + max_tokens=10, + temperature=0.1, + ) + # Add any assertions here to check the response + print(response) + + # os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id + # os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key + # os.environ["AWS_REGION_NAME"] = aws_region_name + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +test_completion_bedrock_mistral_completion_auth() \ No newline at end of file From 8907b2733a2567cc4881fe91740c596e3f01fec1 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 22:49:31 -0500 Subject: [PATCH 005/304] skip test but it did work locally --- litellm/tests/test_bedrock_completion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index 4a9164019..e9ad6ac1c 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -257,7 +257,7 @@ def reset_callbacks(): # # test_provisioned_throughput() - +@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_mistral_completion_auth(): print("calling bedrock mistral completion params auth") import os From d1465ed57ea2433f10cf21248d5637bef3bc35ae Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 1 Mar 2024 20:02:12 -0800 Subject: [PATCH 006/304] (feat) add gpt-3.5-turbo-instruct-0914 --- docs/my-website/docs/providers/azure.md | 7 ++++++ docs/my-website/docs/providers/openai.md | 1 + ...odel_prices_and_context_window_backup.json | 25 +++++++++++++++++++ model_prices_and_context_window.json | 25 +++++++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/docs/my-website/docs/providers/azure.md b/docs/my-website/docs/providers/azure.md index 4b78f12be..dda7384c0 100644 --- a/docs/my-website/docs/providers/azure.md +++ b/docs/my-website/docs/providers/azure.md @@ -168,6 +168,13 @@ response = completion( ) ``` +## Azure Instruct Models + +| Model Name | Function Call | +|---------------------|----------------------------------------------------| +| gpt-3.5-turbo-instruct | `response = completion(model="azure/", messages=messages)` | +| gpt-3.5-turbo-instruct-0914 | `response = completion(model="azure/", messages=messages)` | + ## Advanced ### Azure API Load-Balancing diff --git a/docs/my-website/docs/providers/openai.md b/docs/my-website/docs/providers/openai.md index 1ca13b600..aa42847b1 100644 --- a/docs/my-website/docs/providers/openai.md +++ b/docs/my-website/docs/providers/openai.md @@ -93,6 +93,7 @@ response = completion( | Model Name | Function Call | |---------------------|----------------------------------------------------| | gpt-3.5-turbo-instruct | `response = completion(model="gpt-3.5-turbo-instruct", messages=messages)` | +| gpt-3.5-turbo-instruct-0914 | `response = completion(model="gpt-3.5-turbo-instruct-091", messages=messages)` | | text-davinci-003 | `response = completion(model="text-davinci-003", messages=messages)` | | ada-001 | `response = completion(model="ada-001", messages=messages)` | | curie-001 | `response = completion(model="curie-001", messages=messages)` | diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 66061acc4..d97c042c5 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -424,6 +424,23 @@ "mode": "chat", "supports_function_calling": true }, + "azure/gpt-3.5-turbo-instruct-0914": { + "max_tokens": 4097, + + "input_cost_per_token": 0.0000015, + "output_cost_per_token": 0.000002, + "litellm_provider": "text-completion-openai", + "mode": "completion" + + }, + "azure/gpt-35-turbo-instruct": { + "max_tokens": 4097, + "input_cost_per_token": 0.0000015, + "output_cost_per_token": 0.000002, + "litellm_provider": "text-completion-openai", + "mode": "completion" + + }, "azure/mistral-large-latest": { "max_tokens": 32000, "input_cost_per_token": 0.000008, @@ -537,6 +554,14 @@ "litellm_provider": "text-completion-openai", "mode": "completion" }, + "gpt-3.5-turbo-instruct-0914": { + "max_tokens": 4097, + "input_cost_per_token": 0.0000015, + "output_cost_per_token": 0.000002, + "litellm_provider": "text-completion-openai", + "mode": "completion" + + }, "claude-instant-1": { "max_tokens": 100000, "max_output_tokens": 8191, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 66061acc4..d97c042c5 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -424,6 +424,23 @@ "mode": "chat", "supports_function_calling": true }, + "azure/gpt-3.5-turbo-instruct-0914": { + "max_tokens": 4097, + + "input_cost_per_token": 0.0000015, + "output_cost_per_token": 0.000002, + "litellm_provider": "text-completion-openai", + "mode": "completion" + + }, + "azure/gpt-35-turbo-instruct": { + "max_tokens": 4097, + "input_cost_per_token": 0.0000015, + "output_cost_per_token": 0.000002, + "litellm_provider": "text-completion-openai", + "mode": "completion" + + }, "azure/mistral-large-latest": { "max_tokens": 32000, "input_cost_per_token": 0.000008, @@ -537,6 +554,14 @@ "litellm_provider": "text-completion-openai", "mode": "completion" }, + "gpt-3.5-turbo-instruct-0914": { + "max_tokens": 4097, + "input_cost_per_token": 0.0000015, + "output_cost_per_token": 0.000002, + "litellm_provider": "text-completion-openai", + "mode": "completion" + + }, "claude-instant-1": { "max_tokens": 100000, "max_output_tokens": 8191, From b4dc7f0f17ea2d3f0cc6f8f1d1153f0cb4347ee1 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 23:14:00 -0500 Subject: [PATCH 007/304] Add AmazonMistralConfig --- litellm/__init__.py | 1 + litellm/llms/bedrock.py | 51 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index cd639ddb9..65807a8a0 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -591,6 +591,7 @@ from .llms.bedrock import ( AmazonCohereConfig, AmazonLlamaConfig, AmazonStabilityConfig, + AmazonMistralConfig ) from .llms.openai import OpenAIConfig, OpenAITextCompletionConfig from .llms.azure import AzureOpenAIConfig, AzureOpenAIError diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 4806a57e2..3f14ac9e4 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -282,6 +282,55 @@ class AmazonLlamaConfig: } +class AmazonMistralConfig: + """ + Reference: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-mistral.html + Supported Params for the Amazon / Mistral models: + + - `max_tokens` (integer) max tokens, + - `temperature` (float) temperature for model, + - `top_p` (float) top p for model + - `stop` [string] A list of stop sequences that if generated by the model, stops the model from generating further output. + - `top_k` (float) top k for model + """ + + max_tokens: Optional[int] = None + temperature: Optional[float] = None + topP: Optional[float] = None + topK: Optional[float] = None + stop: Optional[list[str]] = None + + def __init__( + self, + max_tokens: Optional[int] = None, + temperature: Optional[float] = None, + topP: Optional[int] = None, + topK: Optional[float] = None, + stop: Optional[list[str]] = None, + ) -> None: + locals_ = locals() + for key, value in locals_.items(): + if key != "self" and value is not None: + setattr(self.__class__, key, value) + + @classmethod + def get_config(cls): + return { + k: v + for k, v in cls.__dict__.items() + if not k.startswith("__") + and not isinstance( + v, + ( + types.FunctionType, + types.BuiltinFunctionType, + classmethod, + staticmethod, + ), + ) + and v is not None + } + class AmazonStabilityConfig: """ Reference: https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=stability.stable-diffusion-xl-v0 @@ -627,7 +676,7 @@ def completion( ) elif provider == "mistral": ## LOAD CONFIG - config = litellm.AmazonLlamaConfig.get_config() + config = litellm.AmazonMistralConfig.get_config() for k, v in config.items(): if ( k not in inference_params From 58ed6e77de83f3f3e7f74947c8e4195173553870 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 23:27:02 -0500 Subject: [PATCH 008/304] add assertion for test --- litellm/tests/test_bedrock_completion.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index e9ad6ac1c..6f3222074 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -11,7 +11,7 @@ sys.path.insert( ) # Adds the parent directory to the system path import pytest import litellm -from litellm import embedding, completion, completion_cost, Timeout +from litellm import embedding, completion, completion_cost, Timeout, ModelResponse from litellm import RateLimitError # litellm.num_retries = 3 @@ -270,14 +270,15 @@ def test_completion_bedrock_mistral_completion_auth(): # os.environ.pop("AWS_SECRET_ACCESS_KEY", None) # os.environ.pop("AWS_REGION_NAME", None) try: - response = completion( + response:ModelResponse = completion( model="bedrock/mistral.mistral-7b-instruct-v0:2", messages=messages, max_tokens=10, temperature=0.1, ) # Add any assertions here to check the response - print(response) + assert len(response.choices) > 0 + assert len(response.choices[0].message.content) > 0 # os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id # os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key From 2321f19fe7268e82f3eecf9e82aad1fbefcde79b Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 23:28:25 -0500 Subject: [PATCH 009/304] comment out tests --- litellm/tests/test_bedrock_completion.py | 121 ++++++++++++----------- 1 file changed, 61 insertions(+), 60 deletions(-) diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index 6f3222074..3e3d8b6bb 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -1,33 +1,33 @@ # @pytest.mark.skip(reason="AWS Suspended Account") -import sys, os -import traceback -from dotenv import load_dotenv - -load_dotenv() -import os, io - -sys.path.insert( - 0, os.path.abspath("../..") -) # Adds the parent directory to the system path -import pytest -import litellm -from litellm import embedding, completion, completion_cost, Timeout, ModelResponse -from litellm import RateLimitError - -# litellm.num_retries = 3 -litellm.cache = None -litellm.success_callback = [] -user_message = "Write a short poem about the sky" -messages = [{"content": user_message, "role": "user"}] - - -@pytest.fixture(autouse=True) -def reset_callbacks(): - print("\npytest fixture - resetting callbacks") - litellm.success_callback = [] - litellm._async_success_callback = [] - litellm.failure_callback = [] - litellm.callbacks = [] +# import sys, os +# import traceback +# from dotenv import load_dotenv +# +# load_dotenv() +# import os, io +# +# sys.path.insert( +# 0, os.path.abspath("../..") +# ) # Adds the parent directory to the system path +# import pytest +# import litellm +# from litellm import embedding, completion, completion_cost, Timeout, ModelResponse +# from litellm import RateLimitError +# +# # litellm.num_retries = 3 +# litellm.cache = None +# litellm.success_callback = [] +# user_message = "Write a short poem about the sky" +# messages = [{"content": user_message, "role": "user"}] +# +# +# @pytest.fixture(autouse=True) +# def reset_callbacks(): +# print("\npytest fixture - resetting callbacks") +# litellm.success_callback = [] +# litellm._async_success_callback = [] +# litellm.failure_callback = [] +# litellm.callbacks = [] # def test_completion_bedrock_claude_completion_auth(): @@ -257,36 +257,37 @@ def reset_callbacks(): # # test_provisioned_throughput() -@pytest.mark.skip(reason="AWS Suspended Account") -def test_completion_bedrock_mistral_completion_auth(): - print("calling bedrock mistral completion params auth") - import os - - # aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] - # aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] - # aws_region_name = os.environ["AWS_REGION_NAME"] - - # os.environ.pop("AWS_ACCESS_KEY_ID", None) - # os.environ.pop("AWS_SECRET_ACCESS_KEY", None) - # os.environ.pop("AWS_REGION_NAME", None) - try: - response:ModelResponse = completion( - model="bedrock/mistral.mistral-7b-instruct-v0:2", - messages=messages, - max_tokens=10, - temperature=0.1, - ) - # Add any assertions here to check the response - assert len(response.choices) > 0 - assert len(response.choices[0].message.content) > 0 - - # os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id - # os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key - # os.environ["AWS_REGION_NAME"] = aws_region_name - except RateLimitError: - pass - except Exception as e: - pytest.fail(f"Error occurred: {e}") -test_completion_bedrock_mistral_completion_auth() \ No newline at end of file +# def test_completion_bedrock_mistral_completion_auth(): +# print("calling bedrock mistral completion params auth") +# import os +# +# # aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] +# # aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] +# # aws_region_name = os.environ["AWS_REGION_NAME"] +# +# # os.environ.pop("AWS_ACCESS_KEY_ID", None) +# # os.environ.pop("AWS_SECRET_ACCESS_KEY", None) +# # os.environ.pop("AWS_REGION_NAME", None) +# try: +# response:ModelResponse = completion( +# model="bedrock/mistral.mistral-7b-instruct-v0:2", +# messages=messages, +# max_tokens=10, +# temperature=0.1, +# ) +# # Add any assertions here to check the response +# assert len(response.choices) > 0 +# assert len(response.choices[0].message.content) > 0 +# +# # os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id +# # os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key +# # os.environ["AWS_REGION_NAME"] = aws_region_name +# except RateLimitError: +# pass +# except Exception as e: +# pytest.fail(f"Error occurred: {e}") +# +# +# test_completion_bedrock_mistral_completion_auth() \ No newline at end of file From dc84e28c41b23f7fd30f40a76f8a3b0fd10dbc43 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 23:34:04 -0500 Subject: [PATCH 010/304] update docs for supported models --- docs/my-website/docs/providers/bedrock.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/my-website/docs/providers/bedrock.md b/docs/my-website/docs/providers/bedrock.md index b57057184..d744596c4 100644 --- a/docs/my-website/docs/providers/bedrock.md +++ b/docs/my-website/docs/providers/bedrock.md @@ -286,18 +286,20 @@ response = litellm.embedding( ## Supported AWS Bedrock Models Here's an example of using a bedrock model with LiteLLM -| Model Name | Command | -|--------------------------|------------------------------------------------------------------| +| Model Name | Command | +|----------------------------|------------------------------------------------------------------| | Anthropic Claude-V2.1 | `completion(model='bedrock/anthropic.claude-v2:1', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | -| Anthropic Claude-V2 | `completion(model='bedrock/anthropic.claude-v2', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | +| Anthropic Claude-V2 | `completion(model='bedrock/anthropic.claude-v2', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | | Anthropic Claude-Instant V1 | `completion(model='bedrock/anthropic.claude-instant-v1', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | -| Amazon Titan Lite | `completion(model='bedrock/amazon.titan-text-lite-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | -| Amazon Titan Express | `completion(model='bedrock/amazon.titan-text-express-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | -| Cohere Command | `completion(model='bedrock/cohere.command-text-v14', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | -| AI21 J2-Mid | `completion(model='bedrock/ai21.j2-mid-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Amazon Titan Lite | `completion(model='bedrock/amazon.titan-text-lite-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Amazon Titan Express | `completion(model='bedrock/amazon.titan-text-express-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Cohere Command | `completion(model='bedrock/cohere.command-text-v14', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| AI21 J2-Mid | `completion(model='bedrock/ai21.j2-mid-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | | AI21 J2-Ultra | `completion(model='bedrock/ai21.j2-ultra-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | -| Meta Llama 2 Chat 13b | `completion(model='bedrock/meta.llama2-13b-chat-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | -| Meta Llama 2 Chat 70b | `completion(model='bedrock/meta.llama2-70b-chat-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Meta Llama 2 Chat 13b | `completion(model='bedrock/meta.llama2-13b-chat-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Meta Llama 2 Chat 70b | `completion(model='bedrock/meta.llama2-70b-chat-v1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Mistral 7B Instruct | `completion(model='bedrock/mistral.mistral-7b-instruct-v0:2', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | +| Mixtral 8x7B Instruct | `completion(model='bedrock/mistral.mixtral-8x7b-instruct-v0:1', messages=messages)` | `os.environ['AWS_ACCESS_KEY_ID']`, `os.environ['AWS_SECRET_ACCESS_KEY']`, `os.environ['AWS_REGION_NAME']` | ## Bedrock Embedding From be2243a4d3d4b6c026e47e0fa9145449e843d32a Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 1 Mar 2024 20:45:22 -0800 Subject: [PATCH 011/304] (feat) neatly format slack alerts --- litellm/proxy/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index a8f1c4b4d..1cc52401a 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -163,11 +163,11 @@ class ProxyLogging: # try casting messages to str and get the first 100 characters, else mark as None try: messages = str(messages) - messages = messages[:10000] + messages = messages[:100] except: messages = None - request_info = f"\nRequest Model: {model}\nMessages: {messages}" + request_info = f"\nRequest Model: `{model}`\nMessages: `{messages}`" else: request_info = "" @@ -182,7 +182,7 @@ class ProxyLogging: ): # only alert hanging responses if they have not been marked as success alerting_message = ( - f"Requests are hanging - {self.alerting_threshold}s+ request time" + f"`Requests are hanging - {self.alerting_threshold}s+ request time`" ) await self.alerting_handler( message=alerting_message + request_info, @@ -192,7 +192,7 @@ class ProxyLogging: elif ( type == "slow_response" and start_time is not None and end_time is not None ): - slow_message = f"Responses are slow - {round(end_time-start_time,2)}s response time > Alerting threshold: {self.alerting_threshold}s" + slow_message = f"`Responses are slow - {round(end_time-start_time,2)}s response time > Alerting threshold: {self.alerting_threshold}s`" if end_time - start_time > self.alerting_threshold: await self.alerting_handler( message=slow_message + request_info, @@ -303,7 +303,7 @@ class ProxyLogging: # Get the current timestamp current_time = datetime.now().strftime("%H:%M:%S") formatted_message = ( - f"Level: {level}\nTimestamp: {current_time}\n\nMessage: {message}" + f"Level: `{level}`\nTimestamp: `{current_time}`\n\nMessage: {message}" ) if self.alerting is None: return From f006b6b0032ce4208112d5051b3cc41c07fd0243 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 20:47:00 -0800 Subject: [PATCH 012/304] build(ui): enable seeing top spending end users for a given api key --- litellm/proxy/_experimental/out/404.html | 2 +- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 ...74fe2e47.js => layout-f9be08c86364b0fc.js} | 2 +- .../chunks/app/page-a458360dd75bd774.js | 1 + .../chunks/app/page-ad3e13d2fec661b5.js | 1 - .../chunks/main-app-096338c8e1915716.js | 2 +- .../chunks/main-app-9b4fb13a7db53edf.js | 1 - .../static/chunks/webpack-59d9232c3e7a8be6.js | 2 +- .../static/chunks/webpack-6b93c4e1d000ff14.js | 1 - .../out/_next/static/css/16eb955147cb6b2f.css | 5 -- .../out/_next/static/css/32e93a3d13512de5.css | 5 ++ litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 4 +- litellm/proxy/proxy_server.py | 18 +++++-- ui/litellm-dashboard/out/404.html | 2 +- .../SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js | 1 - .../SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js | 1 - .../chunks/app/layout-a7edbef474fe2e47.js | 1 - .../chunks/app/page-ad3e13d2fec661b5.js | 1 - .../out/_next/static/css/16eb955147cb6b2f.css | 5 -- ui/litellm-dashboard/out/index.html | 2 +- ui/litellm-dashboard/out/index.txt | 4 +- ui/litellm-dashboard/src/app/page.tsx | 5 ++ .../src/components/networking.tsx | 49 ++++++++++++++----- .../src/components/user_dashboard.tsx | 19 ++++--- .../src/components/view_users.tsx | 36 ++++++++++++-- 27 files changed, 115 insertions(+), 57 deletions(-) rename litellm/proxy/_experimental/out/_next/static/{SP1Cm97dc_3zo4HlsJJjg => HnLepq2YNME88Nzo5qHls}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{SP1Cm97dc_3zo4HlsJJjg => HnLepq2YNME88Nzo5qHls}/_ssgManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/chunks/app/{layout-a7edbef474fe2e47.js => layout-f9be08c86364b0fc.js} (60%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js rename ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js => litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js (54%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js rename ui/litellm-dashboard/out/_next/static/chunks/webpack-6b93c4e1d000ff14.js => litellm/proxy/_experimental/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js (98%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/webpack-6b93c4e1d000ff14.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/css/16eb955147cb6b2f.css create mode 100644 litellm/proxy/_experimental/out/_next/static/css/32e93a3d13512de5.css delete mode 100644 ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js delete mode 100644 ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js delete mode 100644 ui/litellm-dashboard/out/_next/static/css/16eb955147cb6b2f.css diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html index 4c27c5277..9b28cde0b 100644 --- a/litellm/proxy/_experimental/out/404.html +++ b/litellm/proxy/_experimental/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f9be08c86364b0fc.js similarity index 60% rename from litellm/proxy/_experimental/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js rename to litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f9be08c86364b0fc.js index e261adc05..fe5260feb 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f9be08c86364b0fc.js @@ -1 +1 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{87421:function(n,e,t){Promise.resolve().then(t.t.bind(t,99646,23)),Promise.resolve().then(t.t.bind(t,63385,23))},63385:function(){},99646:function(n){n.exports={style:{fontFamily:"'__Inter_c23dc8', '__Inter_Fallback_c23dc8'",fontStyle:"normal"},className:"__className_c23dc8"}}},function(n){n.O(0,[971,69,744],function(){return n(n.s=87421)}),_N_E=n.O()}]); \ No newline at end of file +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{11837:function(n,e,t){Promise.resolve().then(t.t.bind(t,99646,23)),Promise.resolve().then(t.t.bind(t,63385,23))},63385:function(){},99646:function(n){n.exports={style:{fontFamily:"'__Inter_c23dc8', '__Inter_Fallback_c23dc8'",fontStyle:"normal"},className:"__className_c23dc8"}}},function(n){n.O(0,[971,69,744],function(){return n(n.s=11837)}),_N_E=n.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js new file mode 100644 index 000000000..e0372da4f --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{79615:function(e,s,t){Promise.resolve().then(t.bind(t,74961))},74961:function(e,s,t){"use strict";t.r(s),t.d(s,{default:function(){return eE}});var l=t(3827),n=t(64090),r=t(47907),a=t(8792),o=t(2179),i=e=>{let{userID:s,userRole:t,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",s),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",t]}),(0,l.jsxs)("p",{children:["ID: ",s]})]})]})]})},c=t(80588);let d=async(e,s,t)=>{try{if(console.log("Form Values in keyCreateCall:",t),t.description&&(t.metadata||(t.metadata={}),t.metadata.description=t.description,delete t.description,t.metadata=JSON.stringify(t.metadata)),t.metadata){console.log("formValues.metadata:",t.metadata);try{t.metadata=JSON.parse(t.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",t);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:s,...t})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,s,t)=>{try{if(console.log("Form Values in keyCreateCall:",t),t.description&&(t.metadata||(t.metadata={}),t.metadata.description=t.description,delete t.description,t.metadata=JSON.stringify(t.metadata)),t.metadata){console.log("formValues.metadata:",t.metadata);try{t.metadata=JSON.parse(t.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",t);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:s,...t})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,s)=>{try{console.log("in keyDeleteCall:",s),c.ZP.info("Making key delete request");let t=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[s]})});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await t.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,s,t){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==t&&s&&(n="".concat(n,"/?user_id=").concat(s)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,s,t)=>{try{c.ZP.info("Requesting model data");let s=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return c.ZP.info("Received model data"),t}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,s,t)=>{try{c.ZP.info("Requesting model data");let s=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return c.ZP.info("Received model data"),t}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,s)=>{try{let t="/global/spend/logs";console.log("in keySpendLogsCall:",t);let l=await fetch("".concat(t,"/?api_key=").concat(s),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,s,t,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(t));let s="/spend/logs";s="App Owner"==t?"".concat(s,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(s,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let s=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return console.log(t),c.ZP.success("Spend Logs received"),t}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let s=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return console.log(t),c.ZP.success("Spend Logs received"),t}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,s)=>{try{s&&JSON.stringify({api_key:s}),c.ZP.info("Making top end users request");let t={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};s&&(t.body=JSON.stringify({api_key:s}));let l=await fetch("/global/spend/end_users",t);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let s=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return console.log(t),c.ZP.success("Top Models received"),t}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,s)=>{try{let t=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:s})});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await t.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,s)=>{try{let t="/spend/users";console.log("in spendUsersCall:",t);let l=await fetch("".concat(t,"/?user_id=").concat(s),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,s,t,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[s],user_id:t,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let s="/user/get_requests";console.log("in userGetRequesedtModelsCall:",s);let t=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await t.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,s)=>{try{let t="/user/get_users?role=".concat(s);console.log("in userGetAllUsersCall:",t);let l=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,s)=>{try{console.log("Form Values in teamCreateCall:",s);let t=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...s})});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await t.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,s,t)=>{try{console.log("Form Values in teamMemberAddCall:",t);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:s,member:t})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,s)=>{try{console.log("Form Values in userUpdateUserCall:",s);let t=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...s})});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await t.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,s)=>{try{let t=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:s})});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await t.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}};var P=t(10384),T=t(46453),E=t(71801),F=t(17189),M=t(12143),O=t(77171),R=t(42539),D=t(88707),U=t(1861);let{Option:L}=F.default;var z=e=>{let{userID:s,teamID:t,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=M.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),Z=()=>{p(!1),u.resetFields()},y=()=>{p(!1),g(null),u.resetFields()},f=async e=>{try{c.ZP.info("Making API Call"),p(!0);let t=await d(a,s,e);m(e=>e?[...e,t]:[t]),g(t.key),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+s)}catch(e){console.error("Error creating the key:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(O.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:Z,onCancel:y,children:(0,l.jsxs)(M.Z,{form:u,onFinish:f,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(R.Z,{placeholder:"ai_team",defaultValue:t||""})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(L,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(F.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(F.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(F.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(R.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(R.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(R.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(O.Z,{title:"Save your key",visible:x,onOk:Z,onCancel:y,footer:null,children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)(E.Z,{children:["API Key: ",j]}):(0,l.jsx)(E.Z,{children:"Key being created, this might take 30s"})})]})})]})},q=t(33393),B=t(13810),K=t(61244),V=t(10827),J=t(3851),G=t(2044),W=t(64167),$=t(74480),Y=t(7178),H=t(9853),X=t(56863),Q=t(42440),ee=e=>{let{token:s,accessToken:t,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==t||null==s)return;console.log("accessToken: ".concat(t,"; token: ").concat(s));let e=await j(t,s);console.log("Response:",e),m(e);let l=await I(t,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return s?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},children:"View Spend Report"}),(0,l.jsxs)(O.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(Q.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(X.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(Q.Z,{children:u}),(0,l.jsx)(B.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(H.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:s,accessToken:t,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+s),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(t,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Key Alias"}),(0,l.jsx)($.Z,{children:"Secret Key"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Key Budget (USD)"}),(0,l.jsx)($.Z,{children:"Spend Report"}),(0,l.jsx)($.Z,{children:"Team ID"}),(0,l.jsx)($.Z,{children:"Metadata"}),(0,l.jsx)($.Z,{children:"Models"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)($.Z,{children:"Expires"})]})}),(0,l.jsx)(J.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:null!=e.key_alias?(0,l.jsx)(E.Z,{children:e.key_alias}):(0,l.jsx)(E.Z,{children:"Not Set"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.spend})}),(0,l.jsx)(G.Z,{children:null!=e.max_budget?(0,l.jsx)(E.Z,{children:e.max_budget}):(0,l.jsx)(E.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(ee,{token:e.token,accessToken:t,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.team_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:null!=e.expires?(0,l.jsx)(E.Z,{children:e.expires}):(0,l.jsx)(E.Z,{children:"Never expires"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{onClick:()=>p(e.token),icon:q.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},et=e=>{let{userID:s,userSpendData:t,userRole:r,accessToken:a}=e;console.log("User SpendData:",t);let[o,i]=(0,n.useState)(null==t?void 0:t.spend),[c,d]=(0,n.useState)((null==t?void 0:t.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let s=e[0];i(null==s?void 0:s.spend),d((null==s?void 0:s.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,s]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(B.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(X.Z,{children:["$",o]}),(0,l.jsxs)(Q.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},el=t(36083),en=t(68967),er=t(27166),ea=e=>{let{teams:s,setSelectedTeam:t}=e,{Title:r,Paragraph:a}=el.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),s&&s.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:s.map((e,s)=>(0,l.jsx)(er.Z,{value:String(s),onClick:()=>t(e),children:e.team_alias},s))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},eo=t(37963);console.log("isLocal:",!1);var ei=e=>{let{userID:s,userRole:t,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,eo.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let s=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",s),i(s)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(s&&y&&t&&!o&&!x){let e=sessionStorage.getItem("userModels"+s);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,s,t);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+s,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+s,JSON.stringify(e.user_info));let l=(await p(y,s,t)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+s,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[s,Z,y,o,t]),null==s||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==t&&i("App Owner"),t&&"Admin Viewer"==t){let{Title:e,Paragraph:s}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(s,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(T.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(et,{userID:s,userSpendData:x,userRole:t,accessToken:y}),(0,l.jsx)(es,{userID:s,accessToken:y,data:o,setData:m}),(0,l.jsx)(z,{userID:s,teamID:_?_.team_id:null,userRole:t,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(ea,{teams:a,setSelectedTeam:b})]})})})},ec=t(5);let{Option:ed}=F.default;var eh=e=>{let{userModels:s,accessToken:t,userID:r}=e,[a]=M.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:s,accessReason:l}=e;await b(t,s,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(O.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(F.default,{placeholder:"Select model",style:{width:"100%"},children:s.map(e=>(0,l.jsx)(ed,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(R.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},em=e=>{let{accessToken:s,token:t,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!s||!t||!r||!a)return;let e=async()=>{try{let e=await x(s,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&s){let e=await v(s);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&r&&a&&e()},[s,t,r,a]),!i||!s||!t||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:e.model_name})}),(0,l.jsx)(G.Z,{children:e.provider}),(0,l.jsx)(G.Z,{children:e.user_access?(0,l.jsx)(ec.Z,{color:"green",children:"Yes"}):(0,l.jsx)(eh,{userModels:m,accessToken:s,userID:a})}),(0,l.jsx)(G.Z,{children:e.input_cost}),(0,l.jsx)(G.Z,{children:e.output_cost}),(0,l.jsx)(G.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(B.Z,{children:(0,l.jsxs)(V.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Q.Z,{children:"Pending Requests"}),(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"User ID"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Requested Models"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})})]})]}),(0,l.jsx)(J.Z,{children:d.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},eu=t(92836),ex=t(26734),ep=t(41608),ej=t(32126),eg=t(23682);let{Option:eZ}=F.default;var ey=e=>{let{userID:s,accessToken:t}=e,[r]=M.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(t,s,"any"),l=[];for(let s=0;s{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(t,s,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+s)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(O.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(M.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(R.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(R.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(eZ,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(R.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(O.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ef=e=>{let{accessToken:s,token:t,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!s||!t||!a||!o)return;let e=async()=>{try{let e=await u(s,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(s,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[s,t,a,o]),!c||!s||!t||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let t=await f(s,e);console.log("user data response:",t),m(t)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ey,{userID:o,accessToken:s}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(eu.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(eu.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"User ID"}),(0,l.jsx)($.Z,{children:"User Role"}),(0,l.jsx)($.Z,{children:"User Models"}),(0,l.jsx)($.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)($.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)(J.Z,{children:c.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_id}),(0,l.jsx)(G.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(G.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(G.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(E.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(en.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,s)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(er.Z,{value:String(s),onClick:()=>j(e.token),children:e.key_name},s)})})]})]}),(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"End User"}),(0,l.jsx)($.Z,{children:"Spend"}),(0,l.jsx)($.Z,{children:"Total Events"})]})}),(0,l.jsx)(J.Z,{children:null==h?void 0:h.map((e,s)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.end_user}),(0,l.jsx)(G.Z,{children:e.total_spend}),(0,l.jsx)(G.Z,{children:e.total_events})]},s))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),s=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",s," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ew=t(8510),ek=e=>{let{teams:s,searchParams:t,accessToken:r,setTeams:a}=e,[i]=M.Z.useForm(),[d]=M.Z.useForm(),{Title:h,Paragraph:m}=el.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(s?s[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let t=await N(r,e);null!==s?a([...s,t]):a([t]),console.log("response for team create call: ".concat(t)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=s){c.ZP.info("Making API Call");let t={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,t);console.log("response for team create call: ".concat(l.data));let n=s.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...s];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(s)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Team Name"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Budget (USD)"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)(J.Z,{children:s&&s.length>0?s.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.team_alias}),(0,l.jsx)(G.Z,{children:e.spend}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(O.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),s&&s.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:s.map((e,s)=>(0,l.jsx)(er.Z,{value:String(s),onClick:()=>{j(e)},children:e.team_alias},s))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:p?p.members_with_roles.map((e,s)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},s)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(O.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},e_=e=>{let{searchParams:s,accessToken:t}=e,[r]=M.Z.useForm(),[a]=M.Z.useForm(),{Title:i,Paragraph:d}=el.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=t){let e=[],s=await S(t,"proxy_admin_viewer");s.forEach(s=>{e.push({user_role:s.user_role,user_id:s.user_id,user_email:s.user_email})}),console.log("proxy viewers: ".concat(s));let l=await S(t,"proxy_admin");l.forEach(s=>{e.push({user_role:s.user_role,user_id:s.user_id,user_email:s.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[t]);let g=async e=>{try{if(null!=t&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let s=await C(t,e);console.log("response for team create call: ".concat(s));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(s.user_id)),e.user_id===s.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(s),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:u?u.map((e,s)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.user_role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},s)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(O.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},eb=t(12968),ev=t(67951);async function eS(e,s,t,l){console.log("isLocal:",!1);let n=window.location.origin,r=new eb.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:t,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&s(l.choices[0].delta.content)}var eN=e=>{let{accessToken:s,token:t,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{s&&t&&r&&a&&(async()=>{let e=await p(s,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[s,a,r]);let j=(e,s)=>{d(t=>{let l=t[t.length-1];return l&&l.role===e?[...t.slice(0,t.length-1),{role:e,content:l.content+s}]:[...t,{role:e,content:s}]})},g=async()=>{if(""!==o.trim()&&s&&t&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eS(o,e=>j("assistant",e),h,s)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:s}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(s,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(B.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{className:"mt-4",children:[(0,l.jsx)(eu.Z,{children:"Chat"}),(0,l.jsx)(eu.Z,{children:"API Reference"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(V.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Chat"})})})}),(0,l.jsx)(J.Z,{children:c.map((e,s)=>(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:"".concat(e.role,": ").concat(e.content)})},s))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{children:[(0,l.jsx)(eu.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(eu.Z,{children:"LlamaIndex"}),(0,l.jsx)(eu.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eA=t(33509),eC=t(30569);let{Sider:eI}=eA.default;var eP=e=>{let{setPage:s,userRole:t,defaultSelectedKey:n}=e;return"Admin Viewer"==t?(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>s("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>s("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("usage"),children:"Usage"},"4"),"Admin"==t?(0,l.jsx)(eC.Z.Item,{onClick:()=>s("users"),children:"Users"},"5"):null,"Admin"==t?(0,l.jsx)(eC.Z.Item,{onClick:()=>s("teams"),children:"Teams"},"6"):null,"Admin"==t?(0,l.jsx)(eC.Z.Item,{onClick:()=>s("admin-panel"),children:"Admin"},"7"):null]})})})},eT=e=>{let{accessToken:s,token:t,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let s=e.getFullYear(),t=e.getMonth()+1,l=e.getDate();return"".concat(s,"-").concat(t<10?"0"+t:t,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{s&&t&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(s);c(e);let t=(await y(s)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(t);let l=(await w(s)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(s,t,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let s=e.daily_spend;console.log("daily spend",s),c(s);let t=e.top_api_keys;h(t)}else{let t=(await k(s,function(e){let s=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[t,l]=e;"spend"!==t&&"startTime"!==t&&"models"!==t&&"users"!==t&&s.push({key:t,spend:l})})}),s.sort((e,s)=>Number(s.spend)-Number(e.spend));let t=s.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(t[0]))),t}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(t),p(function(e){let s={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[t,l]=e;""!==t&&null!=t&&"None"!=t&&(s[t]||(s[t]=0),s[t]+=l)})});let t=Object.entries(s).map(e=>{let[s,t]=e;return{user_id:s,spend:t}});t.sort((e,s)=>s.spend-e.spend);let l=t.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[s,t,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(P.Z,{numColSpan:2,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Monthly Spend"}),(0,l.jsx)(H.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top API Keys"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Users"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Models"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eE=()=>{let{Title:e,Paragraph:s}=el.default,[t,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,eo.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let s=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",s),a(s),"Admin Viewer"==s&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:t,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eP,{setPage:f,userRole:t,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ei,{userID:g,userRole:t,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(em,{userID:g,userRole:t,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eN,{userID:g,userRole:t,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ef,{userID:g,userRole:t,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(ek,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(e_,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eT,{userID:g,userRole:t,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=79615)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js deleted file mode 100644 index 3dd5fde9c..000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,9125))},9125:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eE}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{c.ZP.info("Making top end users request");let t=await fetch("/global/spend/end_users",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top End users received"),s}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}};var P=s(10384),T=s(46453),E=s(71801),F=s(17189),M=s(12143),R=s(77171),O=s(42539),D=s(88707),U=s(1861);let{Option:L}=F.default;var z=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=M.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),Z=()=>{p(!1),u.resetFields()},y=()=>{p(!1),g(null),u.resetFields()},f=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);m(e=>e?[...e,s]:[s]),g(s.key),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(R.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:Z,onCancel:y,children:(0,l.jsxs)(M.Z,{form:u,onFinish:f,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(O.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(L,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(F.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(F.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(F.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(O.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(O.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(O.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(R.Z,{title:"Save your key",visible:x,onOk:Z,onCancel:y,footer:null,children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)(E.Z,{children:["API Key: ",j]}):(0,l.jsx)(E.Z,{children:"Key being created, this might take 30s"})})]})})]})},q=s(33393),B=s(13810),K=s(61244),V=s(10827),J=s(3851),G=s(2044),W=s(64167),$=s(74480),Y=s(7178),H=s(9853),X=s(56863),Q=s(42440),ee=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},children:"View Spend Report"}),(0,l.jsxs)(R.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(Q.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(X.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(Q.Z,{children:u}),(0,l.jsx)(B.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(H.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},et=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Key Alias"}),(0,l.jsx)($.Z,{children:"Secret Key"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Key Budget (USD)"}),(0,l.jsx)($.Z,{children:"Spend Report"}),(0,l.jsx)($.Z,{children:"Team ID"}),(0,l.jsx)($.Z,{children:"Metadata"}),(0,l.jsx)($.Z,{children:"Models"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)($.Z,{children:"Expires"})]})}),(0,l.jsx)(J.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:null!=e.key_alias?(0,l.jsx)(E.Z,{children:e.key_alias}):(0,l.jsx)(E.Z,{children:"Not Set"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.spend})}),(0,l.jsx)(G.Z,{children:null!=e.max_budget?(0,l.jsx)(E.Z,{children:e.max_budget}):(0,l.jsx)(E.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(ee,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.team_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:null!=e.expires?(0,l.jsx)(E.Z,{children:e.expires}):(0,l.jsx)(E.Z,{children:"Never expires"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{onClick:()=>p(e.token),icon:q.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},es=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(B.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(X.Z,{children:["$",o]}),(0,l.jsxs)(Q.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},el=s(36083),en=s(68967),er=s(27166),ea=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=el.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(er.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},eo=s(37963);console.log("isLocal:",!1);var ei=e=>{let{userID:t,userRole:s,teams:a,setUserRole:o,userEmail:i,setUserEmail:c,setTeams:d}=e,[h,m]=(0,n.useState)(null),[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,eo.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),o(t)}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!h){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),d(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,h,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&o("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(T.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(es,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(et,{userID:t,accessToken:y,data:h,setData:m}),(0,l.jsx)(z,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:h,setData:m}),(0,l.jsx)(ea,{teams:a,setSelectedTeam:b})]})})})},ec=s(5);let{Option:ed}=F.default;var eh=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=M.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(R.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(F.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(ed,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(O.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},em=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:e.model_name})}),(0,l.jsx)(G.Z,{children:e.provider}),(0,l.jsx)(G.Z,{children:e.user_access?(0,l.jsx)(ec.Z,{color:"green",children:"Yes"}):(0,l.jsx)(eh,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(G.Z,{children:e.input_cost}),(0,l.jsx)(G.Z,{children:e.output_cost}),(0,l.jsx)(G.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(B.Z,{children:(0,l.jsxs)(V.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Q.Z,{children:"Pending Requests"}),(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"User ID"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Requested Models"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})})]})]}),(0,l.jsx)(J.Z,{children:d.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},eu=s(92836),ex=s(26734),ep=s(41608),ej=s(32126),eg=s(23682);let{Option:eZ}=F.default;var ey=e=>{let{userID:t,accessToken:s}=e,[r]=M.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(R.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(M.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(O.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(O.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(eZ,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(O.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(R.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ef=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(null),[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(1);return((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await u(t,null,r,!0);console.log("user data response:",e),i(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&!o&&e();let l=async()=>{try{let e=await f(t);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};r&&("Admin"==r||"Admin Viewer"==r)&&!c&&l()},[t,s,r,a]),o&&t&&s&&r&&a)?(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ey,{userID:a,accessToken:t}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(eu.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(eu.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"User ID"}),(0,l.jsx)($.Z,{children:"User Role"}),(0,l.jsx)($.Z,{children:"User Models"}),(0,l.jsx)($.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)($.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)(J.Z,{children:o.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_id}),(0,l.jsx)(G.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(G.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(G.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"End User"}),(0,l.jsx)($.Z,{children:"Spend"}),(0,l.jsx)($.Z,{children:"Total Events"})]})}),(0,l.jsx)(J.Z,{children:null==c?void 0:c.map((e,t)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.end_user}),(0,l.jsx)(G.Z,{children:e.total_spend}),(0,l.jsx)(G.Z,{children:e.total_events})]},t))})]})})]})]})}),function(){if(!o)return null;let e=Math.ceil(o.length/25),t=Math.min(25*h,o.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(h-1)*25+1," – ",t," of ",o.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===h,onClick:()=>m(h-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:h===e,onClick:()=>m(h+1),children:"Next →"})]})]})}()]})}):(0,l.jsx)("div",{children:"Loading..."})},ew=s(8510),ek=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=M.Z.useForm(),[d]=M.Z.useForm(),{Title:h,Paragraph:m}=el.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Team Name"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Budget (USD)"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)(J.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.team_alias}),(0,l.jsx)(G.Z,{children:e.spend}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(R.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(er.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(R.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},e_=e=>{let{searchParams:t,accessToken:s}=e,[r]=M.Z.useForm(),[a]=M.Z.useForm(),{Title:i,Paragraph:d}=el.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.user_role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(R.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},eb=s(12968),ev=s(67951);async function eS(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new eb.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eN=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eS(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(B.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{className:"mt-4",children:[(0,l.jsx)(eu.Z,{children:"Chat"}),(0,l.jsx)(eu.Z,{children:"API Reference"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(V.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Chat"})})})}),(0,l.jsx)(J.Z,{children:c.map((e,t)=>(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{children:[(0,l.jsx)(eu.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(eu.Z,{children:"LlamaIndex"}),(0,l.jsx)(eu.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eA=s(33509),eC=s(30569);let{Sider:eI}=eA.default;var eP=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eC.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eC.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eC.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eT=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(P.Z,{numColSpan:2,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Monthly Spend"}),(0,l.jsx)(H.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top API Keys"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Users"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Models"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eE=()=>{let{Title:e,Paragraph:t}=el.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(!0),x=(0,r.useSearchParams)(),p=x.get("userID"),j=x.get("token"),[g,Z]=(0,n.useState)("api-keys"),[y,f]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(j){let e=(0,eo.o)(j);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&Z("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?u("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[j]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:p,userRole:s,userEmail:o,showSSOBanner:m}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eP,{setPage:Z,userRole:s,defaultSelectedKey:null}),"api-keys"==g?(0,l.jsx)(ei,{userID:p,userRole:s,teams:d,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h}):"models"==g?(0,l.jsx)(em,{userID:p,userRole:s,token:j,accessToken:y}):"llm-playground"==g?(0,l.jsx)(eN,{userID:p,userRole:s,token:j,accessToken:y}):"users"==g?(0,l.jsx)(ef,{userID:p,userRole:s,token:j,accessToken:y}):"teams"==g?(0,l.jsx)(ek,{teams:d,setTeams:h,searchParams:x,accessToken:y}):"admin-panel"==g?(0,l.jsx)(e_,{setTeams:h,searchParams:x,accessToken:y}):(0,l.jsx)(eT,{userID:p,userRole:s,token:j,accessToken:y})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js b/litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js similarity index 54% rename from ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js rename to litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js index 440df3cb3..421ae3e2c 100644 --- a/ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js @@ -1 +1 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{32028:function(e,n,t){Promise.resolve().then(t.t.bind(t,47690,23)),Promise.resolve().then(t.t.bind(t,48955,23)),Promise.resolve().then(t.t.bind(t,5613,23)),Promise.resolve().then(t.t.bind(t,11902,23)),Promise.resolve().then(t.t.bind(t,31778,23)),Promise.resolve().then(t.t.bind(t,77831,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,69],function(){return n(35317),n(32028)}),_N_E=e.O()}]); \ No newline at end of file +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{70377:function(e,n,t){Promise.resolve().then(t.t.bind(t,47690,23)),Promise.resolve().then(t.t.bind(t,48955,23)),Promise.resolve().then(t.t.bind(t,5613,23)),Promise.resolve().then(t.t.bind(t,11902,23)),Promise.resolve().then(t.t.bind(t,31778,23)),Promise.resolve().then(t.t.bind(t,77831,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,69],function(){return n(35317),n(70377)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js b/litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js deleted file mode 100644 index 440df3cb3..000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{32028:function(e,n,t){Promise.resolve().then(t.t.bind(t,47690,23)),Promise.resolve().then(t.t.bind(t,48955,23)),Promise.resolve().then(t.t.bind(t,5613,23)),Promise.resolve().then(t.t.bind(t,11902,23)),Promise.resolve().then(t.t.bind(t,31778,23)),Promise.resolve().then(t.t.bind(t,77831,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,69],function(){return n(35317),n(32028)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/webpack-6b93c4e1d000ff14.js b/litellm/proxy/_experimental/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js similarity index 98% rename from ui/litellm-dashboard/out/_next/static/chunks/webpack-6b93c4e1d000ff14.js rename to litellm/proxy/_experimental/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js index 9f9b2d719..7f7915bb5 100644 --- a/ui/litellm-dashboard/out/_next/static/chunks/webpack-6b93c4e1d000ff14.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js @@ -1 +1 @@ -!function(){"use strict";var e,t,n,r,o,u,i,c,f,a={},l={};function d(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={id:e,loaded:!1,exports:{}},r=!0;try{a[e](n,n.exports,d),r=!1}finally{r&&delete l[e]}return n.loaded=!0,n.exports}d.m=a,e=[],d.O=function(t,n,r,o){if(n){o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o];return}for(var i=1/0,u=0;u=o&&Object.keys(d.O).every(function(e){return d.O[e](n[f])})?n.splice(f--,1):(c=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o];return}for(var i=1/0,u=0;u=o&&Object.keys(d.O).every(function(e){return d.O[e](n[f])})?n.splice(f--,1):(c=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o];return}for(var i=1/0,u=0;u=o&&Object.keys(d.O).every(function(e){return d.O[e](n[f])})?n.splice(f--,1):(c=!1,o: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)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem * var(--tw-space-x-reverse));margin-left:calc(.125rem * calc(1 - var(--tw-space-x-reverse)))}.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-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem * var(--tw-space-x-reverse));margin-left:calc(2.5rem * 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-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)))}.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-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-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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-tremor-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-clip{overflow-x:clip}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[1px\]{border-radius:1px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-tremor-default{border-radius:.5rem}.rounded-tremor-full{border-radius:9999px}.rounded-tremor-small{border-radius:.375rem}.rounded-b-tremor-default{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-tremor-default{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-tremor-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-tremor-small{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-tremor-default{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-tremor-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-tremor-small{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-tremor-default{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-4{border-right-width:4px}.border-t-4{border-top-width:4px}.border-t-\[1px\]{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.border-dark-tremor-background{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-dark-tremor-border{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-dark-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-dark-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-dark-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-dark-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-tremor-background{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.bg-dark-tremor-background{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-dark-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-dark-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-dark-tremor-brand-emphasis{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-dark-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}.bg-dark-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-dark-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.bg-slate-950\/30{background-color:rgba(2,6,23,.3)}.bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-tremor-background-emphasis{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-tremor-border{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.bg-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(134 136 239/var(--tw-bg-opacity))}.bg-tremor-brand-muted\/50{background-color:rgba(134,136,239,.5)}.bg-tremor-brand-subtle{--tw-bg-opacity:1;background-color:rgb(142 145 235/var(--tw-bg-opacity))}.bg-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.bg-opacity-10{--tw-bg-opacity:0.1}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-opacity-30{--tw-bg-opacity:0.3}.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:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-tremor-background{--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-tremor-background{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.fill-amber-100{fill:#fef3c7}.fill-amber-200{fill:#fde68a}.fill-amber-300{fill:#fcd34d}.fill-amber-400{fill:#fbbf24}.fill-amber-50{fill:#fffbeb}.fill-amber-500{fill:#f59e0b}.fill-amber-600{fill:#d97706}.fill-amber-700{fill:#b45309}.fill-amber-800{fill:#92400e}.fill-amber-900{fill:#78350f}.fill-amber-950{fill:#451a03}.fill-blue-100{fill:#dbeafe}.fill-blue-200{fill:#bfdbfe}.fill-blue-300{fill:#93c5fd}.fill-blue-400{fill:#60a5fa}.fill-blue-50{fill:#eff6ff}.fill-blue-500{fill:#3b82f6}.fill-blue-600{fill:#2563eb}.fill-blue-700{fill:#1d4ed8}.fill-blue-800{fill:#1e40af}.fill-blue-900{fill:#1e3a8a}.fill-blue-950{fill:#172554}.fill-cyan-100{fill:#cffafe}.fill-cyan-200{fill:#a5f3fc}.fill-cyan-300{fill:#67e8f9}.fill-cyan-400{fill:#22d3ee}.fill-cyan-50{fill:#ecfeff}.fill-cyan-500{fill:#06b6d4}.fill-cyan-600{fill:#0891b2}.fill-cyan-700{fill:#0e7490}.fill-cyan-800{fill:#155e75}.fill-cyan-900{fill:#164e63}.fill-cyan-950{fill:#083344}.fill-emerald-100{fill:#d1fae5}.fill-emerald-200{fill:#a7f3d0}.fill-emerald-300{fill:#6ee7b7}.fill-emerald-400{fill:#34d399}.fill-emerald-50{fill:#ecfdf5}.fill-emerald-500{fill:#10b981}.fill-emerald-600{fill:#059669}.fill-emerald-700{fill:#047857}.fill-emerald-800{fill:#065f46}.fill-emerald-900{fill:#064e3b}.fill-emerald-950{fill:#022c22}.fill-fuchsia-100{fill:#fae8ff}.fill-fuchsia-200{fill:#f5d0fe}.fill-fuchsia-300{fill:#f0abfc}.fill-fuchsia-400{fill:#e879f9}.fill-fuchsia-50{fill:#fdf4ff}.fill-fuchsia-500{fill:#d946ef}.fill-fuchsia-600{fill:#c026d3}.fill-fuchsia-700{fill:#a21caf}.fill-fuchsia-800{fill:#86198f}.fill-fuchsia-900{fill:#701a75}.fill-fuchsia-950{fill:#4a044e}.fill-gray-100{fill:#f3f4f6}.fill-gray-200{fill:#e5e7eb}.fill-gray-300{fill:#d1d5db}.fill-gray-400{fill:#9ca3af}.fill-gray-50{fill:#f9fafb}.fill-gray-500{fill:#6b7280}.fill-gray-600{fill:#4b5563}.fill-gray-700{fill:#374151}.fill-gray-800{fill:#1f2937}.fill-gray-900{fill:#111827}.fill-gray-950{fill:#030712}.fill-green-100{fill:#dcfce7}.fill-green-200{fill:#bbf7d0}.fill-green-300{fill:#86efac}.fill-green-400{fill:#4ade80}.fill-green-50{fill:#f0fdf4}.fill-green-500{fill:#22c55e}.fill-green-600{fill:#16a34a}.fill-green-700{fill:#15803d}.fill-green-800{fill:#166534}.fill-green-900{fill:#14532d}.fill-green-950{fill:#052e16}.fill-indigo-100{fill:#e0e7ff}.fill-indigo-200{fill:#c7d2fe}.fill-indigo-300{fill:#a5b4fc}.fill-indigo-400{fill:#818cf8}.fill-indigo-50{fill:#eef2ff}.fill-indigo-500{fill:#6366f1}.fill-indigo-600{fill:#4f46e5}.fill-indigo-700{fill:#4338ca}.fill-indigo-800{fill:#3730a3}.fill-indigo-900{fill:#312e81}.fill-indigo-950{fill:#1e1b4b}.fill-lime-100{fill:#ecfccb}.fill-lime-200{fill:#d9f99d}.fill-lime-300{fill:#bef264}.fill-lime-400{fill:#a3e635}.fill-lime-50{fill:#f7fee7}.fill-lime-500{fill:#84cc16}.fill-lime-600{fill:#65a30d}.fill-lime-700{fill:#4d7c0f}.fill-lime-800{fill:#3f6212}.fill-lime-900{fill:#365314}.fill-lime-950{fill:#1a2e05}.fill-neutral-100{fill:#f5f5f5}.fill-neutral-200{fill:#e5e5e5}.fill-neutral-300{fill:#d4d4d4}.fill-neutral-400{fill:#a3a3a3}.fill-neutral-50{fill:#fafafa}.fill-neutral-500{fill:#737373}.fill-neutral-600{fill:#525252}.fill-neutral-700{fill:#404040}.fill-neutral-800{fill:#262626}.fill-neutral-900{fill:#171717}.fill-neutral-950{fill:#0a0a0a}.fill-orange-100{fill:#ffedd5}.fill-orange-200{fill:#fed7aa}.fill-orange-300{fill:#fdba74}.fill-orange-400{fill:#fb923c}.fill-orange-50{fill:#fff7ed}.fill-orange-500{fill:#f97316}.fill-orange-600{fill:#ea580c}.fill-orange-700{fill:#c2410c}.fill-orange-800{fill:#9a3412}.fill-orange-900{fill:#7c2d12}.fill-orange-950{fill:#431407}.fill-pink-100{fill:#fce7f3}.fill-pink-200{fill:#fbcfe8}.fill-pink-300{fill:#f9a8d4}.fill-pink-400{fill:#f472b6}.fill-pink-50{fill:#fdf2f8}.fill-pink-500{fill:#ec4899}.fill-pink-600{fill:#db2777}.fill-pink-700{fill:#be185d}.fill-pink-800{fill:#9d174d}.fill-pink-900{fill:#831843}.fill-pink-950{fill:#500724}.fill-purple-100{fill:#f3e8ff}.fill-purple-200{fill:#e9d5ff}.fill-purple-300{fill:#d8b4fe}.fill-purple-400{fill:#c084fc}.fill-purple-50{fill:#faf5ff}.fill-purple-500{fill:#a855f7}.fill-purple-600{fill:#9333ea}.fill-purple-700{fill:#7e22ce}.fill-purple-800{fill:#6b21a8}.fill-purple-900{fill:#581c87}.fill-purple-950{fill:#3b0764}.fill-red-100{fill:#fee2e2}.fill-red-200{fill:#fecaca}.fill-red-300{fill:#fca5a5}.fill-red-400{fill:#f87171}.fill-red-50{fill:#fef2f2}.fill-red-500{fill:#ef4444}.fill-red-600{fill:#dc2626}.fill-red-700{fill:#b91c1c}.fill-red-800{fill:#991b1b}.fill-red-900{fill:#7f1d1d}.fill-red-950{fill:#450a0a}.fill-rose-100{fill:#ffe4e6}.fill-rose-200{fill:#fecdd3}.fill-rose-300{fill:#fda4af}.fill-rose-400{fill:#fb7185}.fill-rose-50{fill:#fff1f2}.fill-rose-500{fill:#f43f5e}.fill-rose-600{fill:#e11d48}.fill-rose-700{fill:#be123c}.fill-rose-800{fill:#9f1239}.fill-rose-900{fill:#881337}.fill-rose-950{fill:#4c0519}.fill-sky-100{fill:#e0f2fe}.fill-sky-200{fill:#bae6fd}.fill-sky-300{fill:#7dd3fc}.fill-sky-400{fill:#38bdf8}.fill-sky-50{fill:#f0f9ff}.fill-sky-500{fill:#0ea5e9}.fill-sky-600{fill:#0284c7}.fill-sky-700{fill:#0369a1}.fill-sky-800{fill:#075985}.fill-sky-900{fill:#0c4a6e}.fill-sky-950{fill:#082f49}.fill-slate-100{fill:#f1f5f9}.fill-slate-200{fill:#e2e8f0}.fill-slate-300{fill:#cbd5e1}.fill-slate-400{fill:#94a3b8}.fill-slate-50{fill:#f8fafc}.fill-slate-500{fill:#64748b}.fill-slate-600{fill:#475569}.fill-slate-700{fill:#334155}.fill-slate-800{fill:#1e293b}.fill-slate-900{fill:#0f172a}.fill-slate-950{fill:#020617}.fill-stone-100{fill:#f5f5f4}.fill-stone-200{fill:#e7e5e4}.fill-stone-300{fill:#d6d3d1}.fill-stone-400{fill:#a8a29e}.fill-stone-50{fill:#fafaf9}.fill-stone-500{fill:#78716c}.fill-stone-600{fill:#57534e}.fill-stone-700{fill:#44403c}.fill-stone-800{fill:#292524}.fill-stone-900{fill:#1c1917}.fill-stone-950{fill:#0c0a09}.fill-teal-100{fill:#ccfbf1}.fill-teal-200{fill:#99f6e4}.fill-teal-300{fill:#5eead4}.fill-teal-400{fill:#2dd4bf}.fill-teal-50{fill:#f0fdfa}.fill-teal-500{fill:#14b8a6}.fill-teal-600{fill:#0d9488}.fill-teal-700{fill:#0f766e}.fill-teal-800{fill:#115e59}.fill-teal-900{fill:#134e4a}.fill-teal-950{fill:#042f2e}.fill-tremor-content{fill:#6b7280}.fill-tremor-content-emphasis{fill:#374151}.fill-violet-100{fill:#ede9fe}.fill-violet-200{fill:#ddd6fe}.fill-violet-300{fill:#c4b5fd}.fill-violet-400{fill:#a78bfa}.fill-violet-50{fill:#f5f3ff}.fill-violet-500{fill:#8b5cf6}.fill-violet-600{fill:#7c3aed}.fill-violet-700{fill:#6d28d9}.fill-violet-800{fill:#5b21b6}.fill-violet-900{fill:#4c1d95}.fill-violet-950{fill:#2e1065}.fill-yellow-100{fill:#fef9c3}.fill-yellow-200{fill:#fef08a}.fill-yellow-300{fill:#fde047}.fill-yellow-400{fill:#facc15}.fill-yellow-50{fill:#fefce8}.fill-yellow-500{fill:#eab308}.fill-yellow-600{fill:#ca8a04}.fill-yellow-700{fill:#a16207}.fill-yellow-800{fill:#854d0e}.fill-yellow-900{fill:#713f12}.fill-yellow-950{fill:#422006}.fill-zinc-100{fill:#f4f4f5}.fill-zinc-200{fill:#e4e4e7}.fill-zinc-300{fill:#d4d4d8}.fill-zinc-400{fill:#a1a1aa}.fill-zinc-50{fill:#fafafa}.fill-zinc-500{fill:#71717a}.fill-zinc-600{fill:#52525b}.fill-zinc-700{fill:#3f3f46}.fill-zinc-800{fill:#27272a}.fill-zinc-900{fill:#18181b}.fill-zinc-950{fill:#09090b}.stroke-amber-100{stroke:#fef3c7}.stroke-amber-200{stroke:#fde68a}.stroke-amber-300{stroke:#fcd34d}.stroke-amber-400{stroke:#fbbf24}.stroke-amber-50{stroke:#fffbeb}.stroke-amber-500{stroke:#f59e0b}.stroke-amber-600{stroke:#d97706}.stroke-amber-700{stroke:#b45309}.stroke-amber-800{stroke:#92400e}.stroke-amber-900{stroke:#78350f}.stroke-amber-950{stroke:#451a03}.stroke-blue-100{stroke:#dbeafe}.stroke-blue-200{stroke:#bfdbfe}.stroke-blue-300{stroke:#93c5fd}.stroke-blue-400{stroke:#60a5fa}.stroke-blue-50{stroke:#eff6ff}.stroke-blue-500{stroke:#3b82f6}.stroke-blue-600{stroke:#2563eb}.stroke-blue-700{stroke:#1d4ed8}.stroke-blue-800{stroke:#1e40af}.stroke-blue-900{stroke:#1e3a8a}.stroke-blue-950{stroke:#172554}.stroke-cyan-100{stroke:#cffafe}.stroke-cyan-200{stroke:#a5f3fc}.stroke-cyan-300{stroke:#67e8f9}.stroke-cyan-400{stroke:#22d3ee}.stroke-cyan-50{stroke:#ecfeff}.stroke-cyan-500{stroke:#06b6d4}.stroke-cyan-600{stroke:#0891b2}.stroke-cyan-700{stroke:#0e7490}.stroke-cyan-800{stroke:#155e75}.stroke-cyan-900{stroke:#164e63}.stroke-cyan-950{stroke:#083344}.stroke-dark-tremor-background{stroke:#111827}.stroke-dark-tremor-border{stroke:#374151}.stroke-emerald-100{stroke:#d1fae5}.stroke-emerald-200{stroke:#a7f3d0}.stroke-emerald-300{stroke:#6ee7b7}.stroke-emerald-400{stroke:#34d399}.stroke-emerald-50{stroke:#ecfdf5}.stroke-emerald-500{stroke:#10b981}.stroke-emerald-600{stroke:#059669}.stroke-emerald-700{stroke:#047857}.stroke-emerald-800{stroke:#065f46}.stroke-emerald-900{stroke:#064e3b}.stroke-emerald-950{stroke:#022c22}.stroke-fuchsia-100{stroke:#fae8ff}.stroke-fuchsia-200{stroke:#f5d0fe}.stroke-fuchsia-300{stroke:#f0abfc}.stroke-fuchsia-400{stroke:#e879f9}.stroke-fuchsia-50{stroke:#fdf4ff}.stroke-fuchsia-500{stroke:#d946ef}.stroke-fuchsia-600{stroke:#c026d3}.stroke-fuchsia-700{stroke:#a21caf}.stroke-fuchsia-800{stroke:#86198f}.stroke-fuchsia-900{stroke:#701a75}.stroke-fuchsia-950{stroke:#4a044e}.stroke-gray-100{stroke:#f3f4f6}.stroke-gray-200{stroke:#e5e7eb}.stroke-gray-300{stroke:#d1d5db}.stroke-gray-400{stroke:#9ca3af}.stroke-gray-50{stroke:#f9fafb}.stroke-gray-500{stroke:#6b7280}.stroke-gray-600{stroke:#4b5563}.stroke-gray-700{stroke:#374151}.stroke-gray-800{stroke:#1f2937}.stroke-gray-900{stroke:#111827}.stroke-gray-950{stroke:#030712}.stroke-green-100{stroke:#dcfce7}.stroke-green-200{stroke:#bbf7d0}.stroke-green-300{stroke:#86efac}.stroke-green-400{stroke:#4ade80}.stroke-green-50{stroke:#f0fdf4}.stroke-green-500{stroke:#22c55e}.stroke-green-600{stroke:#16a34a}.stroke-green-700{stroke:#15803d}.stroke-green-800{stroke:#166534}.stroke-green-900{stroke:#14532d}.stroke-green-950{stroke:#052e16}.stroke-indigo-100{stroke:#e0e7ff}.stroke-indigo-200{stroke:#c7d2fe}.stroke-indigo-300{stroke:#a5b4fc}.stroke-indigo-400{stroke:#818cf8}.stroke-indigo-50{stroke:#eef2ff}.stroke-indigo-500{stroke:#6366f1}.stroke-indigo-600{stroke:#4f46e5}.stroke-indigo-700{stroke:#4338ca}.stroke-indigo-800{stroke:#3730a3}.stroke-indigo-900{stroke:#312e81}.stroke-indigo-950{stroke:#1e1b4b}.stroke-lime-100{stroke:#ecfccb}.stroke-lime-200{stroke:#d9f99d}.stroke-lime-300{stroke:#bef264}.stroke-lime-400{stroke:#a3e635}.stroke-lime-50{stroke:#f7fee7}.stroke-lime-500{stroke:#84cc16}.stroke-lime-600{stroke:#65a30d}.stroke-lime-700{stroke:#4d7c0f}.stroke-lime-800{stroke:#3f6212}.stroke-lime-900{stroke:#365314}.stroke-lime-950{stroke:#1a2e05}.stroke-neutral-100{stroke:#f5f5f5}.stroke-neutral-200{stroke:#e5e5e5}.stroke-neutral-300{stroke:#d4d4d4}.stroke-neutral-400{stroke:#a3a3a3}.stroke-neutral-50{stroke:#fafafa}.stroke-neutral-500{stroke:#737373}.stroke-neutral-600{stroke:#525252}.stroke-neutral-700{stroke:#404040}.stroke-neutral-800{stroke:#262626}.stroke-neutral-900{stroke:#171717}.stroke-neutral-950{stroke:#0a0a0a}.stroke-orange-100{stroke:#ffedd5}.stroke-orange-200{stroke:#fed7aa}.stroke-orange-300{stroke:#fdba74}.stroke-orange-400{stroke:#fb923c}.stroke-orange-50{stroke:#fff7ed}.stroke-orange-500{stroke:#f97316}.stroke-orange-600{stroke:#ea580c}.stroke-orange-700{stroke:#c2410c}.stroke-orange-800{stroke:#9a3412}.stroke-orange-900{stroke:#7c2d12}.stroke-orange-950{stroke:#431407}.stroke-pink-100{stroke:#fce7f3}.stroke-pink-200{stroke:#fbcfe8}.stroke-pink-300{stroke:#f9a8d4}.stroke-pink-400{stroke:#f472b6}.stroke-pink-50{stroke:#fdf2f8}.stroke-pink-500{stroke:#ec4899}.stroke-pink-600{stroke:#db2777}.stroke-pink-700{stroke:#be185d}.stroke-pink-800{stroke:#9d174d}.stroke-pink-900{stroke:#831843}.stroke-pink-950{stroke:#500724}.stroke-purple-100{stroke:#f3e8ff}.stroke-purple-200{stroke:#e9d5ff}.stroke-purple-300{stroke:#d8b4fe}.stroke-purple-400{stroke:#c084fc}.stroke-purple-50{stroke:#faf5ff}.stroke-purple-500{stroke:#a855f7}.stroke-purple-600{stroke:#9333ea}.stroke-purple-700{stroke:#7e22ce}.stroke-purple-800{stroke:#6b21a8}.stroke-purple-900{stroke:#581c87}.stroke-purple-950{stroke:#3b0764}.stroke-red-100{stroke:#fee2e2}.stroke-red-200{stroke:#fecaca}.stroke-red-300{stroke:#fca5a5}.stroke-red-400{stroke:#f87171}.stroke-red-50{stroke:#fef2f2}.stroke-red-500{stroke:#ef4444}.stroke-red-600{stroke:#dc2626}.stroke-red-700{stroke:#b91c1c}.stroke-red-800{stroke:#991b1b}.stroke-red-900{stroke:#7f1d1d}.stroke-red-950{stroke:#450a0a}.stroke-rose-100{stroke:#ffe4e6}.stroke-rose-200{stroke:#fecdd3}.stroke-rose-300{stroke:#fda4af}.stroke-rose-400{stroke:#fb7185}.stroke-rose-50{stroke:#fff1f2}.stroke-rose-500{stroke:#f43f5e}.stroke-rose-600{stroke:#e11d48}.stroke-rose-700{stroke:#be123c}.stroke-rose-800{stroke:#9f1239}.stroke-rose-900{stroke:#881337}.stroke-rose-950{stroke:#4c0519}.stroke-sky-100{stroke:#e0f2fe}.stroke-sky-200{stroke:#bae6fd}.stroke-sky-300{stroke:#7dd3fc}.stroke-sky-400{stroke:#38bdf8}.stroke-sky-50{stroke:#f0f9ff}.stroke-sky-500{stroke:#0ea5e9}.stroke-sky-600{stroke:#0284c7}.stroke-sky-700{stroke:#0369a1}.stroke-sky-800{stroke:#075985}.stroke-sky-900{stroke:#0c4a6e}.stroke-sky-950{stroke:#082f49}.stroke-slate-100{stroke:#f1f5f9}.stroke-slate-200{stroke:#e2e8f0}.stroke-slate-300{stroke:#cbd5e1}.stroke-slate-400{stroke:#94a3b8}.stroke-slate-50{stroke:#f8fafc}.stroke-slate-500{stroke:#64748b}.stroke-slate-600{stroke:#475569}.stroke-slate-700{stroke:#334155}.stroke-slate-800{stroke:#1e293b}.stroke-slate-900{stroke:#0f172a}.stroke-slate-950{stroke:#020617}.stroke-stone-100{stroke:#f5f5f4}.stroke-stone-200{stroke:#e7e5e4}.stroke-stone-300{stroke:#d6d3d1}.stroke-stone-400{stroke:#a8a29e}.stroke-stone-50{stroke:#fafaf9}.stroke-stone-500{stroke:#78716c}.stroke-stone-600{stroke:#57534e}.stroke-stone-700{stroke:#44403c}.stroke-stone-800{stroke:#292524}.stroke-stone-900{stroke:#1c1917}.stroke-stone-950{stroke:#0c0a09}.stroke-teal-100{stroke:#ccfbf1}.stroke-teal-200{stroke:#99f6e4}.stroke-teal-300{stroke:#5eead4}.stroke-teal-400{stroke:#2dd4bf}.stroke-teal-50{stroke:#f0fdfa}.stroke-teal-500{stroke:#14b8a6}.stroke-teal-600{stroke:#0d9488}.stroke-teal-700{stroke:#0f766e}.stroke-teal-800{stroke:#115e59}.stroke-teal-900{stroke:#134e4a}.stroke-teal-950{stroke:#042f2e}.stroke-tremor-background{stroke:#fff}.stroke-tremor-border{stroke:#e5e7eb}.stroke-tremor-brand{stroke:#6366f1}.stroke-tremor-brand-muted\/50{stroke:rgba(134,136,239,.5)}.stroke-violet-100{stroke:#ede9fe}.stroke-violet-200{stroke:#ddd6fe}.stroke-violet-300{stroke:#c4b5fd}.stroke-violet-400{stroke:#a78bfa}.stroke-violet-50{stroke:#f5f3ff}.stroke-violet-500{stroke:#8b5cf6}.stroke-violet-600{stroke:#7c3aed}.stroke-violet-700{stroke:#6d28d9}.stroke-violet-800{stroke:#5b21b6}.stroke-violet-900{stroke:#4c1d95}.stroke-violet-950{stroke:#2e1065}.stroke-yellow-100{stroke:#fef9c3}.stroke-yellow-200{stroke:#fef08a}.stroke-yellow-300{stroke:#fde047}.stroke-yellow-400{stroke:#facc15}.stroke-yellow-50{stroke:#fefce8}.stroke-yellow-500{stroke:#eab308}.stroke-yellow-600{stroke:#ca8a04}.stroke-yellow-700{stroke:#a16207}.stroke-yellow-800{stroke:#854d0e}.stroke-yellow-900{stroke:#713f12}.stroke-yellow-950{stroke:#422006}.stroke-zinc-100{stroke:#f4f4f5}.stroke-zinc-200{stroke:#e4e4e7}.stroke-zinc-300{stroke:#d4d4d8}.stroke-zinc-400{stroke:#a1a1aa}.stroke-zinc-50{stroke:#fafafa}.stroke-zinc-500{stroke:#71717a}.stroke-zinc-600{stroke:#52525b}.stroke-zinc-700{stroke:#3f3f46}.stroke-zinc-800{stroke:#27272a}.stroke-zinc-900{stroke:#18181b}.stroke-zinc-950{stroke:#09090b}.stroke-1{stroke-width:1}.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-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.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-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm,.text-tremor-default{font-size:.875rem;line-height:1.25rem}.text-tremor-label{font-size:.75rem;line-height:.4rem}.text-tremor-metric{font-size:1.875rem;line-height:2.25rem}.text-tremor-title{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.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-6{line-height:1.5rem}.text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-dark-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-dark-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-dark-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-dark-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-dark-tremor-content-subtle{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-inherit{color:inherit}.text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-tremor-content-subtle{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.accent-dark-tremor-brand,.accent-tremor-brand{accent-color:#6366f1}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow,.shadow-dark-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-dark-tremor-card,.shadow-dark-tremor-input{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-dark-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-tremor-card,.shadow-tremor-dropdown{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-tremor-dropdown{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-input,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-tremor-brand{outline-color:#6366f1}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--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)}.ring-2{--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)}.ring-amber-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 243 199/var(--tw-ring-opacity))}.ring-amber-200{--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity))}.ring-amber-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity))}.ring-amber-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity))}.ring-amber-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 251 235/var(--tw-ring-opacity))}.ring-amber-500{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.ring-amber-600{--tw-ring-opacity:1;--tw-ring-color:rgb(217 119 6/var(--tw-ring-opacity))}.ring-amber-700{--tw-ring-opacity:1;--tw-ring-color:rgb(180 83 9/var(--tw-ring-opacity))}.ring-amber-800{--tw-ring-opacity:1;--tw-ring-color:rgb(146 64 14/var(--tw-ring-opacity))}.ring-amber-900{--tw-ring-opacity:1;--tw-ring-color:rgb(120 53 15/var(--tw-ring-opacity))}.ring-amber-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 26 3/var(--tw-ring-opacity))}.ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity))}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgb(191 219 254/var(--tw-ring-opacity))}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity))}.ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgb(239 246 255/var(--tw-ring-opacity))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity))}.ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgb(29 78 216/var(--tw-ring-opacity))}.ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 64 175/var(--tw-ring-opacity))}.ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgb(30 58 138/var(--tw-ring-opacity))}.ring-blue-950{--tw-ring-opacity:1;--tw-ring-color:rgb(23 37 84/var(--tw-ring-opacity))}.ring-cyan-100{--tw-ring-opacity:1;--tw-ring-color:rgb(207 250 254/var(--tw-ring-opacity))}.ring-cyan-200{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity))}.ring-cyan-300{--tw-ring-opacity:1;--tw-ring-color:rgb(103 232 249/var(--tw-ring-opacity))}.ring-cyan-400{--tw-ring-opacity:1;--tw-ring-color:rgb(34 211 238/var(--tw-ring-opacity))}.ring-cyan-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 254 255/var(--tw-ring-opacity))}.ring-cyan-500{--tw-ring-opacity:1;--tw-ring-color:rgb(6 182 212/var(--tw-ring-opacity))}.ring-cyan-600{--tw-ring-opacity:1;--tw-ring-color:rgb(8 145 178/var(--tw-ring-opacity))}.ring-cyan-700{--tw-ring-opacity:1;--tw-ring-color:rgb(14 116 144/var(--tw-ring-opacity))}.ring-cyan-800{--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity))}.ring-cyan-900{--tw-ring-opacity:1;--tw-ring-color:rgb(22 78 99/var(--tw-ring-opacity))}.ring-cyan-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 51 68/var(--tw-ring-opacity))}.ring-dark-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-emerald-100{--tw-ring-opacity:1;--tw-ring-color:rgb(209 250 229/var(--tw-ring-opacity))}.ring-emerald-200{--tw-ring-opacity:1;--tw-ring-color:rgb(167 243 208/var(--tw-ring-opacity))}.ring-emerald-300{--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity))}.ring-emerald-400{--tw-ring-opacity:1;--tw-ring-color:rgb(52 211 153/var(--tw-ring-opacity))}.ring-emerald-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 253 245/var(--tw-ring-opacity))}.ring-emerald-500{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity))}.ring-emerald-600{--tw-ring-opacity:1;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))}.ring-emerald-700{--tw-ring-opacity:1;--tw-ring-color:rgb(4 120 87/var(--tw-ring-opacity))}.ring-emerald-800{--tw-ring-opacity:1;--tw-ring-color:rgb(6 95 70/var(--tw-ring-opacity))}.ring-emerald-900{--tw-ring-opacity:1;--tw-ring-color:rgb(6 78 59/var(--tw-ring-opacity))}.ring-emerald-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 44 34/var(--tw-ring-opacity))}.ring-fuchsia-100{--tw-ring-opacity:1;--tw-ring-color:rgb(250 232 255/var(--tw-ring-opacity))}.ring-fuchsia-200{--tw-ring-opacity:1;--tw-ring-color:rgb(245 208 254/var(--tw-ring-opacity))}.ring-fuchsia-300{--tw-ring-opacity:1;--tw-ring-color:rgb(240 171 252/var(--tw-ring-opacity))}.ring-fuchsia-400{--tw-ring-opacity:1;--tw-ring-color:rgb(232 121 249/var(--tw-ring-opacity))}.ring-fuchsia-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 244 255/var(--tw-ring-opacity))}.ring-fuchsia-500{--tw-ring-opacity:1;--tw-ring-color:rgb(217 70 239/var(--tw-ring-opacity))}.ring-fuchsia-600{--tw-ring-opacity:1;--tw-ring-color:rgb(192 38 211/var(--tw-ring-opacity))}.ring-fuchsia-700{--tw-ring-opacity:1;--tw-ring-color:rgb(162 28 175/var(--tw-ring-opacity))}.ring-fuchsia-800{--tw-ring-opacity:1;--tw-ring-color:rgb(134 25 143/var(--tw-ring-opacity))}.ring-fuchsia-900{--tw-ring-opacity:1;--tw-ring-color:rgb(112 26 117/var(--tw-ring-opacity))}.ring-fuchsia-950{--tw-ring-opacity:1;--tw-ring-color:rgb(74 4 78/var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 244 246/var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgb(249 250 251/var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81/var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgb(17 24 39/var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgb(3 7 18/var(--tw-ring-opacity))}.ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgb(220 252 231/var(--tw-ring-opacity))}.ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgb(187 247 208/var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity))}.ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgb(74 222 128/var(--tw-ring-opacity))}.ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 244/var(--tw-ring-opacity))}.ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgb(22 163 74/var(--tw-ring-opacity))}.ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgb(21 128 61/var(--tw-ring-opacity))}.ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgb(22 101 52/var(--tw-ring-opacity))}.ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgb(20 83 45/var(--tw-ring-opacity))}.ring-green-950{--tw-ring-opacity:1;--tw-ring-color:rgb(5 46 22/var(--tw-ring-opacity))}.ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 231 255/var(--tw-ring-opacity))}.ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgb(199 210 254/var(--tw-ring-opacity))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity))}.ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgb(129 140 248/var(--tw-ring-opacity))}.ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgb(238 242 255/var(--tw-ring-opacity))}.ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity))}.ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgb(67 56 202/var(--tw-ring-opacity))}.ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgb(55 48 163/var(--tw-ring-opacity))}.ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgb(49 46 129/var(--tw-ring-opacity))}.ring-indigo-950{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}.ring-lime-100{--tw-ring-opacity:1;--tw-ring-color:rgb(236 252 203/var(--tw-ring-opacity))}.ring-lime-200{--tw-ring-opacity:1;--tw-ring-color:rgb(217 249 157/var(--tw-ring-opacity))}.ring-lime-300{--tw-ring-opacity:1;--tw-ring-color:rgb(190 242 100/var(--tw-ring-opacity))}.ring-lime-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 230 53/var(--tw-ring-opacity))}.ring-lime-50{--tw-ring-opacity:1;--tw-ring-color:rgb(247 254 231/var(--tw-ring-opacity))}.ring-lime-500{--tw-ring-opacity:1;--tw-ring-color:rgb(132 204 22/var(--tw-ring-opacity))}.ring-lime-600{--tw-ring-opacity:1;--tw-ring-color:rgb(101 163 13/var(--tw-ring-opacity))}.ring-lime-700{--tw-ring-opacity:1;--tw-ring-color:rgb(77 124 15/var(--tw-ring-opacity))}.ring-lime-800{--tw-ring-opacity:1;--tw-ring-color:rgb(63 98 18/var(--tw-ring-opacity))}.ring-lime-900{--tw-ring-opacity:1;--tw-ring-color:rgb(54 83 20/var(--tw-ring-opacity))}.ring-lime-950{--tw-ring-opacity:1;--tw-ring-color:rgb(26 46 5/var(--tw-ring-opacity))}.ring-neutral-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 245/var(--tw-ring-opacity))}.ring-neutral-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 229 229/var(--tw-ring-opacity))}.ring-neutral-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 212/var(--tw-ring-opacity))}.ring-neutral-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 163 163/var(--tw-ring-opacity))}.ring-neutral-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-neutral-500{--tw-ring-opacity:1;--tw-ring-color:rgb(115 115 115/var(--tw-ring-opacity))}.ring-neutral-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 82/var(--tw-ring-opacity))}.ring-neutral-700{--tw-ring-opacity:1;--tw-ring-color:rgb(64 64 64/var(--tw-ring-opacity))}.ring-neutral-800{--tw-ring-opacity:1;--tw-ring-color:rgb(38 38 38/var(--tw-ring-opacity))}.ring-neutral-900{--tw-ring-opacity:1;--tw-ring-color:rgb(23 23 23/var(--tw-ring-opacity))}.ring-neutral-950{--tw-ring-opacity:1;--tw-ring-color:rgb(10 10 10/var(--tw-ring-opacity))}.ring-orange-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 237 213/var(--tw-ring-opacity))}.ring-orange-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 215 170/var(--tw-ring-opacity))}.ring-orange-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 186 116/var(--tw-ring-opacity))}.ring-orange-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 146 60/var(--tw-ring-opacity))}.ring-orange-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 247 237/var(--tw-ring-opacity))}.ring-orange-500{--tw-ring-opacity:1;--tw-ring-color:rgb(249 115 22/var(--tw-ring-opacity))}.ring-orange-600{--tw-ring-opacity:1;--tw-ring-color:rgb(234 88 12/var(--tw-ring-opacity))}.ring-orange-700{--tw-ring-opacity:1;--tw-ring-color:rgb(194 65 12/var(--tw-ring-opacity))}.ring-orange-800{--tw-ring-opacity:1;--tw-ring-color:rgb(154 52 18/var(--tw-ring-opacity))}.ring-orange-900{--tw-ring-opacity:1;--tw-ring-color:rgb(124 45 18/var(--tw-ring-opacity))}.ring-orange-950{--tw-ring-opacity:1;--tw-ring-color:rgb(67 20 7/var(--tw-ring-opacity))}.ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgb(252 231 243/var(--tw-ring-opacity))}.ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgb(251 207 232/var(--tw-ring-opacity))}.ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgb(249 168 212/var(--tw-ring-opacity))}.ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgb(244 114 182/var(--tw-ring-opacity))}.ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 242 248/var(--tw-ring-opacity))}.ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgb(236 72 153/var(--tw-ring-opacity))}.ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgb(219 39 119/var(--tw-ring-opacity))}.ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 24 93/var(--tw-ring-opacity))}.ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgb(157 23 77/var(--tw-ring-opacity))}.ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgb(131 24 67/var(--tw-ring-opacity))}.ring-pink-950{--tw-ring-opacity:1;--tw-ring-color:rgb(80 7 36/var(--tw-ring-opacity))}.ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 232 255/var(--tw-ring-opacity))}.ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgb(233 213 255/var(--tw-ring-opacity))}.ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgb(216 180 254/var(--tw-ring-opacity))}.ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity))}.ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 245 255/var(--tw-ring-opacity))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity))}.ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgb(147 51 234/var(--tw-ring-opacity))}.ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgb(126 34 206/var(--tw-ring-opacity))}.ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgb(107 33 168/var(--tw-ring-opacity))}.ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgb(88 28 135/var(--tw-ring-opacity))}.ring-purple-950{--tw-ring-opacity:1;--tw-ring-color:rgb(59 7 100/var(--tw-ring-opacity))}.ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 226 226/var(--tw-ring-opacity))}.ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 202 202/var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity))}.ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgb(248 113 113/var(--tw-ring-opacity))}.ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 242 242/var(--tw-ring-opacity))}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgb(185 28 28/var(--tw-ring-opacity))}.ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgb(153 27 27/var(--tw-ring-opacity))}.ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgb(127 29 29/var(--tw-ring-opacity))}.ring-red-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 10 10/var(--tw-ring-opacity))}.ring-rose-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 228 230/var(--tw-ring-opacity))}.ring-rose-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 205 211/var(--tw-ring-opacity))}.ring-rose-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 164 175/var(--tw-ring-opacity))}.ring-rose-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 113 133/var(--tw-ring-opacity))}.ring-rose-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 241 242/var(--tw-ring-opacity))}.ring-rose-500{--tw-ring-opacity:1;--tw-ring-color:rgb(244 63 94/var(--tw-ring-opacity))}.ring-rose-600{--tw-ring-opacity:1;--tw-ring-color:rgb(225 29 72/var(--tw-ring-opacity))}.ring-rose-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 18 60/var(--tw-ring-opacity))}.ring-rose-800{--tw-ring-opacity:1;--tw-ring-color:rgb(159 18 57/var(--tw-ring-opacity))}.ring-rose-900{--tw-ring-opacity:1;--tw-ring-color:rgb(136 19 55/var(--tw-ring-opacity))}.ring-rose-950{--tw-ring-opacity:1;--tw-ring-color:rgb(76 5 25/var(--tw-ring-opacity))}.ring-sky-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 242 254/var(--tw-ring-opacity))}.ring-sky-200{--tw-ring-opacity:1;--tw-ring-color:rgb(186 230 253/var(--tw-ring-opacity))}.ring-sky-300{--tw-ring-opacity:1;--tw-ring-color:rgb(125 211 252/var(--tw-ring-opacity))}.ring-sky-400{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.ring-sky-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 249 255/var(--tw-ring-opacity))}.ring-sky-500{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.ring-sky-600{--tw-ring-opacity:1;--tw-ring-color:rgb(2 132 199/var(--tw-ring-opacity))}.ring-sky-700{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.ring-sky-800{--tw-ring-opacity:1;--tw-ring-color:rgb(7 89 133/var(--tw-ring-opacity))}.ring-sky-900{--tw-ring-opacity:1;--tw-ring-color:rgb(12 74 110/var(--tw-ring-opacity))}.ring-sky-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 47 73/var(--tw-ring-opacity))}.ring-slate-100{--tw-ring-opacity:1;--tw-ring-color:rgb(241 245 249/var(--tw-ring-opacity))}.ring-slate-200{--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity))}.ring-slate-300{--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity))}.ring-slate-400{--tw-ring-opacity:1;--tw-ring-color:rgb(148 163 184/var(--tw-ring-opacity))}.ring-slate-50{--tw-ring-opacity:1;--tw-ring-color:rgb(248 250 252/var(--tw-ring-opacity))}.ring-slate-500{--tw-ring-opacity:1;--tw-ring-color:rgb(100 116 139/var(--tw-ring-opacity))}.ring-slate-600{--tw-ring-opacity:1;--tw-ring-color:rgb(71 85 105/var(--tw-ring-opacity))}.ring-slate-700{--tw-ring-opacity:1;--tw-ring-color:rgb(51 65 85/var(--tw-ring-opacity))}.ring-slate-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 41 59/var(--tw-ring-opacity))}.ring-slate-900{--tw-ring-opacity:1;--tw-ring-color:rgb(15 23 42/var(--tw-ring-opacity))}.ring-slate-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 6 23/var(--tw-ring-opacity))}.ring-stone-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 244/var(--tw-ring-opacity))}.ring-stone-200{--tw-ring-opacity:1;--tw-ring-color:rgb(231 229 228/var(--tw-ring-opacity))}.ring-stone-300{--tw-ring-opacity:1;--tw-ring-color:rgb(214 211 209/var(--tw-ring-opacity))}.ring-stone-400{--tw-ring-opacity:1;--tw-ring-color:rgb(168 162 158/var(--tw-ring-opacity))}.ring-stone-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 249/var(--tw-ring-opacity))}.ring-stone-500{--tw-ring-opacity:1;--tw-ring-color:rgb(120 113 108/var(--tw-ring-opacity))}.ring-stone-600{--tw-ring-opacity:1;--tw-ring-color:rgb(87 83 78/var(--tw-ring-opacity))}.ring-stone-700{--tw-ring-opacity:1;--tw-ring-color:rgb(68 64 60/var(--tw-ring-opacity))}.ring-stone-800{--tw-ring-opacity:1;--tw-ring-color:rgb(41 37 36/var(--tw-ring-opacity))}.ring-stone-900{--tw-ring-opacity:1;--tw-ring-color:rgb(28 25 23/var(--tw-ring-opacity))}.ring-stone-950{--tw-ring-opacity:1;--tw-ring-color:rgb(12 10 9/var(--tw-ring-opacity))}.ring-teal-100{--tw-ring-opacity:1;--tw-ring-color:rgb(204 251 241/var(--tw-ring-opacity))}.ring-teal-200{--tw-ring-opacity:1;--tw-ring-color:rgb(153 246 228/var(--tw-ring-opacity))}.ring-teal-300{--tw-ring-opacity:1;--tw-ring-color:rgb(94 234 212/var(--tw-ring-opacity))}.ring-teal-400{--tw-ring-opacity:1;--tw-ring-color:rgb(45 212 191/var(--tw-ring-opacity))}.ring-teal-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 250/var(--tw-ring-opacity))}.ring-teal-500{--tw-ring-opacity:1;--tw-ring-color:rgb(20 184 166/var(--tw-ring-opacity))}.ring-teal-600{--tw-ring-opacity:1;--tw-ring-color:rgb(13 148 136/var(--tw-ring-opacity))}.ring-teal-700{--tw-ring-opacity:1;--tw-ring-color:rgb(15 118 110/var(--tw-ring-opacity))}.ring-teal-800{--tw-ring-opacity:1;--tw-ring-color:rgb(17 94 89/var(--tw-ring-opacity))}.ring-teal-900{--tw-ring-opacity:1;--tw-ring-color:rgb(19 78 74/var(--tw-ring-opacity))}.ring-teal-950{--tw-ring-opacity:1;--tw-ring-color:rgb(4 47 46/var(--tw-ring-opacity))}.ring-tremor-brand-inverted{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-tremor-brand-muted{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.ring-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-violet-100{--tw-ring-opacity:1;--tw-ring-color:rgb(237 233 254/var(--tw-ring-opacity))}.ring-violet-200{--tw-ring-opacity:1;--tw-ring-color:rgb(221 214 254/var(--tw-ring-opacity))}.ring-violet-300{--tw-ring-opacity:1;--tw-ring-color:rgb(196 181 253/var(--tw-ring-opacity))}.ring-violet-400{--tw-ring-opacity:1;--tw-ring-color:rgb(167 139 250/var(--tw-ring-opacity))}.ring-violet-50{--tw-ring-opacity:1;--tw-ring-color:rgb(245 243 255/var(--tw-ring-opacity))}.ring-violet-500{--tw-ring-opacity:1;--tw-ring-color:rgb(139 92 246/var(--tw-ring-opacity))}.ring-violet-600{--tw-ring-opacity:1;--tw-ring-color:rgb(124 58 237/var(--tw-ring-opacity))}.ring-violet-700{--tw-ring-opacity:1;--tw-ring-color:rgb(109 40 217/var(--tw-ring-opacity))}.ring-violet-800{--tw-ring-opacity:1;--tw-ring-color:rgb(91 33 182/var(--tw-ring-opacity))}.ring-violet-900{--tw-ring-opacity:1;--tw-ring-color:rgb(76 29 149/var(--tw-ring-opacity))}.ring-violet-950{--tw-ring-opacity:1;--tw-ring-color:rgb(46 16 101/var(--tw-ring-opacity))}.ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 249 195/var(--tw-ring-opacity))}.ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 240 138/var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 224 71/var(--tw-ring-opacity))}.ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgb(250 204 21/var(--tw-ring-opacity))}.ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 252 232/var(--tw-ring-opacity))}.ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgb(234 179 8/var(--tw-ring-opacity))}.ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgb(202 138 4/var(--tw-ring-opacity))}.ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgb(161 98 7/var(--tw-ring-opacity))}.ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgb(133 77 14/var(--tw-ring-opacity))}.ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgb(113 63 18/var(--tw-ring-opacity))}.ring-yellow-950{--tw-ring-opacity:1;--tw-ring-color:rgb(66 32 6/var(--tw-ring-opacity))}.ring-zinc-100{--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity))}.ring-zinc-200{--tw-ring-opacity:1;--tw-ring-color:rgb(228 228 231/var(--tw-ring-opacity))}.ring-zinc-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 216/var(--tw-ring-opacity))}.ring-zinc-400{--tw-ring-opacity:1;--tw-ring-color:rgb(161 161 170/var(--tw-ring-opacity))}.ring-zinc-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-zinc-500{--tw-ring-opacity:1;--tw-ring-color:rgb(113 113 122/var(--tw-ring-opacity))}.ring-zinc-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 91/var(--tw-ring-opacity))}.ring-zinc-700{--tw-ring-opacity:1;--tw-ring-color:rgb(63 63 70/var(--tw-ring-opacity))}.ring-zinc-800{--tw-ring-opacity:1;--tw-ring-color:rgb(39 39 42/var(--tw-ring-opacity))}.ring-zinc-900{--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity))}.ring-zinc-950{--tw-ring-opacity:1;--tw-ring-color:rgb(9 9 11/var(--tw-ring-opacity))}.ring-opacity-40{--tw-ring-opacity:0.4}.blur{--tw-blur:blur(8px)}.blur,.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.\[scrollbar-width\:none\]{scrollbar-width:none}:root{--foreground-rgb:0,0,0;--background-start-rgb:255,255,255;--background-end-rgb:255,255,255}body{color:rgb(var(--foreground-rgb));background:linear-gradient(to bottom,transparent,rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb))}.placeholder\:text-tremor-content::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.first\:rounded-l-\[4px\]:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.last\:rounded-r-\[4px\]:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.focus-within\:relative:focus-within{position:relative}.hover\:border-b-2:hover{border-bottom-width:2px}.hover\:border-amber-100:hover{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.hover\:border-amber-200:hover{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.hover\:border-amber-300:hover{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.hover\:border-amber-400:hover{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.hover\:border-amber-50:hover{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.hover\:border-amber-500:hover{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.hover\:border-amber-600:hover{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.hover\:border-amber-700:hover{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.hover\:border-amber-800:hover{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.hover\:border-amber-900:hover{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.hover\:border-amber-950:hover{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.hover\:border-blue-950:hover{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.hover\:border-cyan-100:hover{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.hover\:border-cyan-200:hover{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.hover\:border-cyan-300:hover{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.hover\:border-cyan-400:hover{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.hover\:border-cyan-50:hover{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.hover\:border-cyan-500:hover{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.hover\:border-cyan-600:hover{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.hover\:border-cyan-700:hover{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.hover\:border-cyan-800:hover{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.hover\:border-cyan-900:hover{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.hover\:border-cyan-950:hover{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.hover\:border-emerald-100:hover{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.hover\:border-emerald-200:hover{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.hover\:border-emerald-300:hover{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.hover\:border-emerald-400:hover{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.hover\:border-emerald-50:hover{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.hover\:border-emerald-500:hover{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.hover\:border-emerald-600:hover{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.hover\:border-emerald-700:hover{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.hover\:border-emerald-800:hover{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.hover\:border-emerald-900:hover{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.hover\:border-emerald-950:hover{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.hover\:border-fuchsia-100:hover{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.hover\:border-fuchsia-200:hover{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.hover\:border-fuchsia-300:hover{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.hover\:border-fuchsia-400:hover{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.hover\:border-fuchsia-50:hover{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.hover\:border-fuchsia-500:hover{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.hover\:border-fuchsia-600:hover{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.hover\:border-fuchsia-700:hover{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.hover\:border-fuchsia-800:hover{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.hover\:border-fuchsia-900:hover{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.hover\:border-fuchsia-950:hover{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.hover\:border-gray-950:hover{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.hover\:border-green-950:hover{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.hover\:border-indigo-950:hover{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.hover\:border-lime-100:hover{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.hover\:border-lime-200:hover{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.hover\:border-lime-300:hover{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.hover\:border-lime-400:hover{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.hover\:border-lime-50:hover{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.hover\:border-lime-500:hover{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.hover\:border-lime-600:hover{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.hover\:border-lime-700:hover{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.hover\:border-lime-800:hover{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.hover\:border-lime-900:hover{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.hover\:border-lime-950:hover{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.hover\:border-neutral-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.hover\:border-neutral-200:hover{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.hover\:border-neutral-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.hover\:border-neutral-400:hover{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.hover\:border-neutral-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-neutral-500:hover{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.hover\:border-neutral-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.hover\:border-neutral-700:hover{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.hover\:border-neutral-800:hover{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.hover\:border-neutral-900:hover{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.hover\:border-neutral-950:hover{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.hover\:border-orange-100:hover{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.hover\:border-orange-200:hover{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.hover\:border-orange-300:hover{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.hover\:border-orange-400:hover{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.hover\:border-orange-50:hover{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.hover\:border-orange-600:hover{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.hover\:border-orange-700:hover{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.hover\:border-orange-800:hover{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.hover\:border-orange-900:hover{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.hover\:border-orange-950:hover{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.hover\:border-pink-950:hover{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.hover\:border-purple-950:hover{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.hover\:border-red-950:hover{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.hover\:border-rose-100:hover{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.hover\:border-rose-200:hover{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.hover\:border-rose-300:hover{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.hover\:border-rose-400:hover{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.hover\:border-rose-50:hover{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.hover\:border-rose-500:hover{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.hover\:border-rose-600:hover{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.hover\:border-rose-700:hover{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.hover\:border-rose-800:hover{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.hover\:border-rose-900:hover{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.hover\:border-rose-950:hover{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.hover\:border-sky-100:hover{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.hover\:border-sky-200:hover{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.hover\:border-sky-300:hover{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.hover\:border-sky-400:hover{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.hover\:border-sky-50:hover{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.hover\:border-sky-500:hover{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.hover\:border-sky-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-sky-700:hover{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.hover\:border-sky-800:hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.hover\:border-sky-900:hover{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.hover\:border-sky-950:hover{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.hover\:border-slate-100:hover{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.hover\:border-slate-200:hover{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.hover\:border-slate-300:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.hover\:border-slate-400:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.hover\:border-slate-50:hover{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.hover\:border-slate-500:hover{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.hover\:border-slate-600:hover{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.hover\:border-slate-700:hover{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.hover\:border-slate-800:hover{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.hover\:border-slate-900:hover{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.hover\:border-slate-950:hover{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.hover\:border-stone-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.hover\:border-stone-200:hover{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.hover\:border-stone-300:hover{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.hover\:border-stone-400:hover{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.hover\:border-stone-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.hover\:border-stone-500:hover{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.hover\:border-stone-600:hover{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.hover\:border-stone-700:hover{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.hover\:border-stone-800:hover{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.hover\:border-stone-900:hover{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.hover\:border-stone-950:hover{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.hover\:border-teal-100:hover{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.hover\:border-teal-200:hover{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.hover\:border-teal-300:hover{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.hover\:border-teal-400:hover{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.hover\:border-teal-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.hover\:border-teal-500:hover{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.hover\:border-teal-600:hover{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.hover\:border-teal-700:hover{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.hover\:border-teal-800:hover{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.hover\:border-teal-900:hover{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.hover\:border-teal-950:hover{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.hover\:border-tremor-brand-emphasis:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-tremor-content:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-violet-100:hover{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.hover\:border-violet-200:hover{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.hover\:border-violet-300:hover{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.hover\:border-violet-400:hover{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.hover\:border-violet-50:hover{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.hover\:border-violet-500:hover{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.hover\:border-violet-600:hover{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.hover\:border-violet-700:hover{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.hover\:border-violet-800:hover{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.hover\:border-violet-900:hover{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.hover\:border-violet-950:hover{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.hover\:border-yellow-950:hover{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.hover\:border-zinc-100:hover{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.hover\:border-zinc-200:hover{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.hover\:border-zinc-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:border-zinc-400:hover{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.hover\:border-zinc-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-zinc-500:hover{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.hover\:border-zinc-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.hover\:border-zinc-700:hover{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.hover\:border-zinc-800:hover{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.hover\:border-zinc-900:hover{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.hover\:border-zinc-950:hover{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.hover\:bg-amber-100:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.hover\:bg-amber-200:hover{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.hover\:bg-amber-300:hover{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.hover\:bg-amber-400:hover{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.hover\:bg-amber-50:hover{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.hover\:bg-amber-700:hover{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.hover\:bg-amber-800:hover{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.hover\:bg-amber-900:hover{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.hover\:bg-amber-950:hover{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.hover\:bg-blue-950:hover{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.hover\:bg-cyan-100:hover{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.hover\:bg-cyan-200:hover{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.hover\:bg-cyan-300:hover{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.hover\:bg-cyan-400:hover{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.hover\:bg-cyan-50:hover{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.hover\:bg-cyan-500:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.hover\:bg-cyan-600:hover{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.hover\:bg-cyan-700:hover{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.hover\:bg-cyan-800:hover{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.hover\:bg-cyan-900:hover{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.hover\:bg-cyan-950:hover{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.hover\:bg-emerald-100:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.hover\:bg-emerald-200:hover{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.hover\:bg-emerald-300:hover{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.hover\:bg-emerald-400:hover{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.hover\:bg-emerald-800:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.hover\:bg-emerald-900:hover{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.hover\:bg-emerald-950:hover{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.hover\:bg-fuchsia-100:hover{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-200:hover{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.hover\:bg-fuchsia-300:hover{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.hover\:bg-fuchsia-400:hover{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.hover\:bg-fuchsia-50:hover{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-500:hover{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.hover\:bg-fuchsia-600:hover{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.hover\:bg-fuchsia-700:hover{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.hover\:bg-fuchsia-800:hover{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.hover\:bg-fuchsia-900:hover{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.hover\:bg-fuchsia-950:hover{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.hover\:bg-gray-950:hover{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.hover\:bg-green-950:hover{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.hover\:bg-indigo-950:hover{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.hover\:bg-lime-100:hover{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.hover\:bg-lime-200:hover{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.hover\:bg-lime-300:hover{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.hover\:bg-lime-400:hover{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.hover\:bg-lime-50:hover{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.hover\:bg-lime-500:hover{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.hover\:bg-lime-600:hover{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.hover\:bg-lime-700:hover{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.hover\:bg-lime-800:hover{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.hover\:bg-lime-900:hover{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.hover\:bg-lime-950:hover{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.hover\:bg-neutral-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.hover\:bg-neutral-200:hover{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.hover\:bg-neutral-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.hover\:bg-neutral-400:hover{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.hover\:bg-neutral-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-neutral-500:hover{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.hover\:bg-neutral-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.hover\:bg-neutral-700:hover{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.hover\:bg-neutral-800:hover{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.hover\:bg-neutral-900:hover{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.hover\:bg-neutral-950:hover{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.hover\:bg-orange-100:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.hover\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.hover\:bg-orange-300:hover{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.hover\:bg-orange-400:hover{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.hover\:bg-orange-50:hover{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.hover\:bg-orange-800:hover{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.hover\:bg-orange-900:hover{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.hover\:bg-orange-950:hover{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.hover\:bg-pink-950:hover{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.hover\:bg-purple-950:hover{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.hover\:bg-red-950:hover{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.hover\:bg-rose-100:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.hover\:bg-rose-200:hover{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.hover\:bg-rose-300:hover{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.hover\:bg-rose-400:hover{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.hover\:bg-rose-50:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.hover\:bg-rose-500:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.hover\:bg-rose-600:hover{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.hover\:bg-rose-700:hover{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.hover\:bg-rose-800:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.hover\:bg-rose-900:hover{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.hover\:bg-rose-950:hover{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.hover\:bg-sky-100:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.hover\:bg-sky-200:hover{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.hover\:bg-sky-300:hover{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.hover\:bg-sky-400:hover{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.hover\:bg-sky-50:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.hover\:bg-sky-500:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.hover\:bg-sky-600:hover{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.hover\:bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.hover\:bg-sky-800:hover{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.hover\:bg-sky-900:hover{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.hover\:bg-sky-950:hover{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-slate-300:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.hover\:bg-slate-400:hover{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\:bg-slate-500:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.hover\:bg-slate-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.hover\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.hover\:bg-slate-900:hover{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.hover\:bg-slate-950:hover{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.hover\:bg-stone-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.hover\:bg-stone-200:hover{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.hover\:bg-stone-300:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.hover\:bg-stone-400:hover{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.hover\:bg-stone-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.hover\:bg-stone-500:hover{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.hover\:bg-stone-600:hover{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.hover\:bg-stone-700:hover{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.hover\:bg-stone-800:hover{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.hover\:bg-stone-900:hover{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.hover\:bg-stone-950:hover{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.hover\:bg-teal-100:hover{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.hover\:bg-teal-200:hover{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.hover\:bg-teal-300:hover{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.hover\:bg-teal-400:hover{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.hover\:bg-teal-500:hover{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.hover\:bg-teal-700:hover{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.hover\:bg-teal-800:hover{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.hover\:bg-teal-900:hover{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.hover\:bg-teal-950:hover{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.hover\:bg-tremor-background-muted:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-tremor-background-subtle:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-emphasis:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-faint:hover{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.hover\:bg-violet-100:hover{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.hover\:bg-violet-200:hover{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.hover\:bg-violet-300:hover{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.hover\:bg-violet-400:hover{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.hover\:bg-violet-50:hover{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.hover\:bg-violet-500:hover{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.hover\:bg-violet-600:hover{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.hover\:bg-violet-800:hover{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.hover\:bg-violet-900:hover{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.hover\:bg-violet-950:hover{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.hover\:bg-yellow-950:hover{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.hover\:bg-zinc-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.hover\:bg-zinc-200:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.hover\:bg-zinc-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.hover\:bg-zinc-400:hover{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-zinc-500:hover{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.hover\:bg-zinc-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.hover\:bg-zinc-700:hover{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.hover\:bg-zinc-800:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.hover\:bg-zinc-900:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.hover\:bg-zinc-950:hover{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.hover\:text-amber-100:hover{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.hover\:text-amber-200:hover{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.hover\:text-amber-300:hover{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.hover\:text-amber-400:hover{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.hover\:text-amber-50:hover{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.hover\:text-amber-500:hover{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.hover\:text-amber-600:hover{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.hover\:text-amber-700:hover{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.hover\:text-amber-800:hover{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.hover\:text-amber-900:hover{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.hover\:text-amber-950:hover{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.hover\:text-blue-950:hover{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.hover\:text-cyan-100:hover{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.hover\:text-cyan-200:hover{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.hover\:text-cyan-300:hover{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.hover\:text-cyan-400:hover{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.hover\:text-cyan-50:hover{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.hover\:text-cyan-500:hover{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.hover\:text-cyan-600:hover{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.hover\:text-cyan-700:hover{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.hover\:text-cyan-800:hover{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.hover\:text-cyan-900:hover{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.hover\:text-cyan-950:hover{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.hover\:text-emerald-100:hover{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.hover\:text-emerald-200:hover{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.hover\:text-emerald-300:hover{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.hover\:text-emerald-400:hover{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.hover\:text-emerald-50:hover{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.hover\:text-emerald-500:hover{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.hover\:text-emerald-800:hover{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.hover\:text-emerald-900:hover{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.hover\:text-emerald-950:hover{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.hover\:text-fuchsia-100:hover{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.hover\:text-fuchsia-200:hover{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.hover\:text-fuchsia-300:hover{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.hover\:text-fuchsia-400:hover{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.hover\:text-fuchsia-50:hover{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.hover\:text-fuchsia-500:hover{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.hover\:text-fuchsia-600:hover{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.hover\:text-fuchsia-700:hover{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.hover\:text-fuchsia-800:hover{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.hover\:text-fuchsia-900:hover{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.hover\:text-fuchsia-950:hover{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-gray-950:hover{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.hover\:text-green-100:hover{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.hover\:text-green-200:hover{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.hover\:text-green-300:hover{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.hover\:text-green-400:hover{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.hover\:text-green-50:hover{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.hover\:text-green-500:hover{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.hover\:text-green-700:hover{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.hover\:text-green-800:hover{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.hover\:text-green-950:hover{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.hover\:text-indigo-950:hover{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.hover\:text-lime-100:hover{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.hover\:text-lime-200:hover{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.hover\:text-lime-300:hover{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.hover\:text-lime-400:hover{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.hover\:text-lime-50:hover{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.hover\:text-lime-500:hover{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.hover\:text-lime-600:hover{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.hover\:text-lime-700:hover{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.hover\:text-lime-800:hover{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.hover\:text-lime-900:hover{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.hover\:text-lime-950:hover{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.hover\:text-neutral-100:hover{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.hover\:text-neutral-200:hover{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.hover\:text-neutral-300:hover{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.hover\:text-neutral-400:hover{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.hover\:text-neutral-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-neutral-500:hover{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.hover\:text-neutral-600:hover{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.hover\:text-neutral-700:hover{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.hover\:text-neutral-900:hover{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.hover\:text-neutral-950:hover{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.hover\:text-orange-100:hover{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.hover\:text-orange-200:hover{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.hover\:text-orange-300:hover{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.hover\:text-orange-400:hover{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.hover\:text-orange-50:hover{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.hover\:text-orange-500:hover{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.hover\:text-orange-700:hover{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.hover\:text-orange-800:hover{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.hover\:text-orange-900:hover{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.hover\:text-orange-950:hover{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.hover\:text-pink-950:hover{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.hover\:text-purple-950:hover{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.hover\:text-red-100:hover{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.hover\:text-red-200:hover{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.hover\:text-red-50:hover{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.hover\:text-red-950:hover{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.hover\:text-rose-100:hover{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.hover\:text-rose-200:hover{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.hover\:text-rose-300:hover{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.hover\:text-rose-400:hover{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.hover\:text-rose-50:hover{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.hover\:text-rose-500:hover{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.hover\:text-rose-600:hover{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.hover\:text-rose-700:hover{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.hover\:text-rose-800:hover{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.hover\:text-rose-900:hover{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.hover\:text-rose-950:hover{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.hover\:text-sky-100:hover{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.hover\:text-sky-200:hover{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.hover\:text-sky-300:hover{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.hover\:text-sky-400:hover{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.hover\:text-sky-50:hover{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.hover\:text-sky-500:hover{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.hover\:text-sky-600:hover{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.hover\:text-sky-700:hover{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.hover\:text-sky-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-sky-900:hover{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.hover\:text-sky-950:hover{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.hover\:text-slate-100:hover{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.hover\:text-slate-200:hover{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.hover\:text-slate-300:hover{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.hover\:text-slate-400:hover{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.hover\:text-slate-50:hover{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.hover\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\:text-slate-800:hover{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:text-slate-950:hover{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.hover\:text-stone-100:hover{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.hover\:text-stone-200:hover{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.hover\:text-stone-300:hover{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.hover\:text-stone-400:hover{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.hover\:text-stone-50:hover{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.hover\:text-stone-500:hover{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.hover\:text-stone-600:hover{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.hover\:text-stone-700:hover{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.hover\:text-stone-800:hover{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.hover\:text-stone-900:hover{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.hover\:text-stone-950:hover{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.hover\:text-teal-100:hover{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.hover\:text-teal-200:hover{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.hover\:text-teal-300:hover{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.hover\:text-teal-400:hover{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.hover\:text-teal-50:hover{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.hover\:text-teal-500:hover{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.hover\:text-teal-600:hover{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.hover\:text-teal-700:hover{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.hover\:text-teal-800:hover{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.hover\:text-teal-900:hover{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.hover\:text-teal-950:hover{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.hover\:text-tremor-brand-emphasis:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-tremor-content:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-tremor-content-emphasis:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-violet-100:hover{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.hover\:text-violet-200:hover{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.hover\:text-violet-300:hover{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.hover\:text-violet-400:hover{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.hover\:text-violet-50:hover{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.hover\:text-violet-500:hover{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.hover\:text-violet-600:hover{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.hover\:text-violet-700:hover{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.hover\:text-violet-800:hover{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.hover\:text-violet-900:hover{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.hover\:text-violet-950:hover{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.hover\:text-yellow-950:hover{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.hover\:text-zinc-100:hover{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.hover\:text-zinc-200:hover{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.hover\:text-zinc-300:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.hover\:text-zinc-400:hover{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.hover\:text-zinc-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-zinc-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.hover\:text-zinc-800:hover{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.hover\:text-zinc-950:hover{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-tremor-brand-subtle:focus{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0: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(0px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.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)}.focus\:ring-tremor-brand-muted:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.group:active .group-active\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.aria-selected\:\!bg-tremor-background-subtle[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity))!important}.aria-selected\:bg-tremor-background-emphasis[aria-selected=true]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.aria-selected\:\!text-tremor-content[aria-selected=true]{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.aria-selected\:text-tremor-brand-inverted[aria-selected=true],.aria-selected\:text-tremor-content-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.ui-selected\:border-b-2[data-headlessui-state~=selected]{border-bottom-width:2px}.ui-selected\:border-amber-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.ui-selected\:border-amber-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.ui-selected\:border-amber-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.ui-selected\:border-amber-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.ui-selected\:border-amber-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.ui-selected\:border-amber-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.ui-selected\:border-amber-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.ui-selected\:border-amber-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.ui-selected\:border-amber-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.ui-selected\:border-amber-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.ui-selected\:border-amber-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.ui-selected\:border-blue-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.ui-selected\:border-blue-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.ui-selected\:border-blue-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.ui-selected\:border-blue-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.ui-selected\:border-blue-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.ui-selected\:border-blue-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.ui-selected\:border-blue-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ui-selected\:border-blue-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.ui-selected\:border-blue-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.ui-selected\:border-blue-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.ui-selected\:border-blue-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.ui-selected\:border-cyan-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.ui-selected\:border-cyan-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.ui-selected\:border-cyan-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.ui-selected\:border-cyan-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.ui-selected\:border-cyan-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.ui-selected\:border-cyan-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.ui-selected\:border-cyan-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.ui-selected\:border-cyan-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.ui-selected\:border-cyan-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.ui-selected\:border-cyan-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.ui-selected\:border-cyan-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.ui-selected\:border-emerald-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.ui-selected\:border-emerald-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.ui-selected\:border-emerald-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.ui-selected\:border-emerald-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.ui-selected\:border-emerald-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.ui-selected\:border-emerald-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.ui-selected\:border-emerald-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.ui-selected\:border-emerald-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.ui-selected\:border-emerald-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.ui-selected\:border-emerald-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.ui-selected\:border-emerald-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.ui-selected\:border-gray-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.ui-selected\:border-gray-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-gray-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.ui-selected\:border-gray-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.ui-selected\:border-gray-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.ui-selected\:border-gray-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.ui-selected\:border-gray-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.ui-selected\:border-gray-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.ui-selected\:border-gray-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.ui-selected\:border-gray-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.ui-selected\:border-gray-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.ui-selected\:border-green-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.ui-selected\:border-green-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.ui-selected\:border-green-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.ui-selected\:border-green-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.ui-selected\:border-green-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.ui-selected\:border-green-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.ui-selected\:border-green-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ui-selected\:border-green-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.ui-selected\:border-green-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.ui-selected\:border-green-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.ui-selected\:border-green-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.ui-selected\:border-indigo-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.ui-selected\:border-indigo-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.ui-selected\:border-indigo-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.ui-selected\:border-indigo-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-indigo-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.ui-selected\:border-indigo-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.ui-selected\:border-indigo-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.ui-selected\:border-indigo-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.ui-selected\:border-indigo-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.ui-selected\:border-lime-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.ui-selected\:border-lime-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.ui-selected\:border-lime-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.ui-selected\:border-lime-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.ui-selected\:border-lime-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.ui-selected\:border-lime-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.ui-selected\:border-lime-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.ui-selected\:border-lime-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.ui-selected\:border-lime-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.ui-selected\:border-lime-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.ui-selected\:border-lime-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.ui-selected\:border-neutral-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.ui-selected\:border-neutral-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.ui-selected\:border-neutral-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.ui-selected\:border-neutral-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.ui-selected\:border-neutral-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-neutral-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.ui-selected\:border-neutral-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.ui-selected\:border-neutral-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.ui-selected\:border-neutral-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.ui-selected\:border-neutral-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.ui-selected\:border-neutral-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.ui-selected\:border-orange-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.ui-selected\:border-orange-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.ui-selected\:border-orange-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.ui-selected\:border-orange-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.ui-selected\:border-orange-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.ui-selected\:border-orange-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.ui-selected\:border-orange-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.ui-selected\:border-orange-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.ui-selected\:border-orange-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.ui-selected\:border-orange-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.ui-selected\:border-orange-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.ui-selected\:border-pink-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.ui-selected\:border-pink-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.ui-selected\:border-pink-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.ui-selected\:border-pink-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.ui-selected\:border-pink-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.ui-selected\:border-pink-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.ui-selected\:border-pink-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.ui-selected\:border-pink-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.ui-selected\:border-pink-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.ui-selected\:border-pink-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.ui-selected\:border-pink-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.ui-selected\:border-purple-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.ui-selected\:border-purple-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.ui-selected\:border-purple-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.ui-selected\:border-purple-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.ui-selected\:border-purple-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.ui-selected\:border-purple-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.ui-selected\:border-purple-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ui-selected\:border-purple-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.ui-selected\:border-purple-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.ui-selected\:border-purple-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.ui-selected\:border-purple-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.ui-selected\:border-red-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.ui-selected\:border-red-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.ui-selected\:border-red-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.ui-selected\:border-red-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.ui-selected\:border-red-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.ui-selected\:border-red-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.ui-selected\:border-red-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ui-selected\:border-red-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.ui-selected\:border-red-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.ui-selected\:border-red-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.ui-selected\:border-red-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.ui-selected\:border-rose-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.ui-selected\:border-rose-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.ui-selected\:border-rose-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.ui-selected\:border-rose-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.ui-selected\:border-rose-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.ui-selected\:border-rose-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.ui-selected\:border-rose-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.ui-selected\:border-rose-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.ui-selected\:border-rose-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.ui-selected\:border-rose-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.ui-selected\:border-rose-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.ui-selected\:border-sky-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.ui-selected\:border-sky-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.ui-selected\:border-sky-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.ui-selected\:border-sky-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.ui-selected\:border-sky-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.ui-selected\:border-sky-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.ui-selected\:border-sky-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.ui-selected\:border-sky-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.ui-selected\:border-sky-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.ui-selected\:border-sky-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.ui-selected\:border-sky-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.ui-selected\:border-slate-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.ui-selected\:border-slate-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.ui-selected\:border-slate-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.ui-selected\:border-slate-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.ui-selected\:border-slate-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.ui-selected\:border-slate-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.ui-selected\:border-slate-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.ui-selected\:border-slate-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.ui-selected\:border-slate-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.ui-selected\:border-slate-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.ui-selected\:border-slate-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.ui-selected\:border-stone-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.ui-selected\:border-stone-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.ui-selected\:border-stone-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ui-selected\:border-stone-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.ui-selected\:border-stone-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.ui-selected\:border-stone-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.ui-selected\:border-stone-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.ui-selected\:border-stone-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.ui-selected\:border-stone-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.ui-selected\:border-stone-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.ui-selected\:border-stone-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.ui-selected\:border-teal-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.ui-selected\:border-teal-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.ui-selected\:border-teal-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.ui-selected\:border-teal-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.ui-selected\:border-teal-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.ui-selected\:border-teal-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.ui-selected\:border-teal-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.ui-selected\:border-teal-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.ui-selected\:border-teal-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.ui-selected\:border-teal-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.ui-selected\:border-teal-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.ui-selected\:border-tremor-border[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-tremor-brand[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-violet-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.ui-selected\:border-violet-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.ui-selected\:border-violet-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.ui-selected\:border-violet-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.ui-selected\:border-violet-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.ui-selected\:border-violet-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.ui-selected\:border-violet-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.ui-selected\:border-violet-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.ui-selected\:border-violet-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.ui-selected\:border-violet-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.ui-selected\:border-violet-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.ui-selected\:border-yellow-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.ui-selected\:border-yellow-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.ui-selected\:border-yellow-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.ui-selected\:border-yellow-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.ui-selected\:border-yellow-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.ui-selected\:border-yellow-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.ui-selected\:border-yellow-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ui-selected\:border-yellow-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.ui-selected\:border-yellow-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.ui-selected\:border-yellow-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.ui-selected\:border-yellow-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.ui-selected\:border-zinc-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.ui-selected\:border-zinc-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.ui-selected\:border-zinc-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.ui-selected\:border-zinc-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.ui-selected\:border-zinc-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-zinc-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.ui-selected\:border-zinc-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.ui-selected\:border-zinc-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.ui-selected\:border-zinc-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.ui-selected\:border-zinc-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.ui-selected\:border-zinc-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.ui-selected\:bg-amber-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.ui-selected\:bg-amber-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.ui-selected\:bg-amber-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.ui-selected\:bg-amber-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.ui-selected\:bg-amber-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.ui-selected\:bg-amber-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.ui-selected\:bg-amber-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.ui-selected\:bg-amber-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.ui-selected\:bg-amber-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.ui-selected\:bg-amber-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.ui-selected\:bg-amber-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.ui-selected\:bg-blue-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.ui-selected\:bg-blue-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.ui-selected\:bg-blue-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.ui-selected\:bg-blue-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.ui-selected\:bg-blue-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.ui-selected\:bg-blue-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.ui-selected\:bg-blue-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.ui-selected\:bg-blue-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.ui-selected\:bg-blue-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.ui-selected\:bg-gray-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.ui-selected\:bg-gray-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.ui-selected\:bg-gray-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.ui-selected\:bg-gray-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.ui-selected\:bg-gray-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-gray-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.ui-selected\:bg-gray-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.ui-selected\:bg-gray-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.ui-selected\:bg-gray-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.ui-selected\:bg-gray-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.ui-selected\:bg-gray-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.ui-selected\:bg-green-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.ui-selected\:bg-green-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.ui-selected\:bg-green-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.ui-selected\:bg-green-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.ui-selected\:bg-green-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.ui-selected\:bg-green-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.ui-selected\:bg-green-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.ui-selected\:bg-green-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.ui-selected\:bg-green-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.ui-selected\:bg-green-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.ui-selected\:bg-green-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.ui-selected\:bg-lime-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.ui-selected\:bg-lime-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.ui-selected\:bg-lime-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.ui-selected\:bg-lime-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.ui-selected\:bg-lime-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.ui-selected\:bg-lime-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.ui-selected\:bg-lime-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.ui-selected\:bg-lime-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.ui-selected\:bg-lime-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.ui-selected\:bg-lime-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.ui-selected\:bg-lime-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-orange-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.ui-selected\:bg-orange-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.ui-selected\:bg-orange-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.ui-selected\:bg-orange-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.ui-selected\:bg-orange-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.ui-selected\:bg-orange-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.ui-selected\:bg-orange-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.ui-selected\:bg-pink-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.ui-selected\:bg-pink-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.ui-selected\:bg-pink-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.ui-selected\:bg-pink-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.ui-selected\:bg-pink-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.ui-selected\:bg-pink-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.ui-selected\:bg-pink-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.ui-selected\:bg-pink-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.ui-selected\:bg-pink-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.ui-selected\:bg-pink-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.ui-selected\:bg-pink-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.ui-selected\:bg-purple-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.ui-selected\:bg-purple-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.ui-selected\:bg-purple-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.ui-selected\:bg-purple-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.ui-selected\:bg-purple-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.ui-selected\:bg-purple-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.ui-selected\:bg-purple-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.ui-selected\:bg-purple-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.ui-selected\:bg-red-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.ui-selected\:bg-red-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.ui-selected\:bg-red-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.ui-selected\:bg-red-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.ui-selected\:bg-red-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.ui-selected\:bg-red-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.ui-selected\:bg-red-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-red-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.ui-selected\:bg-red-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.ui-selected\:bg-red-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.ui-selected\:bg-red-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-rose-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.ui-selected\:bg-rose-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.ui-selected\:bg-rose-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.ui-selected\:bg-rose-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.ui-selected\:bg-rose-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.ui-selected\:bg-rose-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.ui-selected\:bg-rose-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.ui-selected\:bg-rose-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.ui-selected\:bg-rose-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.ui-selected\:bg-rose-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.ui-selected\:bg-rose-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.ui-selected\:bg-sky-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.ui-selected\:bg-sky-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.ui-selected\:bg-sky-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.ui-selected\:bg-sky-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.ui-selected\:bg-sky-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.ui-selected\:bg-sky-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.ui-selected\:bg-sky-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.ui-selected\:bg-sky-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.ui-selected\:bg-sky-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.ui-selected\:bg-sky-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.ui-selected\:bg-sky-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.ui-selected\:bg-slate-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.ui-selected\:bg-slate-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.ui-selected\:bg-slate-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.ui-selected\:bg-slate-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.ui-selected\:bg-slate-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.ui-selected\:bg-slate-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.ui-selected\:bg-slate-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.ui-selected\:bg-slate-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.ui-selected\:bg-slate-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.ui-selected\:bg-slate-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.ui-selected\:bg-slate-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ui-selected\:bg-stone-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ui-selected\:bg-stone-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ui-selected\:bg-stone-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.ui-selected\:bg-stone-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.ui-selected\:bg-stone-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.ui-selected\:bg-stone-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.ui-selected\:bg-stone-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.ui-selected\:bg-stone-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.ui-selected\:bg-stone-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.ui-selected\:bg-teal-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.ui-selected\:bg-teal-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.ui-selected\:bg-teal-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.ui-selected\:bg-teal-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.ui-selected\:bg-teal-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.ui-selected\:bg-teal-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.ui-selected\:bg-teal-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.ui-selected\:bg-teal-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.ui-selected\:bg-teal-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.ui-selected\:bg-teal-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.ui-selected\:bg-teal-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background-muted[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-violet-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.ui-selected\:bg-violet-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.ui-selected\:bg-violet-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.ui-selected\:bg-violet-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.ui-selected\:bg-violet-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.ui-selected\:bg-violet-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.ui-selected\:bg-violet-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.ui-selected\:bg-violet-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.ui-selected\:bg-violet-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.ui-selected\:text-amber-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.ui-selected\:text-amber-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.ui-selected\:text-amber-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.ui-selected\:text-amber-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.ui-selected\:text-amber-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.ui-selected\:text-amber-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.ui-selected\:text-amber-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.ui-selected\:text-amber-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.ui-selected\:text-amber-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.ui-selected\:text-amber-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.ui-selected\:text-amber-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.ui-selected\:text-blue-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.ui-selected\:text-blue-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.ui-selected\:text-blue-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.ui-selected\:text-blue-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ui-selected\:text-blue-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.ui-selected\:text-blue-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.ui-selected\:text-blue-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ui-selected\:text-blue-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.ui-selected\:text-blue-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.ui-selected\:text-blue-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.ui-selected\:text-blue-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.ui-selected\:text-cyan-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.ui-selected\:text-cyan-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.ui-selected\:text-cyan-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.ui-selected\:text-cyan-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.ui-selected\:text-cyan-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.ui-selected\:text-cyan-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.ui-selected\:text-cyan-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.ui-selected\:text-cyan-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.ui-selected\:text-cyan-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.ui-selected\:text-cyan-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.ui-selected\:text-cyan-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-emerald-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.ui-selected\:text-emerald-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.ui-selected\:text-emerald-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.ui-selected\:text-emerald-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.ui-selected\:text-emerald-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.ui-selected\:text-emerald-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.ui-selected\:text-emerald-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.ui-selected\:text-emerald-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.ui-selected\:text-emerald-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.ui-selected\:text-emerald-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.ui-selected\:text-emerald-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.ui-selected\:text-gray-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.ui-selected\:text-gray-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.ui-selected\:text-gray-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.ui-selected\:text-gray-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.ui-selected\:text-gray-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.ui-selected\:text-gray-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.ui-selected\:text-gray-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.ui-selected\:text-gray-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-gray-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.ui-selected\:text-gray-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-gray-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.ui-selected\:text-green-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.ui-selected\:text-green-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.ui-selected\:text-green-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.ui-selected\:text-green-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.ui-selected\:text-green-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.ui-selected\:text-green-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.ui-selected\:text-green-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ui-selected\:text-green-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.ui-selected\:text-green-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.ui-selected\:text-green-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.ui-selected\:text-green-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.ui-selected\:text-indigo-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.ui-selected\:text-indigo-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.ui-selected\:text-indigo-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.ui-selected\:text-indigo-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-indigo-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.ui-selected\:text-indigo-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.ui-selected\:text-indigo-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.ui-selected\:text-indigo-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.ui-selected\:text-indigo-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.ui-selected\:text-lime-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.ui-selected\:text-lime-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.ui-selected\:text-lime-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.ui-selected\:text-lime-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.ui-selected\:text-lime-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.ui-selected\:text-lime-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.ui-selected\:text-lime-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.ui-selected\:text-lime-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.ui-selected\:text-lime-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.ui-selected\:text-lime-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.ui-selected\:text-lime-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.ui-selected\:text-neutral-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.ui-selected\:text-neutral-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.ui-selected\:text-neutral-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.ui-selected\:text-neutral-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.ui-selected\:text-neutral-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-neutral-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.ui-selected\:text-neutral-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.ui-selected\:text-neutral-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.ui-selected\:text-neutral-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.ui-selected\:text-neutral-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.ui-selected\:text-neutral-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.ui-selected\:text-orange-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.ui-selected\:text-orange-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.ui-selected\:text-orange-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.ui-selected\:text-orange-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.ui-selected\:text-orange-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.ui-selected\:text-orange-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.ui-selected\:text-orange-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.ui-selected\:text-orange-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.ui-selected\:text-orange-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.ui-selected\:text-orange-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.ui-selected\:text-orange-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.ui-selected\:text-pink-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.ui-selected\:text-pink-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.ui-selected\:text-pink-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.ui-selected\:text-pink-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.ui-selected\:text-pink-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.ui-selected\:text-pink-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.ui-selected\:text-pink-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.ui-selected\:text-pink-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.ui-selected\:text-pink-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.ui-selected\:text-pink-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.ui-selected\:text-pink-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.ui-selected\:text-purple-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.ui-selected\:text-purple-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.ui-selected\:text-purple-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.ui-selected\:text-purple-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.ui-selected\:text-purple-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.ui-selected\:text-purple-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.ui-selected\:text-purple-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ui-selected\:text-purple-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.ui-selected\:text-purple-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.ui-selected\:text-purple-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.ui-selected\:text-purple-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.ui-selected\:text-red-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.ui-selected\:text-red-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.ui-selected\:text-red-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.ui-selected\:text-red-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.ui-selected\:text-red-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.ui-selected\:text-red-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.ui-selected\:text-red-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ui-selected\:text-red-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.ui-selected\:text-red-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.ui-selected\:text-red-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.ui-selected\:text-red-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.ui-selected\:text-rose-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.ui-selected\:text-rose-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.ui-selected\:text-rose-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.ui-selected\:text-rose-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.ui-selected\:text-rose-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.ui-selected\:text-rose-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.ui-selected\:text-rose-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.ui-selected\:text-rose-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.ui-selected\:text-rose-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.ui-selected\:text-rose-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.ui-selected\:text-rose-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.ui-selected\:text-sky-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.ui-selected\:text-sky-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.ui-selected\:text-sky-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.ui-selected\:text-sky-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.ui-selected\:text-sky-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.ui-selected\:text-sky-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.ui-selected\:text-sky-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.ui-selected\:text-sky-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.ui-selected\:text-sky-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.ui-selected\:text-sky-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.ui-selected\:text-sky-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.ui-selected\:text-slate-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.ui-selected\:text-slate-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.ui-selected\:text-slate-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.ui-selected\:text-slate-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.ui-selected\:text-slate-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.ui-selected\:text-slate-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.ui-selected\:text-slate-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.ui-selected\:text-slate-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.ui-selected\:text-slate-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.ui-selected\:text-slate-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ui-selected\:text-slate-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.ui-selected\:text-stone-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.ui-selected\:text-stone-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.ui-selected\:text-stone-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.ui-selected\:text-stone-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.ui-selected\:text-stone-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.ui-selected\:text-stone-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ui-selected\:text-stone-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ui-selected\:text-stone-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.ui-selected\:text-stone-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.ui-selected\:text-stone-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.ui-selected\:text-stone-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.ui-selected\:text-teal-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.ui-selected\:text-teal-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.ui-selected\:text-teal-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.ui-selected\:text-teal-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.ui-selected\:text-teal-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.ui-selected\:text-teal-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.ui-selected\:text-teal-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.ui-selected\:text-teal-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.ui-selected\:text-teal-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.ui-selected\:text-teal-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.ui-selected\:text-teal-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.ui-selected\:text-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-emphasis[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-strong[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-violet-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.ui-selected\:text-violet-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.ui-selected\:text-violet-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.ui-selected\:text-violet-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.ui-selected\:text-violet-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.ui-selected\:text-violet-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.ui-selected\:text-violet-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.ui-selected\:text-violet-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.ui-selected\:text-violet-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.ui-selected\:text-violet-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.ui-selected\:text-violet-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.ui-selected\:text-yellow-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.ui-selected\:text-yellow-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.ui-selected\:text-yellow-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.ui-selected\:text-yellow-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.ui-selected\:text-yellow-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.ui-selected\:text-yellow-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.ui-selected\:text-yellow-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ui-selected\:text-yellow-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.ui-selected\:text-yellow-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.ui-selected\:text-yellow-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.ui-selected\:text-yellow-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.ui-selected\:text-zinc-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.ui-selected\:text-zinc-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.ui-selected\:text-zinc-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.ui-selected\:text-zinc-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.ui-selected\:text-zinc-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-zinc-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.ui-selected\:text-zinc-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.ui-selected\:text-zinc-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.ui-selected\:text-zinc-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.ui-selected\:text-zinc-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.ui-selected\:text-zinc-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.ui-selected\:shadow-tremor-input[data-headlessui-state~=selected]{--tw-shadow:0 1px 2px 0 rgba(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)}:where([data-headlessui-state~=selected]) .ui-selected\:border-b-2{border-bottom-width:2px}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(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)}.ui-active\:bg-tremor-background-muted[data-headlessui-state~=active]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-active\:text-tremor-content-strong[data-headlessui-state~=active]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=active]) .ui-active\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=active]) .ui-active\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:divide-dark-tremor-border)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}:is(.dark .dark\:border-dark-tremor-background){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-emphasis){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-inverted){--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-subtle){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-emphasis){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-subtle){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-border){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand){--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted){--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted\/70){background-color:rgba(30,27,75,.7)}:is(.dark .dark\:bg-dark-tremor-brand-subtle){--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-content-subtle){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:bg-slate-950\/50){background-color:rgba(2,6,23,.5)}:is(.dark .dark\:bg-opacity-10){--tw-bg-opacity:0.1}:is(.dark .dark\:bg-opacity-25){--tw-bg-opacity:0.25}:is(.dark .dark\:bg-opacity-30){--tw-bg-opacity:0.3}:is(.dark .dark\:from-dark-tremor-background){--tw-gradient-from:#111827 var(--tw-gradient-from-position);--tw-gradient-to:rgba(17,24,39,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(.dark .dark\:to-dark-tremor-background){--tw-gradient-to:#111827 var(--tw-gradient-to-position)}:is(.dark .dark\:fill-dark-tremor-content){fill:#6b7280}:is(.dark .dark\:fill-dark-tremor-content-emphasis){fill:#e5e7eb}:is(.dark .dark\:stroke-dark-tremor-background){stroke:#111827}:is(.dark .dark\:stroke-dark-tremor-border){stroke:#374151}:is(.dark .dark\:stroke-dark-tremor-brand){stroke:#6366f1}:is(.dark .dark\:stroke-dark-tremor-brand-muted){stroke:#1e1b4b}:is(.dark .dark\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-emphasis){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-inverted){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-subtle){--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:accent-dark-tremor-brand){accent-color:#6366f1}:is(.dark .dark\:opacity-25){opacity:.25}:is(.dark .dark\:shadow-dark-tremor-card){--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:shadow-dark-tremor-dropdown){--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(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)}:is(.dark .dark\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:outline-dark-tremor-brand){outline-color:#6366f1}:is(.dark .dark\:ring-dark-tremor-brand-inverted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-brand-muted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-ring){--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-brand-emphasis:hover){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-content-emphasis:hover){--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-muted:hover){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-subtle:hover){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-emphasis:hover){--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-faint:hover){--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-opacity-20:hover){--tw-bg-opacity:0.2}:is(.dark .dark\:hover\:text-dark-tremor-brand-emphasis:hover){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:is(.dark .hover\:dark\:text-dark-tremor-content):hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:focus\:border-dark-tremor-brand-subtle:focus){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .focus\:dark\:border-dark-tremor-brand-subtle):focus{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:focus\:ring-dark-tremor-brand-muted:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .focus\:dark\:ring-dark-tremor-brand-muted):focus{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .group:hover .dark\:group-hover\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .aria-selected\:dark\:\!bg-dark-tremor-background-subtle)[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(31 41 55/var(--tw-bg-opacity))!important}:is(.dark .dark\:aria-selected\:bg-dark-tremor-background-emphasis[aria-selected=true]){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-content-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-border[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-brand[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background-muted[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-emphasis[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-strong[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:shadow-dark-tremor-input[data-headlessui-state~=selected]){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:ui-active\:bg-dark-tremor-background-muted[data-headlessui-state~=active]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-active\:text-dark-tremor-content-strong[data-headlessui-state~=active]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}@media (min-width:640px){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:items-start{align-items:flex-start}.sm\: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)))}.sm\: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))}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}}@media (min-width:768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}}@media (min-width:1024px){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:max-w-\[200px\]{max-width:200px}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button,.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none} \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/css/32e93a3d13512de5.css b/litellm/proxy/_experimental/out/_next/static/css/32e93a3d13512de5.css new file mode 100644 index 000000000..6f5d16fed --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/css/32e93a3d13512de5.css @@ -0,0 +1,5 @@ +@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/ec159349637c90ad-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/513657b02c5c193f-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/fd4db3eb5472fc27-s.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/51ed15f9841b9f9d-s.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/05a31a2ca4975f99-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/d6b16ce4a6175f26-s.woff2) format("woff2");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/c9a5bc6a7c948fb0-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Inter_Fallback_c23dc8;src:local("Arial");ascent-override:90.20%;descent-override:22.48%;line-gap-override:0.00%;size-adjust:107.40%}.__className_c23dc8{font-family:__Inter_c23dc8,__Inter_Fallback_c23dc8;font-style:normal} + +/* +! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com +*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{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,pre,samp{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}[type=button],[type=reset],[type=submit],button{-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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af}input::placeholder,textarea::placeholder{color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors:active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors:active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media (forced-colors:active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,:after,:before{--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:rgba(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:rgba(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: }.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}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2{left:.5rem}.right-0{right:0}.right-1{right:.25rem}.right-1\/2{right:50%}.right-10{right:2.5rem}.top-0{top:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.m-2{margin:.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-2{margin-top:.5rem;margin-bottom:.5rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-mb-px{margin-bottom:-1px}.-ml-0{margin-left:0}.-ml-0\.5{margin-left:-.125rem}.-ml-1{margin-left:-.25rem}.-ml-1\.5{margin-left:-.375rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.mb-0{margin-bottom:0}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-2\.5{margin-left:.625rem}.ml-px{margin-left:1px}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-8{margin-right:2rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0{height:0}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[75vh\]{height:75vh}.h-full{height:100%}.max-h-\[228px\]{max-height:228px}.max-h-\[50vh\]{max-height:50vh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-1\/2{width:50%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-9{width:2.25rem}.w-\[90\%\]{width:90%}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-screen{width:100vw}.min-w-\[10rem\]{min-width:10rem}.min-w-min{min-width:-moz-min-content;min-width:min-content}.max-w-\[100px\]{max-width:100px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-4{--tw-translate-y:-1rem}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1\/2{--tw-translate-x:50%}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.-rotate-180{--tw-rotate:-180deg}.-rotate-180,.-rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate:-90deg}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.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}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.gap-0{gap:0}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.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)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem * var(--tw-space-x-reverse));margin-left:calc(.125rem * calc(1 - var(--tw-space-x-reverse)))}.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-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem * var(--tw-space-x-reverse));margin-left:calc(2.5rem * 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-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)))}.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-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-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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-tremor-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-clip{overflow-x:clip}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[1px\]{border-radius:1px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-tremor-default{border-radius:.5rem}.rounded-tremor-full{border-radius:9999px}.rounded-tremor-small{border-radius:.375rem}.rounded-b-tremor-default{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-tremor-default{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-tremor-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-tremor-small{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-tremor-default{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-tremor-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-tremor-small{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-tremor-default{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-4{border-right-width:4px}.border-t-4{border-top-width:4px}.border-t-\[1px\]{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.border-dark-tremor-background{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-dark-tremor-border{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-dark-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-dark-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-dark-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-dark-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-tremor-background{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.bg-dark-tremor-background{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-dark-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-dark-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-dark-tremor-brand-emphasis{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-dark-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}.bg-dark-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-dark-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.bg-slate-950\/30{background-color:rgba(2,6,23,.3)}.bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-tremor-background-emphasis{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-tremor-border{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.bg-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(134 136 239/var(--tw-bg-opacity))}.bg-tremor-brand-muted\/50{background-color:rgba(134,136,239,.5)}.bg-tremor-brand-subtle{--tw-bg-opacity:1;background-color:rgb(142 145 235/var(--tw-bg-opacity))}.bg-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.bg-opacity-10{--tw-bg-opacity:0.1}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-opacity-30{--tw-bg-opacity:0.3}.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:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-tremor-background{--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-tremor-background{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.fill-amber-100{fill:#fef3c7}.fill-amber-200{fill:#fde68a}.fill-amber-300{fill:#fcd34d}.fill-amber-400{fill:#fbbf24}.fill-amber-50{fill:#fffbeb}.fill-amber-500{fill:#f59e0b}.fill-amber-600{fill:#d97706}.fill-amber-700{fill:#b45309}.fill-amber-800{fill:#92400e}.fill-amber-900{fill:#78350f}.fill-amber-950{fill:#451a03}.fill-blue-100{fill:#dbeafe}.fill-blue-200{fill:#bfdbfe}.fill-blue-300{fill:#93c5fd}.fill-blue-400{fill:#60a5fa}.fill-blue-50{fill:#eff6ff}.fill-blue-500{fill:#3b82f6}.fill-blue-600{fill:#2563eb}.fill-blue-700{fill:#1d4ed8}.fill-blue-800{fill:#1e40af}.fill-blue-900{fill:#1e3a8a}.fill-blue-950{fill:#172554}.fill-cyan-100{fill:#cffafe}.fill-cyan-200{fill:#a5f3fc}.fill-cyan-300{fill:#67e8f9}.fill-cyan-400{fill:#22d3ee}.fill-cyan-50{fill:#ecfeff}.fill-cyan-500{fill:#06b6d4}.fill-cyan-600{fill:#0891b2}.fill-cyan-700{fill:#0e7490}.fill-cyan-800{fill:#155e75}.fill-cyan-900{fill:#164e63}.fill-cyan-950{fill:#083344}.fill-emerald-100{fill:#d1fae5}.fill-emerald-200{fill:#a7f3d0}.fill-emerald-300{fill:#6ee7b7}.fill-emerald-400{fill:#34d399}.fill-emerald-50{fill:#ecfdf5}.fill-emerald-500{fill:#10b981}.fill-emerald-600{fill:#059669}.fill-emerald-700{fill:#047857}.fill-emerald-800{fill:#065f46}.fill-emerald-900{fill:#064e3b}.fill-emerald-950{fill:#022c22}.fill-fuchsia-100{fill:#fae8ff}.fill-fuchsia-200{fill:#f5d0fe}.fill-fuchsia-300{fill:#f0abfc}.fill-fuchsia-400{fill:#e879f9}.fill-fuchsia-50{fill:#fdf4ff}.fill-fuchsia-500{fill:#d946ef}.fill-fuchsia-600{fill:#c026d3}.fill-fuchsia-700{fill:#a21caf}.fill-fuchsia-800{fill:#86198f}.fill-fuchsia-900{fill:#701a75}.fill-fuchsia-950{fill:#4a044e}.fill-gray-100{fill:#f3f4f6}.fill-gray-200{fill:#e5e7eb}.fill-gray-300{fill:#d1d5db}.fill-gray-400{fill:#9ca3af}.fill-gray-50{fill:#f9fafb}.fill-gray-500{fill:#6b7280}.fill-gray-600{fill:#4b5563}.fill-gray-700{fill:#374151}.fill-gray-800{fill:#1f2937}.fill-gray-900{fill:#111827}.fill-gray-950{fill:#030712}.fill-green-100{fill:#dcfce7}.fill-green-200{fill:#bbf7d0}.fill-green-300{fill:#86efac}.fill-green-400{fill:#4ade80}.fill-green-50{fill:#f0fdf4}.fill-green-500{fill:#22c55e}.fill-green-600{fill:#16a34a}.fill-green-700{fill:#15803d}.fill-green-800{fill:#166534}.fill-green-900{fill:#14532d}.fill-green-950{fill:#052e16}.fill-indigo-100{fill:#e0e7ff}.fill-indigo-200{fill:#c7d2fe}.fill-indigo-300{fill:#a5b4fc}.fill-indigo-400{fill:#818cf8}.fill-indigo-50{fill:#eef2ff}.fill-indigo-500{fill:#6366f1}.fill-indigo-600{fill:#4f46e5}.fill-indigo-700{fill:#4338ca}.fill-indigo-800{fill:#3730a3}.fill-indigo-900{fill:#312e81}.fill-indigo-950{fill:#1e1b4b}.fill-lime-100{fill:#ecfccb}.fill-lime-200{fill:#d9f99d}.fill-lime-300{fill:#bef264}.fill-lime-400{fill:#a3e635}.fill-lime-50{fill:#f7fee7}.fill-lime-500{fill:#84cc16}.fill-lime-600{fill:#65a30d}.fill-lime-700{fill:#4d7c0f}.fill-lime-800{fill:#3f6212}.fill-lime-900{fill:#365314}.fill-lime-950{fill:#1a2e05}.fill-neutral-100{fill:#f5f5f5}.fill-neutral-200{fill:#e5e5e5}.fill-neutral-300{fill:#d4d4d4}.fill-neutral-400{fill:#a3a3a3}.fill-neutral-50{fill:#fafafa}.fill-neutral-500{fill:#737373}.fill-neutral-600{fill:#525252}.fill-neutral-700{fill:#404040}.fill-neutral-800{fill:#262626}.fill-neutral-900{fill:#171717}.fill-neutral-950{fill:#0a0a0a}.fill-orange-100{fill:#ffedd5}.fill-orange-200{fill:#fed7aa}.fill-orange-300{fill:#fdba74}.fill-orange-400{fill:#fb923c}.fill-orange-50{fill:#fff7ed}.fill-orange-500{fill:#f97316}.fill-orange-600{fill:#ea580c}.fill-orange-700{fill:#c2410c}.fill-orange-800{fill:#9a3412}.fill-orange-900{fill:#7c2d12}.fill-orange-950{fill:#431407}.fill-pink-100{fill:#fce7f3}.fill-pink-200{fill:#fbcfe8}.fill-pink-300{fill:#f9a8d4}.fill-pink-400{fill:#f472b6}.fill-pink-50{fill:#fdf2f8}.fill-pink-500{fill:#ec4899}.fill-pink-600{fill:#db2777}.fill-pink-700{fill:#be185d}.fill-pink-800{fill:#9d174d}.fill-pink-900{fill:#831843}.fill-pink-950{fill:#500724}.fill-purple-100{fill:#f3e8ff}.fill-purple-200{fill:#e9d5ff}.fill-purple-300{fill:#d8b4fe}.fill-purple-400{fill:#c084fc}.fill-purple-50{fill:#faf5ff}.fill-purple-500{fill:#a855f7}.fill-purple-600{fill:#9333ea}.fill-purple-700{fill:#7e22ce}.fill-purple-800{fill:#6b21a8}.fill-purple-900{fill:#581c87}.fill-purple-950{fill:#3b0764}.fill-red-100{fill:#fee2e2}.fill-red-200{fill:#fecaca}.fill-red-300{fill:#fca5a5}.fill-red-400{fill:#f87171}.fill-red-50{fill:#fef2f2}.fill-red-500{fill:#ef4444}.fill-red-600{fill:#dc2626}.fill-red-700{fill:#b91c1c}.fill-red-800{fill:#991b1b}.fill-red-900{fill:#7f1d1d}.fill-red-950{fill:#450a0a}.fill-rose-100{fill:#ffe4e6}.fill-rose-200{fill:#fecdd3}.fill-rose-300{fill:#fda4af}.fill-rose-400{fill:#fb7185}.fill-rose-50{fill:#fff1f2}.fill-rose-500{fill:#f43f5e}.fill-rose-600{fill:#e11d48}.fill-rose-700{fill:#be123c}.fill-rose-800{fill:#9f1239}.fill-rose-900{fill:#881337}.fill-rose-950{fill:#4c0519}.fill-sky-100{fill:#e0f2fe}.fill-sky-200{fill:#bae6fd}.fill-sky-300{fill:#7dd3fc}.fill-sky-400{fill:#38bdf8}.fill-sky-50{fill:#f0f9ff}.fill-sky-500{fill:#0ea5e9}.fill-sky-600{fill:#0284c7}.fill-sky-700{fill:#0369a1}.fill-sky-800{fill:#075985}.fill-sky-900{fill:#0c4a6e}.fill-sky-950{fill:#082f49}.fill-slate-100{fill:#f1f5f9}.fill-slate-200{fill:#e2e8f0}.fill-slate-300{fill:#cbd5e1}.fill-slate-400{fill:#94a3b8}.fill-slate-50{fill:#f8fafc}.fill-slate-500{fill:#64748b}.fill-slate-600{fill:#475569}.fill-slate-700{fill:#334155}.fill-slate-800{fill:#1e293b}.fill-slate-900{fill:#0f172a}.fill-slate-950{fill:#020617}.fill-stone-100{fill:#f5f5f4}.fill-stone-200{fill:#e7e5e4}.fill-stone-300{fill:#d6d3d1}.fill-stone-400{fill:#a8a29e}.fill-stone-50{fill:#fafaf9}.fill-stone-500{fill:#78716c}.fill-stone-600{fill:#57534e}.fill-stone-700{fill:#44403c}.fill-stone-800{fill:#292524}.fill-stone-900{fill:#1c1917}.fill-stone-950{fill:#0c0a09}.fill-teal-100{fill:#ccfbf1}.fill-teal-200{fill:#99f6e4}.fill-teal-300{fill:#5eead4}.fill-teal-400{fill:#2dd4bf}.fill-teal-50{fill:#f0fdfa}.fill-teal-500{fill:#14b8a6}.fill-teal-600{fill:#0d9488}.fill-teal-700{fill:#0f766e}.fill-teal-800{fill:#115e59}.fill-teal-900{fill:#134e4a}.fill-teal-950{fill:#042f2e}.fill-tremor-content{fill:#6b7280}.fill-tremor-content-emphasis{fill:#374151}.fill-violet-100{fill:#ede9fe}.fill-violet-200{fill:#ddd6fe}.fill-violet-300{fill:#c4b5fd}.fill-violet-400{fill:#a78bfa}.fill-violet-50{fill:#f5f3ff}.fill-violet-500{fill:#8b5cf6}.fill-violet-600{fill:#7c3aed}.fill-violet-700{fill:#6d28d9}.fill-violet-800{fill:#5b21b6}.fill-violet-900{fill:#4c1d95}.fill-violet-950{fill:#2e1065}.fill-yellow-100{fill:#fef9c3}.fill-yellow-200{fill:#fef08a}.fill-yellow-300{fill:#fde047}.fill-yellow-400{fill:#facc15}.fill-yellow-50{fill:#fefce8}.fill-yellow-500{fill:#eab308}.fill-yellow-600{fill:#ca8a04}.fill-yellow-700{fill:#a16207}.fill-yellow-800{fill:#854d0e}.fill-yellow-900{fill:#713f12}.fill-yellow-950{fill:#422006}.fill-zinc-100{fill:#f4f4f5}.fill-zinc-200{fill:#e4e4e7}.fill-zinc-300{fill:#d4d4d8}.fill-zinc-400{fill:#a1a1aa}.fill-zinc-50{fill:#fafafa}.fill-zinc-500{fill:#71717a}.fill-zinc-600{fill:#52525b}.fill-zinc-700{fill:#3f3f46}.fill-zinc-800{fill:#27272a}.fill-zinc-900{fill:#18181b}.fill-zinc-950{fill:#09090b}.stroke-amber-100{stroke:#fef3c7}.stroke-amber-200{stroke:#fde68a}.stroke-amber-300{stroke:#fcd34d}.stroke-amber-400{stroke:#fbbf24}.stroke-amber-50{stroke:#fffbeb}.stroke-amber-500{stroke:#f59e0b}.stroke-amber-600{stroke:#d97706}.stroke-amber-700{stroke:#b45309}.stroke-amber-800{stroke:#92400e}.stroke-amber-900{stroke:#78350f}.stroke-amber-950{stroke:#451a03}.stroke-blue-100{stroke:#dbeafe}.stroke-blue-200{stroke:#bfdbfe}.stroke-blue-300{stroke:#93c5fd}.stroke-blue-400{stroke:#60a5fa}.stroke-blue-50{stroke:#eff6ff}.stroke-blue-500{stroke:#3b82f6}.stroke-blue-600{stroke:#2563eb}.stroke-blue-700{stroke:#1d4ed8}.stroke-blue-800{stroke:#1e40af}.stroke-blue-900{stroke:#1e3a8a}.stroke-blue-950{stroke:#172554}.stroke-cyan-100{stroke:#cffafe}.stroke-cyan-200{stroke:#a5f3fc}.stroke-cyan-300{stroke:#67e8f9}.stroke-cyan-400{stroke:#22d3ee}.stroke-cyan-50{stroke:#ecfeff}.stroke-cyan-500{stroke:#06b6d4}.stroke-cyan-600{stroke:#0891b2}.stroke-cyan-700{stroke:#0e7490}.stroke-cyan-800{stroke:#155e75}.stroke-cyan-900{stroke:#164e63}.stroke-cyan-950{stroke:#083344}.stroke-dark-tremor-background{stroke:#111827}.stroke-dark-tremor-border{stroke:#374151}.stroke-emerald-100{stroke:#d1fae5}.stroke-emerald-200{stroke:#a7f3d0}.stroke-emerald-300{stroke:#6ee7b7}.stroke-emerald-400{stroke:#34d399}.stroke-emerald-50{stroke:#ecfdf5}.stroke-emerald-500{stroke:#10b981}.stroke-emerald-600{stroke:#059669}.stroke-emerald-700{stroke:#047857}.stroke-emerald-800{stroke:#065f46}.stroke-emerald-900{stroke:#064e3b}.stroke-emerald-950{stroke:#022c22}.stroke-fuchsia-100{stroke:#fae8ff}.stroke-fuchsia-200{stroke:#f5d0fe}.stroke-fuchsia-300{stroke:#f0abfc}.stroke-fuchsia-400{stroke:#e879f9}.stroke-fuchsia-50{stroke:#fdf4ff}.stroke-fuchsia-500{stroke:#d946ef}.stroke-fuchsia-600{stroke:#c026d3}.stroke-fuchsia-700{stroke:#a21caf}.stroke-fuchsia-800{stroke:#86198f}.stroke-fuchsia-900{stroke:#701a75}.stroke-fuchsia-950{stroke:#4a044e}.stroke-gray-100{stroke:#f3f4f6}.stroke-gray-200{stroke:#e5e7eb}.stroke-gray-300{stroke:#d1d5db}.stroke-gray-400{stroke:#9ca3af}.stroke-gray-50{stroke:#f9fafb}.stroke-gray-500{stroke:#6b7280}.stroke-gray-600{stroke:#4b5563}.stroke-gray-700{stroke:#374151}.stroke-gray-800{stroke:#1f2937}.stroke-gray-900{stroke:#111827}.stroke-gray-950{stroke:#030712}.stroke-green-100{stroke:#dcfce7}.stroke-green-200{stroke:#bbf7d0}.stroke-green-300{stroke:#86efac}.stroke-green-400{stroke:#4ade80}.stroke-green-50{stroke:#f0fdf4}.stroke-green-500{stroke:#22c55e}.stroke-green-600{stroke:#16a34a}.stroke-green-700{stroke:#15803d}.stroke-green-800{stroke:#166534}.stroke-green-900{stroke:#14532d}.stroke-green-950{stroke:#052e16}.stroke-indigo-100{stroke:#e0e7ff}.stroke-indigo-200{stroke:#c7d2fe}.stroke-indigo-300{stroke:#a5b4fc}.stroke-indigo-400{stroke:#818cf8}.stroke-indigo-50{stroke:#eef2ff}.stroke-indigo-500{stroke:#6366f1}.stroke-indigo-600{stroke:#4f46e5}.stroke-indigo-700{stroke:#4338ca}.stroke-indigo-800{stroke:#3730a3}.stroke-indigo-900{stroke:#312e81}.stroke-indigo-950{stroke:#1e1b4b}.stroke-lime-100{stroke:#ecfccb}.stroke-lime-200{stroke:#d9f99d}.stroke-lime-300{stroke:#bef264}.stroke-lime-400{stroke:#a3e635}.stroke-lime-50{stroke:#f7fee7}.stroke-lime-500{stroke:#84cc16}.stroke-lime-600{stroke:#65a30d}.stroke-lime-700{stroke:#4d7c0f}.stroke-lime-800{stroke:#3f6212}.stroke-lime-900{stroke:#365314}.stroke-lime-950{stroke:#1a2e05}.stroke-neutral-100{stroke:#f5f5f5}.stroke-neutral-200{stroke:#e5e5e5}.stroke-neutral-300{stroke:#d4d4d4}.stroke-neutral-400{stroke:#a3a3a3}.stroke-neutral-50{stroke:#fafafa}.stroke-neutral-500{stroke:#737373}.stroke-neutral-600{stroke:#525252}.stroke-neutral-700{stroke:#404040}.stroke-neutral-800{stroke:#262626}.stroke-neutral-900{stroke:#171717}.stroke-neutral-950{stroke:#0a0a0a}.stroke-orange-100{stroke:#ffedd5}.stroke-orange-200{stroke:#fed7aa}.stroke-orange-300{stroke:#fdba74}.stroke-orange-400{stroke:#fb923c}.stroke-orange-50{stroke:#fff7ed}.stroke-orange-500{stroke:#f97316}.stroke-orange-600{stroke:#ea580c}.stroke-orange-700{stroke:#c2410c}.stroke-orange-800{stroke:#9a3412}.stroke-orange-900{stroke:#7c2d12}.stroke-orange-950{stroke:#431407}.stroke-pink-100{stroke:#fce7f3}.stroke-pink-200{stroke:#fbcfe8}.stroke-pink-300{stroke:#f9a8d4}.stroke-pink-400{stroke:#f472b6}.stroke-pink-50{stroke:#fdf2f8}.stroke-pink-500{stroke:#ec4899}.stroke-pink-600{stroke:#db2777}.stroke-pink-700{stroke:#be185d}.stroke-pink-800{stroke:#9d174d}.stroke-pink-900{stroke:#831843}.stroke-pink-950{stroke:#500724}.stroke-purple-100{stroke:#f3e8ff}.stroke-purple-200{stroke:#e9d5ff}.stroke-purple-300{stroke:#d8b4fe}.stroke-purple-400{stroke:#c084fc}.stroke-purple-50{stroke:#faf5ff}.stroke-purple-500{stroke:#a855f7}.stroke-purple-600{stroke:#9333ea}.stroke-purple-700{stroke:#7e22ce}.stroke-purple-800{stroke:#6b21a8}.stroke-purple-900{stroke:#581c87}.stroke-purple-950{stroke:#3b0764}.stroke-red-100{stroke:#fee2e2}.stroke-red-200{stroke:#fecaca}.stroke-red-300{stroke:#fca5a5}.stroke-red-400{stroke:#f87171}.stroke-red-50{stroke:#fef2f2}.stroke-red-500{stroke:#ef4444}.stroke-red-600{stroke:#dc2626}.stroke-red-700{stroke:#b91c1c}.stroke-red-800{stroke:#991b1b}.stroke-red-900{stroke:#7f1d1d}.stroke-red-950{stroke:#450a0a}.stroke-rose-100{stroke:#ffe4e6}.stroke-rose-200{stroke:#fecdd3}.stroke-rose-300{stroke:#fda4af}.stroke-rose-400{stroke:#fb7185}.stroke-rose-50{stroke:#fff1f2}.stroke-rose-500{stroke:#f43f5e}.stroke-rose-600{stroke:#e11d48}.stroke-rose-700{stroke:#be123c}.stroke-rose-800{stroke:#9f1239}.stroke-rose-900{stroke:#881337}.stroke-rose-950{stroke:#4c0519}.stroke-sky-100{stroke:#e0f2fe}.stroke-sky-200{stroke:#bae6fd}.stroke-sky-300{stroke:#7dd3fc}.stroke-sky-400{stroke:#38bdf8}.stroke-sky-50{stroke:#f0f9ff}.stroke-sky-500{stroke:#0ea5e9}.stroke-sky-600{stroke:#0284c7}.stroke-sky-700{stroke:#0369a1}.stroke-sky-800{stroke:#075985}.stroke-sky-900{stroke:#0c4a6e}.stroke-sky-950{stroke:#082f49}.stroke-slate-100{stroke:#f1f5f9}.stroke-slate-200{stroke:#e2e8f0}.stroke-slate-300{stroke:#cbd5e1}.stroke-slate-400{stroke:#94a3b8}.stroke-slate-50{stroke:#f8fafc}.stroke-slate-500{stroke:#64748b}.stroke-slate-600{stroke:#475569}.stroke-slate-700{stroke:#334155}.stroke-slate-800{stroke:#1e293b}.stroke-slate-900{stroke:#0f172a}.stroke-slate-950{stroke:#020617}.stroke-stone-100{stroke:#f5f5f4}.stroke-stone-200{stroke:#e7e5e4}.stroke-stone-300{stroke:#d6d3d1}.stroke-stone-400{stroke:#a8a29e}.stroke-stone-50{stroke:#fafaf9}.stroke-stone-500{stroke:#78716c}.stroke-stone-600{stroke:#57534e}.stroke-stone-700{stroke:#44403c}.stroke-stone-800{stroke:#292524}.stroke-stone-900{stroke:#1c1917}.stroke-stone-950{stroke:#0c0a09}.stroke-teal-100{stroke:#ccfbf1}.stroke-teal-200{stroke:#99f6e4}.stroke-teal-300{stroke:#5eead4}.stroke-teal-400{stroke:#2dd4bf}.stroke-teal-50{stroke:#f0fdfa}.stroke-teal-500{stroke:#14b8a6}.stroke-teal-600{stroke:#0d9488}.stroke-teal-700{stroke:#0f766e}.stroke-teal-800{stroke:#115e59}.stroke-teal-900{stroke:#134e4a}.stroke-teal-950{stroke:#042f2e}.stroke-tremor-background{stroke:#fff}.stroke-tremor-border{stroke:#e5e7eb}.stroke-tremor-brand{stroke:#6366f1}.stroke-tremor-brand-muted\/50{stroke:rgba(134,136,239,.5)}.stroke-violet-100{stroke:#ede9fe}.stroke-violet-200{stroke:#ddd6fe}.stroke-violet-300{stroke:#c4b5fd}.stroke-violet-400{stroke:#a78bfa}.stroke-violet-50{stroke:#f5f3ff}.stroke-violet-500{stroke:#8b5cf6}.stroke-violet-600{stroke:#7c3aed}.stroke-violet-700{stroke:#6d28d9}.stroke-violet-800{stroke:#5b21b6}.stroke-violet-900{stroke:#4c1d95}.stroke-violet-950{stroke:#2e1065}.stroke-yellow-100{stroke:#fef9c3}.stroke-yellow-200{stroke:#fef08a}.stroke-yellow-300{stroke:#fde047}.stroke-yellow-400{stroke:#facc15}.stroke-yellow-50{stroke:#fefce8}.stroke-yellow-500{stroke:#eab308}.stroke-yellow-600{stroke:#ca8a04}.stroke-yellow-700{stroke:#a16207}.stroke-yellow-800{stroke:#854d0e}.stroke-yellow-900{stroke:#713f12}.stroke-yellow-950{stroke:#422006}.stroke-zinc-100{stroke:#f4f4f5}.stroke-zinc-200{stroke:#e4e4e7}.stroke-zinc-300{stroke:#d4d4d8}.stroke-zinc-400{stroke:#a1a1aa}.stroke-zinc-50{stroke:#fafafa}.stroke-zinc-500{stroke:#71717a}.stroke-zinc-600{stroke:#52525b}.stroke-zinc-700{stroke:#3f3f46}.stroke-zinc-800{stroke:#27272a}.stroke-zinc-900{stroke:#18181b}.stroke-zinc-950{stroke:#09090b}.stroke-1{stroke-width:1}.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-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.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-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm,.text-tremor-default{font-size:.875rem;line-height:1.25rem}.text-tremor-label{font-size:.75rem;line-height:.4rem}.text-tremor-metric{font-size:1.875rem;line-height:2.25rem}.text-tremor-title{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.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-6{line-height:1.5rem}.text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-dark-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-dark-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-dark-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-dark-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-dark-tremor-content-subtle{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-inherit{color:inherit}.text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-tremor-content-subtle{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.accent-dark-tremor-brand,.accent-tremor-brand{accent-color:#6366f1}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow,.shadow-dark-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-dark-tremor-card,.shadow-dark-tremor-input{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-dark-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-tremor-card,.shadow-tremor-dropdown{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-tremor-dropdown{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-input,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-tremor-brand{outline-color:#6366f1}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--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)}.ring-2{--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)}.ring-amber-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 243 199/var(--tw-ring-opacity))}.ring-amber-200{--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity))}.ring-amber-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity))}.ring-amber-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity))}.ring-amber-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 251 235/var(--tw-ring-opacity))}.ring-amber-500{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.ring-amber-600{--tw-ring-opacity:1;--tw-ring-color:rgb(217 119 6/var(--tw-ring-opacity))}.ring-amber-700{--tw-ring-opacity:1;--tw-ring-color:rgb(180 83 9/var(--tw-ring-opacity))}.ring-amber-800{--tw-ring-opacity:1;--tw-ring-color:rgb(146 64 14/var(--tw-ring-opacity))}.ring-amber-900{--tw-ring-opacity:1;--tw-ring-color:rgb(120 53 15/var(--tw-ring-opacity))}.ring-amber-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 26 3/var(--tw-ring-opacity))}.ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity))}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgb(191 219 254/var(--tw-ring-opacity))}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity))}.ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgb(239 246 255/var(--tw-ring-opacity))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity))}.ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgb(29 78 216/var(--tw-ring-opacity))}.ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 64 175/var(--tw-ring-opacity))}.ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgb(30 58 138/var(--tw-ring-opacity))}.ring-blue-950{--tw-ring-opacity:1;--tw-ring-color:rgb(23 37 84/var(--tw-ring-opacity))}.ring-cyan-100{--tw-ring-opacity:1;--tw-ring-color:rgb(207 250 254/var(--tw-ring-opacity))}.ring-cyan-200{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity))}.ring-cyan-300{--tw-ring-opacity:1;--tw-ring-color:rgb(103 232 249/var(--tw-ring-opacity))}.ring-cyan-400{--tw-ring-opacity:1;--tw-ring-color:rgb(34 211 238/var(--tw-ring-opacity))}.ring-cyan-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 254 255/var(--tw-ring-opacity))}.ring-cyan-500{--tw-ring-opacity:1;--tw-ring-color:rgb(6 182 212/var(--tw-ring-opacity))}.ring-cyan-600{--tw-ring-opacity:1;--tw-ring-color:rgb(8 145 178/var(--tw-ring-opacity))}.ring-cyan-700{--tw-ring-opacity:1;--tw-ring-color:rgb(14 116 144/var(--tw-ring-opacity))}.ring-cyan-800{--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity))}.ring-cyan-900{--tw-ring-opacity:1;--tw-ring-color:rgb(22 78 99/var(--tw-ring-opacity))}.ring-cyan-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 51 68/var(--tw-ring-opacity))}.ring-dark-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-emerald-100{--tw-ring-opacity:1;--tw-ring-color:rgb(209 250 229/var(--tw-ring-opacity))}.ring-emerald-200{--tw-ring-opacity:1;--tw-ring-color:rgb(167 243 208/var(--tw-ring-opacity))}.ring-emerald-300{--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity))}.ring-emerald-400{--tw-ring-opacity:1;--tw-ring-color:rgb(52 211 153/var(--tw-ring-opacity))}.ring-emerald-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 253 245/var(--tw-ring-opacity))}.ring-emerald-500{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity))}.ring-emerald-600{--tw-ring-opacity:1;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))}.ring-emerald-700{--tw-ring-opacity:1;--tw-ring-color:rgb(4 120 87/var(--tw-ring-opacity))}.ring-emerald-800{--tw-ring-opacity:1;--tw-ring-color:rgb(6 95 70/var(--tw-ring-opacity))}.ring-emerald-900{--tw-ring-opacity:1;--tw-ring-color:rgb(6 78 59/var(--tw-ring-opacity))}.ring-emerald-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 44 34/var(--tw-ring-opacity))}.ring-fuchsia-100{--tw-ring-opacity:1;--tw-ring-color:rgb(250 232 255/var(--tw-ring-opacity))}.ring-fuchsia-200{--tw-ring-opacity:1;--tw-ring-color:rgb(245 208 254/var(--tw-ring-opacity))}.ring-fuchsia-300{--tw-ring-opacity:1;--tw-ring-color:rgb(240 171 252/var(--tw-ring-opacity))}.ring-fuchsia-400{--tw-ring-opacity:1;--tw-ring-color:rgb(232 121 249/var(--tw-ring-opacity))}.ring-fuchsia-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 244 255/var(--tw-ring-opacity))}.ring-fuchsia-500{--tw-ring-opacity:1;--tw-ring-color:rgb(217 70 239/var(--tw-ring-opacity))}.ring-fuchsia-600{--tw-ring-opacity:1;--tw-ring-color:rgb(192 38 211/var(--tw-ring-opacity))}.ring-fuchsia-700{--tw-ring-opacity:1;--tw-ring-color:rgb(162 28 175/var(--tw-ring-opacity))}.ring-fuchsia-800{--tw-ring-opacity:1;--tw-ring-color:rgb(134 25 143/var(--tw-ring-opacity))}.ring-fuchsia-900{--tw-ring-opacity:1;--tw-ring-color:rgb(112 26 117/var(--tw-ring-opacity))}.ring-fuchsia-950{--tw-ring-opacity:1;--tw-ring-color:rgb(74 4 78/var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 244 246/var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgb(249 250 251/var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81/var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgb(17 24 39/var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgb(3 7 18/var(--tw-ring-opacity))}.ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgb(220 252 231/var(--tw-ring-opacity))}.ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgb(187 247 208/var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity))}.ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgb(74 222 128/var(--tw-ring-opacity))}.ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 244/var(--tw-ring-opacity))}.ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgb(22 163 74/var(--tw-ring-opacity))}.ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgb(21 128 61/var(--tw-ring-opacity))}.ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgb(22 101 52/var(--tw-ring-opacity))}.ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgb(20 83 45/var(--tw-ring-opacity))}.ring-green-950{--tw-ring-opacity:1;--tw-ring-color:rgb(5 46 22/var(--tw-ring-opacity))}.ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 231 255/var(--tw-ring-opacity))}.ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgb(199 210 254/var(--tw-ring-opacity))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity))}.ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgb(129 140 248/var(--tw-ring-opacity))}.ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgb(238 242 255/var(--tw-ring-opacity))}.ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity))}.ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgb(67 56 202/var(--tw-ring-opacity))}.ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgb(55 48 163/var(--tw-ring-opacity))}.ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgb(49 46 129/var(--tw-ring-opacity))}.ring-indigo-950{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}.ring-lime-100{--tw-ring-opacity:1;--tw-ring-color:rgb(236 252 203/var(--tw-ring-opacity))}.ring-lime-200{--tw-ring-opacity:1;--tw-ring-color:rgb(217 249 157/var(--tw-ring-opacity))}.ring-lime-300{--tw-ring-opacity:1;--tw-ring-color:rgb(190 242 100/var(--tw-ring-opacity))}.ring-lime-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 230 53/var(--tw-ring-opacity))}.ring-lime-50{--tw-ring-opacity:1;--tw-ring-color:rgb(247 254 231/var(--tw-ring-opacity))}.ring-lime-500{--tw-ring-opacity:1;--tw-ring-color:rgb(132 204 22/var(--tw-ring-opacity))}.ring-lime-600{--tw-ring-opacity:1;--tw-ring-color:rgb(101 163 13/var(--tw-ring-opacity))}.ring-lime-700{--tw-ring-opacity:1;--tw-ring-color:rgb(77 124 15/var(--tw-ring-opacity))}.ring-lime-800{--tw-ring-opacity:1;--tw-ring-color:rgb(63 98 18/var(--tw-ring-opacity))}.ring-lime-900{--tw-ring-opacity:1;--tw-ring-color:rgb(54 83 20/var(--tw-ring-opacity))}.ring-lime-950{--tw-ring-opacity:1;--tw-ring-color:rgb(26 46 5/var(--tw-ring-opacity))}.ring-neutral-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 245/var(--tw-ring-opacity))}.ring-neutral-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 229 229/var(--tw-ring-opacity))}.ring-neutral-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 212/var(--tw-ring-opacity))}.ring-neutral-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 163 163/var(--tw-ring-opacity))}.ring-neutral-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-neutral-500{--tw-ring-opacity:1;--tw-ring-color:rgb(115 115 115/var(--tw-ring-opacity))}.ring-neutral-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 82/var(--tw-ring-opacity))}.ring-neutral-700{--tw-ring-opacity:1;--tw-ring-color:rgb(64 64 64/var(--tw-ring-opacity))}.ring-neutral-800{--tw-ring-opacity:1;--tw-ring-color:rgb(38 38 38/var(--tw-ring-opacity))}.ring-neutral-900{--tw-ring-opacity:1;--tw-ring-color:rgb(23 23 23/var(--tw-ring-opacity))}.ring-neutral-950{--tw-ring-opacity:1;--tw-ring-color:rgb(10 10 10/var(--tw-ring-opacity))}.ring-orange-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 237 213/var(--tw-ring-opacity))}.ring-orange-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 215 170/var(--tw-ring-opacity))}.ring-orange-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 186 116/var(--tw-ring-opacity))}.ring-orange-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 146 60/var(--tw-ring-opacity))}.ring-orange-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 247 237/var(--tw-ring-opacity))}.ring-orange-500{--tw-ring-opacity:1;--tw-ring-color:rgb(249 115 22/var(--tw-ring-opacity))}.ring-orange-600{--tw-ring-opacity:1;--tw-ring-color:rgb(234 88 12/var(--tw-ring-opacity))}.ring-orange-700{--tw-ring-opacity:1;--tw-ring-color:rgb(194 65 12/var(--tw-ring-opacity))}.ring-orange-800{--tw-ring-opacity:1;--tw-ring-color:rgb(154 52 18/var(--tw-ring-opacity))}.ring-orange-900{--tw-ring-opacity:1;--tw-ring-color:rgb(124 45 18/var(--tw-ring-opacity))}.ring-orange-950{--tw-ring-opacity:1;--tw-ring-color:rgb(67 20 7/var(--tw-ring-opacity))}.ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgb(252 231 243/var(--tw-ring-opacity))}.ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgb(251 207 232/var(--tw-ring-opacity))}.ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgb(249 168 212/var(--tw-ring-opacity))}.ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgb(244 114 182/var(--tw-ring-opacity))}.ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 242 248/var(--tw-ring-opacity))}.ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgb(236 72 153/var(--tw-ring-opacity))}.ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgb(219 39 119/var(--tw-ring-opacity))}.ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 24 93/var(--tw-ring-opacity))}.ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgb(157 23 77/var(--tw-ring-opacity))}.ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgb(131 24 67/var(--tw-ring-opacity))}.ring-pink-950{--tw-ring-opacity:1;--tw-ring-color:rgb(80 7 36/var(--tw-ring-opacity))}.ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 232 255/var(--tw-ring-opacity))}.ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgb(233 213 255/var(--tw-ring-opacity))}.ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgb(216 180 254/var(--tw-ring-opacity))}.ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity))}.ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 245 255/var(--tw-ring-opacity))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity))}.ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgb(147 51 234/var(--tw-ring-opacity))}.ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgb(126 34 206/var(--tw-ring-opacity))}.ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgb(107 33 168/var(--tw-ring-opacity))}.ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgb(88 28 135/var(--tw-ring-opacity))}.ring-purple-950{--tw-ring-opacity:1;--tw-ring-color:rgb(59 7 100/var(--tw-ring-opacity))}.ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 226 226/var(--tw-ring-opacity))}.ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 202 202/var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity))}.ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgb(248 113 113/var(--tw-ring-opacity))}.ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 242 242/var(--tw-ring-opacity))}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgb(185 28 28/var(--tw-ring-opacity))}.ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgb(153 27 27/var(--tw-ring-opacity))}.ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgb(127 29 29/var(--tw-ring-opacity))}.ring-red-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 10 10/var(--tw-ring-opacity))}.ring-rose-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 228 230/var(--tw-ring-opacity))}.ring-rose-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 205 211/var(--tw-ring-opacity))}.ring-rose-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 164 175/var(--tw-ring-opacity))}.ring-rose-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 113 133/var(--tw-ring-opacity))}.ring-rose-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 241 242/var(--tw-ring-opacity))}.ring-rose-500{--tw-ring-opacity:1;--tw-ring-color:rgb(244 63 94/var(--tw-ring-opacity))}.ring-rose-600{--tw-ring-opacity:1;--tw-ring-color:rgb(225 29 72/var(--tw-ring-opacity))}.ring-rose-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 18 60/var(--tw-ring-opacity))}.ring-rose-800{--tw-ring-opacity:1;--tw-ring-color:rgb(159 18 57/var(--tw-ring-opacity))}.ring-rose-900{--tw-ring-opacity:1;--tw-ring-color:rgb(136 19 55/var(--tw-ring-opacity))}.ring-rose-950{--tw-ring-opacity:1;--tw-ring-color:rgb(76 5 25/var(--tw-ring-opacity))}.ring-sky-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 242 254/var(--tw-ring-opacity))}.ring-sky-200{--tw-ring-opacity:1;--tw-ring-color:rgb(186 230 253/var(--tw-ring-opacity))}.ring-sky-300{--tw-ring-opacity:1;--tw-ring-color:rgb(125 211 252/var(--tw-ring-opacity))}.ring-sky-400{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.ring-sky-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 249 255/var(--tw-ring-opacity))}.ring-sky-500{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.ring-sky-600{--tw-ring-opacity:1;--tw-ring-color:rgb(2 132 199/var(--tw-ring-opacity))}.ring-sky-700{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.ring-sky-800{--tw-ring-opacity:1;--tw-ring-color:rgb(7 89 133/var(--tw-ring-opacity))}.ring-sky-900{--tw-ring-opacity:1;--tw-ring-color:rgb(12 74 110/var(--tw-ring-opacity))}.ring-sky-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 47 73/var(--tw-ring-opacity))}.ring-slate-100{--tw-ring-opacity:1;--tw-ring-color:rgb(241 245 249/var(--tw-ring-opacity))}.ring-slate-200{--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity))}.ring-slate-300{--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity))}.ring-slate-400{--tw-ring-opacity:1;--tw-ring-color:rgb(148 163 184/var(--tw-ring-opacity))}.ring-slate-50{--tw-ring-opacity:1;--tw-ring-color:rgb(248 250 252/var(--tw-ring-opacity))}.ring-slate-500{--tw-ring-opacity:1;--tw-ring-color:rgb(100 116 139/var(--tw-ring-opacity))}.ring-slate-600{--tw-ring-opacity:1;--tw-ring-color:rgb(71 85 105/var(--tw-ring-opacity))}.ring-slate-700{--tw-ring-opacity:1;--tw-ring-color:rgb(51 65 85/var(--tw-ring-opacity))}.ring-slate-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 41 59/var(--tw-ring-opacity))}.ring-slate-900{--tw-ring-opacity:1;--tw-ring-color:rgb(15 23 42/var(--tw-ring-opacity))}.ring-slate-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 6 23/var(--tw-ring-opacity))}.ring-stone-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 244/var(--tw-ring-opacity))}.ring-stone-200{--tw-ring-opacity:1;--tw-ring-color:rgb(231 229 228/var(--tw-ring-opacity))}.ring-stone-300{--tw-ring-opacity:1;--tw-ring-color:rgb(214 211 209/var(--tw-ring-opacity))}.ring-stone-400{--tw-ring-opacity:1;--tw-ring-color:rgb(168 162 158/var(--tw-ring-opacity))}.ring-stone-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 249/var(--tw-ring-opacity))}.ring-stone-500{--tw-ring-opacity:1;--tw-ring-color:rgb(120 113 108/var(--tw-ring-opacity))}.ring-stone-600{--tw-ring-opacity:1;--tw-ring-color:rgb(87 83 78/var(--tw-ring-opacity))}.ring-stone-700{--tw-ring-opacity:1;--tw-ring-color:rgb(68 64 60/var(--tw-ring-opacity))}.ring-stone-800{--tw-ring-opacity:1;--tw-ring-color:rgb(41 37 36/var(--tw-ring-opacity))}.ring-stone-900{--tw-ring-opacity:1;--tw-ring-color:rgb(28 25 23/var(--tw-ring-opacity))}.ring-stone-950{--tw-ring-opacity:1;--tw-ring-color:rgb(12 10 9/var(--tw-ring-opacity))}.ring-teal-100{--tw-ring-opacity:1;--tw-ring-color:rgb(204 251 241/var(--tw-ring-opacity))}.ring-teal-200{--tw-ring-opacity:1;--tw-ring-color:rgb(153 246 228/var(--tw-ring-opacity))}.ring-teal-300{--tw-ring-opacity:1;--tw-ring-color:rgb(94 234 212/var(--tw-ring-opacity))}.ring-teal-400{--tw-ring-opacity:1;--tw-ring-color:rgb(45 212 191/var(--tw-ring-opacity))}.ring-teal-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 250/var(--tw-ring-opacity))}.ring-teal-500{--tw-ring-opacity:1;--tw-ring-color:rgb(20 184 166/var(--tw-ring-opacity))}.ring-teal-600{--tw-ring-opacity:1;--tw-ring-color:rgb(13 148 136/var(--tw-ring-opacity))}.ring-teal-700{--tw-ring-opacity:1;--tw-ring-color:rgb(15 118 110/var(--tw-ring-opacity))}.ring-teal-800{--tw-ring-opacity:1;--tw-ring-color:rgb(17 94 89/var(--tw-ring-opacity))}.ring-teal-900{--tw-ring-opacity:1;--tw-ring-color:rgb(19 78 74/var(--tw-ring-opacity))}.ring-teal-950{--tw-ring-opacity:1;--tw-ring-color:rgb(4 47 46/var(--tw-ring-opacity))}.ring-tremor-brand-inverted{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-tremor-brand-muted{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.ring-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-violet-100{--tw-ring-opacity:1;--tw-ring-color:rgb(237 233 254/var(--tw-ring-opacity))}.ring-violet-200{--tw-ring-opacity:1;--tw-ring-color:rgb(221 214 254/var(--tw-ring-opacity))}.ring-violet-300{--tw-ring-opacity:1;--tw-ring-color:rgb(196 181 253/var(--tw-ring-opacity))}.ring-violet-400{--tw-ring-opacity:1;--tw-ring-color:rgb(167 139 250/var(--tw-ring-opacity))}.ring-violet-50{--tw-ring-opacity:1;--tw-ring-color:rgb(245 243 255/var(--tw-ring-opacity))}.ring-violet-500{--tw-ring-opacity:1;--tw-ring-color:rgb(139 92 246/var(--tw-ring-opacity))}.ring-violet-600{--tw-ring-opacity:1;--tw-ring-color:rgb(124 58 237/var(--tw-ring-opacity))}.ring-violet-700{--tw-ring-opacity:1;--tw-ring-color:rgb(109 40 217/var(--tw-ring-opacity))}.ring-violet-800{--tw-ring-opacity:1;--tw-ring-color:rgb(91 33 182/var(--tw-ring-opacity))}.ring-violet-900{--tw-ring-opacity:1;--tw-ring-color:rgb(76 29 149/var(--tw-ring-opacity))}.ring-violet-950{--tw-ring-opacity:1;--tw-ring-color:rgb(46 16 101/var(--tw-ring-opacity))}.ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 249 195/var(--tw-ring-opacity))}.ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 240 138/var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 224 71/var(--tw-ring-opacity))}.ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgb(250 204 21/var(--tw-ring-opacity))}.ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 252 232/var(--tw-ring-opacity))}.ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgb(234 179 8/var(--tw-ring-opacity))}.ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgb(202 138 4/var(--tw-ring-opacity))}.ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgb(161 98 7/var(--tw-ring-opacity))}.ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgb(133 77 14/var(--tw-ring-opacity))}.ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgb(113 63 18/var(--tw-ring-opacity))}.ring-yellow-950{--tw-ring-opacity:1;--tw-ring-color:rgb(66 32 6/var(--tw-ring-opacity))}.ring-zinc-100{--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity))}.ring-zinc-200{--tw-ring-opacity:1;--tw-ring-color:rgb(228 228 231/var(--tw-ring-opacity))}.ring-zinc-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 216/var(--tw-ring-opacity))}.ring-zinc-400{--tw-ring-opacity:1;--tw-ring-color:rgb(161 161 170/var(--tw-ring-opacity))}.ring-zinc-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-zinc-500{--tw-ring-opacity:1;--tw-ring-color:rgb(113 113 122/var(--tw-ring-opacity))}.ring-zinc-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 91/var(--tw-ring-opacity))}.ring-zinc-700{--tw-ring-opacity:1;--tw-ring-color:rgb(63 63 70/var(--tw-ring-opacity))}.ring-zinc-800{--tw-ring-opacity:1;--tw-ring-color:rgb(39 39 42/var(--tw-ring-opacity))}.ring-zinc-900{--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity))}.ring-zinc-950{--tw-ring-opacity:1;--tw-ring-color:rgb(9 9 11/var(--tw-ring-opacity))}.ring-opacity-40{--tw-ring-opacity:0.4}.blur{--tw-blur:blur(8px)}.blur,.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.\[scrollbar-width\:none\]{scrollbar-width:none}:root{--foreground-rgb:0,0,0;--background-start-rgb:255,255,255;--background-end-rgb:255,255,255}body{color:rgb(var(--foreground-rgb));background:linear-gradient(to bottom,transparent,rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb))}.placeholder\:text-tremor-content::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.first\:rounded-l-\[4px\]:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.last\:rounded-r-\[4px\]:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.focus-within\:relative:focus-within{position:relative}.hover\:border-b-2:hover{border-bottom-width:2px}.hover\:border-amber-100:hover{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.hover\:border-amber-200:hover{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.hover\:border-amber-300:hover{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.hover\:border-amber-400:hover{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.hover\:border-amber-50:hover{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.hover\:border-amber-500:hover{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.hover\:border-amber-600:hover{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.hover\:border-amber-700:hover{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.hover\:border-amber-800:hover{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.hover\:border-amber-900:hover{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.hover\:border-amber-950:hover{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.hover\:border-blue-950:hover{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.hover\:border-cyan-100:hover{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.hover\:border-cyan-200:hover{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.hover\:border-cyan-300:hover{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.hover\:border-cyan-400:hover{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.hover\:border-cyan-50:hover{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.hover\:border-cyan-500:hover{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.hover\:border-cyan-600:hover{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.hover\:border-cyan-700:hover{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.hover\:border-cyan-800:hover{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.hover\:border-cyan-900:hover{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.hover\:border-cyan-950:hover{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.hover\:border-emerald-100:hover{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.hover\:border-emerald-200:hover{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.hover\:border-emerald-300:hover{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.hover\:border-emerald-400:hover{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.hover\:border-emerald-50:hover{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.hover\:border-emerald-500:hover{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.hover\:border-emerald-600:hover{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.hover\:border-emerald-700:hover{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.hover\:border-emerald-800:hover{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.hover\:border-emerald-900:hover{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.hover\:border-emerald-950:hover{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.hover\:border-fuchsia-100:hover{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.hover\:border-fuchsia-200:hover{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.hover\:border-fuchsia-300:hover{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.hover\:border-fuchsia-400:hover{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.hover\:border-fuchsia-50:hover{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.hover\:border-fuchsia-500:hover{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.hover\:border-fuchsia-600:hover{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.hover\:border-fuchsia-700:hover{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.hover\:border-fuchsia-800:hover{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.hover\:border-fuchsia-900:hover{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.hover\:border-fuchsia-950:hover{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.hover\:border-gray-950:hover{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.hover\:border-green-950:hover{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.hover\:border-indigo-950:hover{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.hover\:border-lime-100:hover{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.hover\:border-lime-200:hover{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.hover\:border-lime-300:hover{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.hover\:border-lime-400:hover{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.hover\:border-lime-50:hover{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.hover\:border-lime-500:hover{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.hover\:border-lime-600:hover{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.hover\:border-lime-700:hover{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.hover\:border-lime-800:hover{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.hover\:border-lime-900:hover{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.hover\:border-lime-950:hover{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.hover\:border-neutral-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.hover\:border-neutral-200:hover{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.hover\:border-neutral-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.hover\:border-neutral-400:hover{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.hover\:border-neutral-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-neutral-500:hover{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.hover\:border-neutral-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.hover\:border-neutral-700:hover{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.hover\:border-neutral-800:hover{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.hover\:border-neutral-900:hover{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.hover\:border-neutral-950:hover{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.hover\:border-orange-100:hover{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.hover\:border-orange-200:hover{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.hover\:border-orange-300:hover{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.hover\:border-orange-400:hover{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.hover\:border-orange-50:hover{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.hover\:border-orange-600:hover{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.hover\:border-orange-700:hover{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.hover\:border-orange-800:hover{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.hover\:border-orange-900:hover{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.hover\:border-orange-950:hover{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.hover\:border-pink-950:hover{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.hover\:border-purple-950:hover{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.hover\:border-red-950:hover{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.hover\:border-rose-100:hover{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.hover\:border-rose-200:hover{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.hover\:border-rose-300:hover{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.hover\:border-rose-400:hover{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.hover\:border-rose-50:hover{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.hover\:border-rose-500:hover{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.hover\:border-rose-600:hover{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.hover\:border-rose-700:hover{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.hover\:border-rose-800:hover{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.hover\:border-rose-900:hover{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.hover\:border-rose-950:hover{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.hover\:border-sky-100:hover{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.hover\:border-sky-200:hover{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.hover\:border-sky-300:hover{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.hover\:border-sky-400:hover{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.hover\:border-sky-50:hover{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.hover\:border-sky-500:hover{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.hover\:border-sky-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-sky-700:hover{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.hover\:border-sky-800:hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.hover\:border-sky-900:hover{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.hover\:border-sky-950:hover{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.hover\:border-slate-100:hover{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.hover\:border-slate-200:hover{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.hover\:border-slate-300:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.hover\:border-slate-400:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.hover\:border-slate-50:hover{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.hover\:border-slate-500:hover{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.hover\:border-slate-600:hover{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.hover\:border-slate-700:hover{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.hover\:border-slate-800:hover{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.hover\:border-slate-900:hover{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.hover\:border-slate-950:hover{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.hover\:border-stone-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.hover\:border-stone-200:hover{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.hover\:border-stone-300:hover{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.hover\:border-stone-400:hover{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.hover\:border-stone-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.hover\:border-stone-500:hover{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.hover\:border-stone-600:hover{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.hover\:border-stone-700:hover{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.hover\:border-stone-800:hover{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.hover\:border-stone-900:hover{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.hover\:border-stone-950:hover{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.hover\:border-teal-100:hover{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.hover\:border-teal-200:hover{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.hover\:border-teal-300:hover{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.hover\:border-teal-400:hover{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.hover\:border-teal-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.hover\:border-teal-500:hover{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.hover\:border-teal-600:hover{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.hover\:border-teal-700:hover{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.hover\:border-teal-800:hover{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.hover\:border-teal-900:hover{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.hover\:border-teal-950:hover{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.hover\:border-tremor-brand-emphasis:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-tremor-content:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-violet-100:hover{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.hover\:border-violet-200:hover{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.hover\:border-violet-300:hover{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.hover\:border-violet-400:hover{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.hover\:border-violet-50:hover{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.hover\:border-violet-500:hover{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.hover\:border-violet-600:hover{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.hover\:border-violet-700:hover{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.hover\:border-violet-800:hover{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.hover\:border-violet-900:hover{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.hover\:border-violet-950:hover{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.hover\:border-yellow-950:hover{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.hover\:border-zinc-100:hover{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.hover\:border-zinc-200:hover{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.hover\:border-zinc-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:border-zinc-400:hover{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.hover\:border-zinc-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-zinc-500:hover{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.hover\:border-zinc-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.hover\:border-zinc-700:hover{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.hover\:border-zinc-800:hover{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.hover\:border-zinc-900:hover{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.hover\:border-zinc-950:hover{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.hover\:bg-amber-100:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.hover\:bg-amber-200:hover{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.hover\:bg-amber-300:hover{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.hover\:bg-amber-400:hover{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.hover\:bg-amber-50:hover{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.hover\:bg-amber-700:hover{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.hover\:bg-amber-800:hover{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.hover\:bg-amber-900:hover{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.hover\:bg-amber-950:hover{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.hover\:bg-blue-950:hover{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.hover\:bg-cyan-100:hover{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.hover\:bg-cyan-200:hover{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.hover\:bg-cyan-300:hover{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.hover\:bg-cyan-400:hover{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.hover\:bg-cyan-50:hover{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.hover\:bg-cyan-500:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.hover\:bg-cyan-600:hover{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.hover\:bg-cyan-700:hover{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.hover\:bg-cyan-800:hover{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.hover\:bg-cyan-900:hover{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.hover\:bg-cyan-950:hover{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.hover\:bg-emerald-100:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.hover\:bg-emerald-200:hover{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.hover\:bg-emerald-300:hover{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.hover\:bg-emerald-400:hover{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.hover\:bg-emerald-800:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.hover\:bg-emerald-900:hover{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.hover\:bg-emerald-950:hover{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.hover\:bg-fuchsia-100:hover{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-200:hover{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.hover\:bg-fuchsia-300:hover{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.hover\:bg-fuchsia-400:hover{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.hover\:bg-fuchsia-50:hover{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-500:hover{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.hover\:bg-fuchsia-600:hover{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.hover\:bg-fuchsia-700:hover{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.hover\:bg-fuchsia-800:hover{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.hover\:bg-fuchsia-900:hover{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.hover\:bg-fuchsia-950:hover{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.hover\:bg-gray-950:hover{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.hover\:bg-green-950:hover{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.hover\:bg-indigo-950:hover{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.hover\:bg-lime-100:hover{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.hover\:bg-lime-200:hover{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.hover\:bg-lime-300:hover{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.hover\:bg-lime-400:hover{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.hover\:bg-lime-50:hover{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.hover\:bg-lime-500:hover{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.hover\:bg-lime-600:hover{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.hover\:bg-lime-700:hover{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.hover\:bg-lime-800:hover{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.hover\:bg-lime-900:hover{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.hover\:bg-lime-950:hover{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.hover\:bg-neutral-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.hover\:bg-neutral-200:hover{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.hover\:bg-neutral-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.hover\:bg-neutral-400:hover{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.hover\:bg-neutral-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-neutral-500:hover{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.hover\:bg-neutral-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.hover\:bg-neutral-700:hover{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.hover\:bg-neutral-800:hover{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.hover\:bg-neutral-900:hover{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.hover\:bg-neutral-950:hover{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.hover\:bg-orange-100:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.hover\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.hover\:bg-orange-300:hover{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.hover\:bg-orange-400:hover{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.hover\:bg-orange-50:hover{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.hover\:bg-orange-800:hover{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.hover\:bg-orange-900:hover{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.hover\:bg-orange-950:hover{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.hover\:bg-pink-950:hover{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.hover\:bg-purple-950:hover{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.hover\:bg-red-950:hover{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.hover\:bg-rose-100:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.hover\:bg-rose-200:hover{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.hover\:bg-rose-300:hover{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.hover\:bg-rose-400:hover{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.hover\:bg-rose-50:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.hover\:bg-rose-500:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.hover\:bg-rose-600:hover{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.hover\:bg-rose-700:hover{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.hover\:bg-rose-800:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.hover\:bg-rose-900:hover{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.hover\:bg-rose-950:hover{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.hover\:bg-sky-100:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.hover\:bg-sky-200:hover{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.hover\:bg-sky-300:hover{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.hover\:bg-sky-400:hover{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.hover\:bg-sky-50:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.hover\:bg-sky-500:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.hover\:bg-sky-600:hover{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.hover\:bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.hover\:bg-sky-800:hover{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.hover\:bg-sky-900:hover{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.hover\:bg-sky-950:hover{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-slate-300:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.hover\:bg-slate-400:hover{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\:bg-slate-500:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.hover\:bg-slate-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.hover\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.hover\:bg-slate-900:hover{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.hover\:bg-slate-950:hover{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.hover\:bg-stone-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.hover\:bg-stone-200:hover{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.hover\:bg-stone-300:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.hover\:bg-stone-400:hover{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.hover\:bg-stone-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.hover\:bg-stone-500:hover{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.hover\:bg-stone-600:hover{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.hover\:bg-stone-700:hover{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.hover\:bg-stone-800:hover{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.hover\:bg-stone-900:hover{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.hover\:bg-stone-950:hover{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.hover\:bg-teal-100:hover{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.hover\:bg-teal-200:hover{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.hover\:bg-teal-300:hover{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.hover\:bg-teal-400:hover{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.hover\:bg-teal-500:hover{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.hover\:bg-teal-700:hover{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.hover\:bg-teal-800:hover{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.hover\:bg-teal-900:hover{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.hover\:bg-teal-950:hover{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.hover\:bg-tremor-background-muted:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-tremor-background-subtle:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-emphasis:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-faint:hover{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.hover\:bg-violet-100:hover{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.hover\:bg-violet-200:hover{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.hover\:bg-violet-300:hover{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.hover\:bg-violet-400:hover{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.hover\:bg-violet-50:hover{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.hover\:bg-violet-500:hover{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.hover\:bg-violet-600:hover{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.hover\:bg-violet-800:hover{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.hover\:bg-violet-900:hover{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.hover\:bg-violet-950:hover{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.hover\:bg-yellow-950:hover{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.hover\:bg-zinc-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.hover\:bg-zinc-200:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.hover\:bg-zinc-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.hover\:bg-zinc-400:hover{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-zinc-500:hover{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.hover\:bg-zinc-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.hover\:bg-zinc-700:hover{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.hover\:bg-zinc-800:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.hover\:bg-zinc-900:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.hover\:bg-zinc-950:hover{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.hover\:text-amber-100:hover{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.hover\:text-amber-200:hover{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.hover\:text-amber-300:hover{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.hover\:text-amber-400:hover{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.hover\:text-amber-50:hover{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.hover\:text-amber-500:hover{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.hover\:text-amber-600:hover{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.hover\:text-amber-700:hover{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.hover\:text-amber-800:hover{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.hover\:text-amber-900:hover{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.hover\:text-amber-950:hover{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.hover\:text-blue-950:hover{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.hover\:text-cyan-100:hover{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.hover\:text-cyan-200:hover{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.hover\:text-cyan-300:hover{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.hover\:text-cyan-400:hover{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.hover\:text-cyan-50:hover{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.hover\:text-cyan-500:hover{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.hover\:text-cyan-600:hover{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.hover\:text-cyan-700:hover{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.hover\:text-cyan-800:hover{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.hover\:text-cyan-900:hover{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.hover\:text-cyan-950:hover{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.hover\:text-emerald-100:hover{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.hover\:text-emerald-200:hover{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.hover\:text-emerald-300:hover{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.hover\:text-emerald-400:hover{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.hover\:text-emerald-50:hover{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.hover\:text-emerald-500:hover{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.hover\:text-emerald-800:hover{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.hover\:text-emerald-900:hover{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.hover\:text-emerald-950:hover{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.hover\:text-fuchsia-100:hover{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.hover\:text-fuchsia-200:hover{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.hover\:text-fuchsia-300:hover{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.hover\:text-fuchsia-400:hover{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.hover\:text-fuchsia-50:hover{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.hover\:text-fuchsia-500:hover{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.hover\:text-fuchsia-600:hover{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.hover\:text-fuchsia-700:hover{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.hover\:text-fuchsia-800:hover{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.hover\:text-fuchsia-900:hover{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.hover\:text-fuchsia-950:hover{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-gray-950:hover{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.hover\:text-green-100:hover{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.hover\:text-green-200:hover{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.hover\:text-green-300:hover{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.hover\:text-green-400:hover{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.hover\:text-green-50:hover{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.hover\:text-green-500:hover{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.hover\:text-green-700:hover{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.hover\:text-green-800:hover{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.hover\:text-green-950:hover{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.hover\:text-indigo-950:hover{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.hover\:text-lime-100:hover{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.hover\:text-lime-200:hover{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.hover\:text-lime-300:hover{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.hover\:text-lime-400:hover{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.hover\:text-lime-50:hover{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.hover\:text-lime-500:hover{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.hover\:text-lime-600:hover{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.hover\:text-lime-700:hover{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.hover\:text-lime-800:hover{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.hover\:text-lime-900:hover{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.hover\:text-lime-950:hover{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.hover\:text-neutral-100:hover{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.hover\:text-neutral-200:hover{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.hover\:text-neutral-300:hover{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.hover\:text-neutral-400:hover{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.hover\:text-neutral-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-neutral-500:hover{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.hover\:text-neutral-600:hover{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.hover\:text-neutral-700:hover{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.hover\:text-neutral-900:hover{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.hover\:text-neutral-950:hover{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.hover\:text-orange-100:hover{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.hover\:text-orange-200:hover{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.hover\:text-orange-300:hover{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.hover\:text-orange-400:hover{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.hover\:text-orange-50:hover{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.hover\:text-orange-500:hover{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.hover\:text-orange-700:hover{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.hover\:text-orange-800:hover{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.hover\:text-orange-900:hover{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.hover\:text-orange-950:hover{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.hover\:text-pink-950:hover{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.hover\:text-purple-950:hover{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.hover\:text-red-100:hover{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.hover\:text-red-200:hover{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.hover\:text-red-50:hover{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.hover\:text-red-950:hover{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.hover\:text-rose-100:hover{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.hover\:text-rose-200:hover{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.hover\:text-rose-300:hover{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.hover\:text-rose-400:hover{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.hover\:text-rose-50:hover{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.hover\:text-rose-500:hover{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.hover\:text-rose-600:hover{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.hover\:text-rose-700:hover{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.hover\:text-rose-800:hover{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.hover\:text-rose-900:hover{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.hover\:text-rose-950:hover{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.hover\:text-sky-100:hover{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.hover\:text-sky-200:hover{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.hover\:text-sky-300:hover{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.hover\:text-sky-400:hover{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.hover\:text-sky-50:hover{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.hover\:text-sky-500:hover{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.hover\:text-sky-600:hover{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.hover\:text-sky-700:hover{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.hover\:text-sky-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-sky-900:hover{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.hover\:text-sky-950:hover{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.hover\:text-slate-100:hover{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.hover\:text-slate-200:hover{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.hover\:text-slate-300:hover{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.hover\:text-slate-400:hover{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.hover\:text-slate-50:hover{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.hover\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\:text-slate-800:hover{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:text-slate-950:hover{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.hover\:text-stone-100:hover{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.hover\:text-stone-200:hover{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.hover\:text-stone-300:hover{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.hover\:text-stone-400:hover{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.hover\:text-stone-50:hover{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.hover\:text-stone-500:hover{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.hover\:text-stone-600:hover{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.hover\:text-stone-700:hover{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.hover\:text-stone-800:hover{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.hover\:text-stone-900:hover{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.hover\:text-stone-950:hover{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.hover\:text-teal-100:hover{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.hover\:text-teal-200:hover{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.hover\:text-teal-300:hover{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.hover\:text-teal-400:hover{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.hover\:text-teal-50:hover{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.hover\:text-teal-500:hover{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.hover\:text-teal-600:hover{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.hover\:text-teal-700:hover{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.hover\:text-teal-800:hover{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.hover\:text-teal-900:hover{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.hover\:text-teal-950:hover{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.hover\:text-tremor-brand-emphasis:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-tremor-content:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-tremor-content-emphasis:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-violet-100:hover{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.hover\:text-violet-200:hover{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.hover\:text-violet-300:hover{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.hover\:text-violet-400:hover{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.hover\:text-violet-50:hover{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.hover\:text-violet-500:hover{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.hover\:text-violet-600:hover{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.hover\:text-violet-700:hover{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.hover\:text-violet-800:hover{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.hover\:text-violet-900:hover{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.hover\:text-violet-950:hover{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.hover\:text-yellow-950:hover{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.hover\:text-zinc-100:hover{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.hover\:text-zinc-200:hover{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.hover\:text-zinc-300:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.hover\:text-zinc-400:hover{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.hover\:text-zinc-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-zinc-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.hover\:text-zinc-800:hover{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.hover\:text-zinc-950:hover{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-tremor-brand-subtle:focus{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0: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(0px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.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)}.focus\:ring-tremor-brand-muted:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.group:active .group-active\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.aria-selected\:\!bg-tremor-background-subtle[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity))!important}.aria-selected\:bg-tremor-background-emphasis[aria-selected=true]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.aria-selected\:\!text-tremor-content[aria-selected=true]{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.aria-selected\:text-tremor-brand-inverted[aria-selected=true],.aria-selected\:text-tremor-content-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.ui-selected\:border-b-2[data-headlessui-state~=selected]{border-bottom-width:2px}.ui-selected\:border-amber-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.ui-selected\:border-amber-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.ui-selected\:border-amber-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.ui-selected\:border-amber-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.ui-selected\:border-amber-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.ui-selected\:border-amber-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.ui-selected\:border-amber-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.ui-selected\:border-amber-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.ui-selected\:border-amber-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.ui-selected\:border-amber-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.ui-selected\:border-amber-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.ui-selected\:border-blue-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.ui-selected\:border-blue-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.ui-selected\:border-blue-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.ui-selected\:border-blue-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.ui-selected\:border-blue-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.ui-selected\:border-blue-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.ui-selected\:border-blue-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ui-selected\:border-blue-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.ui-selected\:border-blue-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.ui-selected\:border-blue-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.ui-selected\:border-blue-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.ui-selected\:border-cyan-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.ui-selected\:border-cyan-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.ui-selected\:border-cyan-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.ui-selected\:border-cyan-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.ui-selected\:border-cyan-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.ui-selected\:border-cyan-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.ui-selected\:border-cyan-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.ui-selected\:border-cyan-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.ui-selected\:border-cyan-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.ui-selected\:border-cyan-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.ui-selected\:border-cyan-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.ui-selected\:border-emerald-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.ui-selected\:border-emerald-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.ui-selected\:border-emerald-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.ui-selected\:border-emerald-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.ui-selected\:border-emerald-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.ui-selected\:border-emerald-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.ui-selected\:border-emerald-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.ui-selected\:border-emerald-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.ui-selected\:border-emerald-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.ui-selected\:border-emerald-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.ui-selected\:border-emerald-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.ui-selected\:border-gray-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.ui-selected\:border-gray-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-gray-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.ui-selected\:border-gray-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.ui-selected\:border-gray-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.ui-selected\:border-gray-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.ui-selected\:border-gray-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.ui-selected\:border-gray-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.ui-selected\:border-gray-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.ui-selected\:border-gray-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.ui-selected\:border-gray-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.ui-selected\:border-green-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.ui-selected\:border-green-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.ui-selected\:border-green-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.ui-selected\:border-green-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.ui-selected\:border-green-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.ui-selected\:border-green-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.ui-selected\:border-green-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ui-selected\:border-green-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.ui-selected\:border-green-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.ui-selected\:border-green-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.ui-selected\:border-green-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.ui-selected\:border-indigo-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.ui-selected\:border-indigo-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.ui-selected\:border-indigo-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.ui-selected\:border-indigo-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-indigo-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.ui-selected\:border-indigo-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.ui-selected\:border-indigo-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.ui-selected\:border-indigo-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.ui-selected\:border-indigo-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.ui-selected\:border-lime-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.ui-selected\:border-lime-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.ui-selected\:border-lime-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.ui-selected\:border-lime-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.ui-selected\:border-lime-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.ui-selected\:border-lime-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.ui-selected\:border-lime-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.ui-selected\:border-lime-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.ui-selected\:border-lime-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.ui-selected\:border-lime-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.ui-selected\:border-lime-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.ui-selected\:border-neutral-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.ui-selected\:border-neutral-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.ui-selected\:border-neutral-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.ui-selected\:border-neutral-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.ui-selected\:border-neutral-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-neutral-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.ui-selected\:border-neutral-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.ui-selected\:border-neutral-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.ui-selected\:border-neutral-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.ui-selected\:border-neutral-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.ui-selected\:border-neutral-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.ui-selected\:border-orange-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.ui-selected\:border-orange-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.ui-selected\:border-orange-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.ui-selected\:border-orange-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.ui-selected\:border-orange-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.ui-selected\:border-orange-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.ui-selected\:border-orange-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.ui-selected\:border-orange-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.ui-selected\:border-orange-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.ui-selected\:border-orange-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.ui-selected\:border-orange-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.ui-selected\:border-pink-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.ui-selected\:border-pink-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.ui-selected\:border-pink-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.ui-selected\:border-pink-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.ui-selected\:border-pink-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.ui-selected\:border-pink-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.ui-selected\:border-pink-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.ui-selected\:border-pink-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.ui-selected\:border-pink-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.ui-selected\:border-pink-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.ui-selected\:border-pink-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.ui-selected\:border-purple-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.ui-selected\:border-purple-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.ui-selected\:border-purple-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.ui-selected\:border-purple-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.ui-selected\:border-purple-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.ui-selected\:border-purple-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.ui-selected\:border-purple-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ui-selected\:border-purple-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.ui-selected\:border-purple-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.ui-selected\:border-purple-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.ui-selected\:border-purple-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.ui-selected\:border-red-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.ui-selected\:border-red-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.ui-selected\:border-red-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.ui-selected\:border-red-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.ui-selected\:border-red-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.ui-selected\:border-red-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.ui-selected\:border-red-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ui-selected\:border-red-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.ui-selected\:border-red-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.ui-selected\:border-red-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.ui-selected\:border-red-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.ui-selected\:border-rose-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.ui-selected\:border-rose-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.ui-selected\:border-rose-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.ui-selected\:border-rose-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.ui-selected\:border-rose-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.ui-selected\:border-rose-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.ui-selected\:border-rose-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.ui-selected\:border-rose-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.ui-selected\:border-rose-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.ui-selected\:border-rose-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.ui-selected\:border-rose-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.ui-selected\:border-sky-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.ui-selected\:border-sky-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.ui-selected\:border-sky-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.ui-selected\:border-sky-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.ui-selected\:border-sky-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.ui-selected\:border-sky-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.ui-selected\:border-sky-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.ui-selected\:border-sky-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.ui-selected\:border-sky-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.ui-selected\:border-sky-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.ui-selected\:border-sky-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.ui-selected\:border-slate-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.ui-selected\:border-slate-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.ui-selected\:border-slate-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.ui-selected\:border-slate-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.ui-selected\:border-slate-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.ui-selected\:border-slate-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.ui-selected\:border-slate-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.ui-selected\:border-slate-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.ui-selected\:border-slate-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.ui-selected\:border-slate-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.ui-selected\:border-slate-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.ui-selected\:border-stone-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.ui-selected\:border-stone-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.ui-selected\:border-stone-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ui-selected\:border-stone-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.ui-selected\:border-stone-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.ui-selected\:border-stone-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.ui-selected\:border-stone-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.ui-selected\:border-stone-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.ui-selected\:border-stone-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.ui-selected\:border-stone-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.ui-selected\:border-stone-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.ui-selected\:border-teal-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.ui-selected\:border-teal-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.ui-selected\:border-teal-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.ui-selected\:border-teal-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.ui-selected\:border-teal-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.ui-selected\:border-teal-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.ui-selected\:border-teal-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.ui-selected\:border-teal-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.ui-selected\:border-teal-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.ui-selected\:border-teal-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.ui-selected\:border-teal-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.ui-selected\:border-tremor-border[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-tremor-brand[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-violet-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.ui-selected\:border-violet-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.ui-selected\:border-violet-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.ui-selected\:border-violet-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.ui-selected\:border-violet-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.ui-selected\:border-violet-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.ui-selected\:border-violet-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.ui-selected\:border-violet-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.ui-selected\:border-violet-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.ui-selected\:border-violet-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.ui-selected\:border-violet-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.ui-selected\:border-yellow-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.ui-selected\:border-yellow-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.ui-selected\:border-yellow-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.ui-selected\:border-yellow-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.ui-selected\:border-yellow-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.ui-selected\:border-yellow-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.ui-selected\:border-yellow-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ui-selected\:border-yellow-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.ui-selected\:border-yellow-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.ui-selected\:border-yellow-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.ui-selected\:border-yellow-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.ui-selected\:border-zinc-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.ui-selected\:border-zinc-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.ui-selected\:border-zinc-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.ui-selected\:border-zinc-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.ui-selected\:border-zinc-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-zinc-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.ui-selected\:border-zinc-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.ui-selected\:border-zinc-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.ui-selected\:border-zinc-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.ui-selected\:border-zinc-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.ui-selected\:border-zinc-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.ui-selected\:bg-amber-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.ui-selected\:bg-amber-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.ui-selected\:bg-amber-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.ui-selected\:bg-amber-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.ui-selected\:bg-amber-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.ui-selected\:bg-amber-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.ui-selected\:bg-amber-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.ui-selected\:bg-amber-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.ui-selected\:bg-amber-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.ui-selected\:bg-amber-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.ui-selected\:bg-amber-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.ui-selected\:bg-blue-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.ui-selected\:bg-blue-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.ui-selected\:bg-blue-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.ui-selected\:bg-blue-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.ui-selected\:bg-blue-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.ui-selected\:bg-blue-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.ui-selected\:bg-blue-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.ui-selected\:bg-blue-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.ui-selected\:bg-blue-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.ui-selected\:bg-gray-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.ui-selected\:bg-gray-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.ui-selected\:bg-gray-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.ui-selected\:bg-gray-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.ui-selected\:bg-gray-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-gray-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.ui-selected\:bg-gray-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.ui-selected\:bg-gray-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.ui-selected\:bg-gray-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.ui-selected\:bg-gray-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.ui-selected\:bg-gray-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.ui-selected\:bg-green-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.ui-selected\:bg-green-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.ui-selected\:bg-green-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.ui-selected\:bg-green-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.ui-selected\:bg-green-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.ui-selected\:bg-green-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.ui-selected\:bg-green-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.ui-selected\:bg-green-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.ui-selected\:bg-green-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.ui-selected\:bg-green-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.ui-selected\:bg-green-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.ui-selected\:bg-lime-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.ui-selected\:bg-lime-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.ui-selected\:bg-lime-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.ui-selected\:bg-lime-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.ui-selected\:bg-lime-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.ui-selected\:bg-lime-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.ui-selected\:bg-lime-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.ui-selected\:bg-lime-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.ui-selected\:bg-lime-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.ui-selected\:bg-lime-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.ui-selected\:bg-lime-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-orange-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.ui-selected\:bg-orange-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.ui-selected\:bg-orange-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.ui-selected\:bg-orange-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.ui-selected\:bg-orange-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.ui-selected\:bg-orange-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.ui-selected\:bg-orange-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.ui-selected\:bg-pink-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.ui-selected\:bg-pink-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.ui-selected\:bg-pink-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.ui-selected\:bg-pink-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.ui-selected\:bg-pink-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.ui-selected\:bg-pink-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.ui-selected\:bg-pink-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.ui-selected\:bg-pink-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.ui-selected\:bg-pink-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.ui-selected\:bg-pink-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.ui-selected\:bg-pink-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.ui-selected\:bg-purple-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.ui-selected\:bg-purple-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.ui-selected\:bg-purple-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.ui-selected\:bg-purple-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.ui-selected\:bg-purple-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.ui-selected\:bg-purple-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.ui-selected\:bg-purple-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.ui-selected\:bg-purple-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.ui-selected\:bg-red-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.ui-selected\:bg-red-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.ui-selected\:bg-red-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.ui-selected\:bg-red-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.ui-selected\:bg-red-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.ui-selected\:bg-red-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.ui-selected\:bg-red-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-red-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.ui-selected\:bg-red-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.ui-selected\:bg-red-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.ui-selected\:bg-red-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-rose-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.ui-selected\:bg-rose-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.ui-selected\:bg-rose-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.ui-selected\:bg-rose-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.ui-selected\:bg-rose-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.ui-selected\:bg-rose-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.ui-selected\:bg-rose-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.ui-selected\:bg-rose-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.ui-selected\:bg-rose-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.ui-selected\:bg-rose-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.ui-selected\:bg-rose-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.ui-selected\:bg-sky-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.ui-selected\:bg-sky-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.ui-selected\:bg-sky-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.ui-selected\:bg-sky-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.ui-selected\:bg-sky-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.ui-selected\:bg-sky-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.ui-selected\:bg-sky-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.ui-selected\:bg-sky-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.ui-selected\:bg-sky-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.ui-selected\:bg-sky-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.ui-selected\:bg-sky-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.ui-selected\:bg-slate-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.ui-selected\:bg-slate-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.ui-selected\:bg-slate-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.ui-selected\:bg-slate-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.ui-selected\:bg-slate-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.ui-selected\:bg-slate-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.ui-selected\:bg-slate-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.ui-selected\:bg-slate-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.ui-selected\:bg-slate-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.ui-selected\:bg-slate-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.ui-selected\:bg-slate-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ui-selected\:bg-stone-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ui-selected\:bg-stone-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ui-selected\:bg-stone-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.ui-selected\:bg-stone-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.ui-selected\:bg-stone-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.ui-selected\:bg-stone-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.ui-selected\:bg-stone-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.ui-selected\:bg-stone-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.ui-selected\:bg-stone-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.ui-selected\:bg-teal-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.ui-selected\:bg-teal-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.ui-selected\:bg-teal-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.ui-selected\:bg-teal-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.ui-selected\:bg-teal-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.ui-selected\:bg-teal-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.ui-selected\:bg-teal-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.ui-selected\:bg-teal-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.ui-selected\:bg-teal-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.ui-selected\:bg-teal-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.ui-selected\:bg-teal-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background-muted[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-violet-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.ui-selected\:bg-violet-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.ui-selected\:bg-violet-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.ui-selected\:bg-violet-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.ui-selected\:bg-violet-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.ui-selected\:bg-violet-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.ui-selected\:bg-violet-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.ui-selected\:bg-violet-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.ui-selected\:bg-violet-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.ui-selected\:text-amber-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.ui-selected\:text-amber-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.ui-selected\:text-amber-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.ui-selected\:text-amber-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.ui-selected\:text-amber-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.ui-selected\:text-amber-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.ui-selected\:text-amber-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.ui-selected\:text-amber-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.ui-selected\:text-amber-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.ui-selected\:text-amber-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.ui-selected\:text-amber-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.ui-selected\:text-blue-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.ui-selected\:text-blue-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.ui-selected\:text-blue-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.ui-selected\:text-blue-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ui-selected\:text-blue-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.ui-selected\:text-blue-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.ui-selected\:text-blue-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ui-selected\:text-blue-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.ui-selected\:text-blue-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.ui-selected\:text-blue-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.ui-selected\:text-blue-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.ui-selected\:text-cyan-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.ui-selected\:text-cyan-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.ui-selected\:text-cyan-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.ui-selected\:text-cyan-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.ui-selected\:text-cyan-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.ui-selected\:text-cyan-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.ui-selected\:text-cyan-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.ui-selected\:text-cyan-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.ui-selected\:text-cyan-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.ui-selected\:text-cyan-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.ui-selected\:text-cyan-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-emerald-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.ui-selected\:text-emerald-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.ui-selected\:text-emerald-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.ui-selected\:text-emerald-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.ui-selected\:text-emerald-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.ui-selected\:text-emerald-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.ui-selected\:text-emerald-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.ui-selected\:text-emerald-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.ui-selected\:text-emerald-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.ui-selected\:text-emerald-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.ui-selected\:text-emerald-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.ui-selected\:text-gray-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.ui-selected\:text-gray-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.ui-selected\:text-gray-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.ui-selected\:text-gray-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.ui-selected\:text-gray-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.ui-selected\:text-gray-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.ui-selected\:text-gray-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.ui-selected\:text-gray-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-gray-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.ui-selected\:text-gray-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-gray-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.ui-selected\:text-green-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.ui-selected\:text-green-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.ui-selected\:text-green-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.ui-selected\:text-green-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.ui-selected\:text-green-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.ui-selected\:text-green-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.ui-selected\:text-green-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ui-selected\:text-green-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.ui-selected\:text-green-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.ui-selected\:text-green-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.ui-selected\:text-green-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.ui-selected\:text-indigo-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.ui-selected\:text-indigo-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.ui-selected\:text-indigo-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.ui-selected\:text-indigo-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-indigo-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.ui-selected\:text-indigo-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.ui-selected\:text-indigo-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.ui-selected\:text-indigo-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.ui-selected\:text-indigo-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.ui-selected\:text-lime-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.ui-selected\:text-lime-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.ui-selected\:text-lime-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.ui-selected\:text-lime-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.ui-selected\:text-lime-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.ui-selected\:text-lime-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.ui-selected\:text-lime-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.ui-selected\:text-lime-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.ui-selected\:text-lime-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.ui-selected\:text-lime-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.ui-selected\:text-lime-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.ui-selected\:text-neutral-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.ui-selected\:text-neutral-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.ui-selected\:text-neutral-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.ui-selected\:text-neutral-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.ui-selected\:text-neutral-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-neutral-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.ui-selected\:text-neutral-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.ui-selected\:text-neutral-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.ui-selected\:text-neutral-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.ui-selected\:text-neutral-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.ui-selected\:text-neutral-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.ui-selected\:text-orange-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.ui-selected\:text-orange-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.ui-selected\:text-orange-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.ui-selected\:text-orange-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.ui-selected\:text-orange-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.ui-selected\:text-orange-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.ui-selected\:text-orange-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.ui-selected\:text-orange-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.ui-selected\:text-orange-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.ui-selected\:text-orange-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.ui-selected\:text-orange-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.ui-selected\:text-pink-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.ui-selected\:text-pink-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.ui-selected\:text-pink-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.ui-selected\:text-pink-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.ui-selected\:text-pink-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.ui-selected\:text-pink-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.ui-selected\:text-pink-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.ui-selected\:text-pink-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.ui-selected\:text-pink-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.ui-selected\:text-pink-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.ui-selected\:text-pink-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.ui-selected\:text-purple-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.ui-selected\:text-purple-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.ui-selected\:text-purple-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.ui-selected\:text-purple-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.ui-selected\:text-purple-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.ui-selected\:text-purple-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.ui-selected\:text-purple-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ui-selected\:text-purple-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.ui-selected\:text-purple-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.ui-selected\:text-purple-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.ui-selected\:text-purple-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.ui-selected\:text-red-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.ui-selected\:text-red-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.ui-selected\:text-red-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.ui-selected\:text-red-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.ui-selected\:text-red-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.ui-selected\:text-red-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.ui-selected\:text-red-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ui-selected\:text-red-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.ui-selected\:text-red-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.ui-selected\:text-red-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.ui-selected\:text-red-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.ui-selected\:text-rose-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.ui-selected\:text-rose-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.ui-selected\:text-rose-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.ui-selected\:text-rose-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.ui-selected\:text-rose-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.ui-selected\:text-rose-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.ui-selected\:text-rose-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.ui-selected\:text-rose-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.ui-selected\:text-rose-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.ui-selected\:text-rose-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.ui-selected\:text-rose-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.ui-selected\:text-sky-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.ui-selected\:text-sky-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.ui-selected\:text-sky-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.ui-selected\:text-sky-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.ui-selected\:text-sky-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.ui-selected\:text-sky-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.ui-selected\:text-sky-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.ui-selected\:text-sky-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.ui-selected\:text-sky-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.ui-selected\:text-sky-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.ui-selected\:text-sky-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.ui-selected\:text-slate-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.ui-selected\:text-slate-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.ui-selected\:text-slate-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.ui-selected\:text-slate-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.ui-selected\:text-slate-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.ui-selected\:text-slate-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.ui-selected\:text-slate-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.ui-selected\:text-slate-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.ui-selected\:text-slate-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.ui-selected\:text-slate-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ui-selected\:text-slate-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.ui-selected\:text-stone-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.ui-selected\:text-stone-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.ui-selected\:text-stone-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.ui-selected\:text-stone-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.ui-selected\:text-stone-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.ui-selected\:text-stone-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ui-selected\:text-stone-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ui-selected\:text-stone-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.ui-selected\:text-stone-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.ui-selected\:text-stone-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.ui-selected\:text-stone-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.ui-selected\:text-teal-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.ui-selected\:text-teal-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.ui-selected\:text-teal-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.ui-selected\:text-teal-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.ui-selected\:text-teal-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.ui-selected\:text-teal-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.ui-selected\:text-teal-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.ui-selected\:text-teal-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.ui-selected\:text-teal-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.ui-selected\:text-teal-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.ui-selected\:text-teal-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.ui-selected\:text-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-emphasis[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-strong[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-violet-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.ui-selected\:text-violet-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.ui-selected\:text-violet-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.ui-selected\:text-violet-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.ui-selected\:text-violet-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.ui-selected\:text-violet-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.ui-selected\:text-violet-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.ui-selected\:text-violet-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.ui-selected\:text-violet-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.ui-selected\:text-violet-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.ui-selected\:text-violet-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.ui-selected\:text-yellow-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.ui-selected\:text-yellow-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.ui-selected\:text-yellow-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.ui-selected\:text-yellow-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.ui-selected\:text-yellow-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.ui-selected\:text-yellow-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.ui-selected\:text-yellow-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ui-selected\:text-yellow-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.ui-selected\:text-yellow-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.ui-selected\:text-yellow-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.ui-selected\:text-yellow-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.ui-selected\:text-zinc-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.ui-selected\:text-zinc-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.ui-selected\:text-zinc-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.ui-selected\:text-zinc-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.ui-selected\:text-zinc-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-zinc-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.ui-selected\:text-zinc-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.ui-selected\:text-zinc-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.ui-selected\:text-zinc-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.ui-selected\:text-zinc-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.ui-selected\:text-zinc-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.ui-selected\:shadow-tremor-input[data-headlessui-state~=selected]{--tw-shadow:0 1px 2px 0 rgba(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)}:where([data-headlessui-state~=selected]) .ui-selected\:border-b-2{border-bottom-width:2px}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(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)}.ui-active\:bg-tremor-background-muted[data-headlessui-state~=active]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-active\:text-tremor-content-strong[data-headlessui-state~=active]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=active]) .ui-active\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=active]) .ui-active\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:divide-dark-tremor-border)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}:is(.dark .dark\:border-dark-tremor-background){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-emphasis){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-inverted){--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-subtle){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-emphasis){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-subtle){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-border){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand){--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted){--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted\/70){background-color:rgba(30,27,75,.7)}:is(.dark .dark\:bg-dark-tremor-brand-subtle){--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-content-subtle){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:bg-slate-950\/50){background-color:rgba(2,6,23,.5)}:is(.dark .dark\:bg-opacity-10){--tw-bg-opacity:0.1}:is(.dark .dark\:bg-opacity-25){--tw-bg-opacity:0.25}:is(.dark .dark\:bg-opacity-30){--tw-bg-opacity:0.3}:is(.dark .dark\:from-dark-tremor-background){--tw-gradient-from:#111827 var(--tw-gradient-from-position);--tw-gradient-to:rgba(17,24,39,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(.dark .dark\:to-dark-tremor-background){--tw-gradient-to:#111827 var(--tw-gradient-to-position)}:is(.dark .dark\:fill-dark-tremor-content){fill:#6b7280}:is(.dark .dark\:fill-dark-tremor-content-emphasis){fill:#e5e7eb}:is(.dark .dark\:stroke-dark-tremor-background){stroke:#111827}:is(.dark .dark\:stroke-dark-tremor-border){stroke:#374151}:is(.dark .dark\:stroke-dark-tremor-brand){stroke:#6366f1}:is(.dark .dark\:stroke-dark-tremor-brand-muted){stroke:#1e1b4b}:is(.dark .dark\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-emphasis){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-inverted){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-subtle){--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:accent-dark-tremor-brand){accent-color:#6366f1}:is(.dark .dark\:opacity-25){opacity:.25}:is(.dark .dark\:shadow-dark-tremor-card){--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:shadow-dark-tremor-dropdown){--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(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)}:is(.dark .dark\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:outline-dark-tremor-brand){outline-color:#6366f1}:is(.dark .dark\:ring-dark-tremor-brand-inverted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-brand-muted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-ring){--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-brand-emphasis:hover){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-content-emphasis:hover){--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-muted:hover){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-subtle:hover){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-emphasis:hover){--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-faint:hover){--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-opacity-20:hover){--tw-bg-opacity:0.2}:is(.dark .dark\:hover\:text-dark-tremor-brand-emphasis:hover){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:is(.dark .hover\:dark\:text-dark-tremor-content):hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:focus\:border-dark-tremor-brand-subtle:focus){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .focus\:dark\:border-dark-tremor-brand-subtle):focus{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:focus\:ring-dark-tremor-brand-muted:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .focus\:dark\:ring-dark-tremor-brand-muted):focus{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .group:hover .dark\:group-hover\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .aria-selected\:dark\:\!bg-dark-tremor-background-subtle)[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(31 41 55/var(--tw-bg-opacity))!important}:is(.dark .dark\:aria-selected\:bg-dark-tremor-background-emphasis[aria-selected=true]){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-content-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-border[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-brand[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background-muted[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-emphasis[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-strong[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:shadow-dark-tremor-input[data-headlessui-state~=selected]){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:ui-active\:bg-dark-tremor-background-muted[data-headlessui-state~=active]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-active\:text-dark-tremor-content-strong[data-headlessui-state~=active]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}@media (min-width:640px){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:items-start{align-items:flex-start}.sm\: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)))}.sm\: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))}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}}@media (min-width:768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}}@media (min-width:1024px){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:max-w-\[200px\]{max-width:200px}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button,.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none} \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.html b/litellm/proxy/_experimental/out/index.html index a40ac1ea3..99ac50ef5 100644 --- a/litellm/proxy/_experimental/out/index.html +++ b/litellm/proxy/_experimental/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.txt b/litellm/proxy/_experimental/out/index.txt index 2d9afff4b..a259886a9 100644 --- a/litellm/proxy/_experimental/out/index.txt +++ b/litellm/proxy/_experimental/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[9125,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-ad3e13d2fec661b5.js"],""] +3:I[74961,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-a458360dd75bd774.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["SP1Cm97dc_3zo4HlsJJjg",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/16eb955147cb6b2f.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["HnLepq2YNME88Nzo5qHls",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 1b33c7efd..869de6dde 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -4141,12 +4141,12 @@ async def global_spend_keys( return response -@router.get( +@router.post( "/global/spend/end_users", tags=["Budget & Spend Tracking"], dependencies=[Depends(user_api_key_auth)], ) -async def global_spend_end_users(data: GlobalEndUsersSpend): +async def global_spend_end_users(data: Optional[GlobalEndUsersSpend] = None): """ [BETA] This is a beta endpoint. It will change. @@ -4157,7 +4157,7 @@ async def global_spend_end_users(data: GlobalEndUsersSpend): if prisma_client is None: raise HTTPException(status_code=500, detail={"error": "No db connected"}) - if data.api_key is None: + if data is None: sql_query = f"""SELECT * FROM "Last30dTopEndUsersSpend";""" response = await prisma_client.db.query_raw(query=sql_query) @@ -4170,12 +4170,22 @@ async def global_spend_end_users(data: GlobalEndUsersSpend): response = await prisma_client.db.litellm_spendlogs.group_by( # type: ignore by=["end_user"], where={ - "AND": [{"startTime": {"gte": past_date}}, {"api_key": data.api_key}] + "AND": [{"startTime": {"gte": past_date}}, {"api_key": data.api_key}] # type: ignore }, sum={"spend": True}, order={"_sum": {"spend": "desc"}}, # type: ignore take=100, + count=True, ) + if response is not None and isinstance(response, list): + new_response = [] + for r in response: + new_r = r + new_r["total_spend"] = r["_sum"]["spend"] + new_r["total_count"] = r["_count"]["_all"] + new_r.pop("_sum") + new_r.pop("_count") + new_response.append(new_r) return response diff --git a/ui/litellm-dashboard/out/404.html b/ui/litellm-dashboard/out/404.html index 4c27c5277..9b28cde0b 100644 --- a/ui/litellm-dashboard/out/404.html +++ b/ui/litellm-dashboard/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js b/ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js deleted file mode 100644 index f779caa02..000000000 --- a/ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_buildManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-d6107f1aac0c574c.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB(); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js b/ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js deleted file mode 100644 index 5b3ff592f..000000000 --- a/ui/litellm-dashboard/out/_next/static/SP1Cm97dc_3zo4HlsJJjg/_ssgManifest.js +++ /dev/null @@ -1 +0,0 @@ -self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js b/ui/litellm-dashboard/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js deleted file mode 100644 index e261adc05..000000000 --- a/ui/litellm-dashboard/out/_next/static/chunks/app/layout-a7edbef474fe2e47.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{87421:function(n,e,t){Promise.resolve().then(t.t.bind(t,99646,23)),Promise.resolve().then(t.t.bind(t,63385,23))},63385:function(){},99646:function(n){n.exports={style:{fontFamily:"'__Inter_c23dc8', '__Inter_Fallback_c23dc8'",fontStyle:"normal"},className:"__className_c23dc8"}}},function(n){n.O(0,[971,69,744],function(){return n(n.s=87421)}),_N_E=n.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js deleted file mode 100644 index 3dd5fde9c..000000000 --- a/ui/litellm-dashboard/out/_next/static/chunks/app/page-ad3e13d2fec661b5.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,9125))},9125:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eE}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{c.ZP.info("Making top end users request");let t=await fetch("/global/spend/end_users",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top End users received"),s}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}};var P=s(10384),T=s(46453),E=s(71801),F=s(17189),M=s(12143),R=s(77171),O=s(42539),D=s(88707),U=s(1861);let{Option:L}=F.default;var z=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=M.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),Z=()=>{p(!1),u.resetFields()},y=()=>{p(!1),g(null),u.resetFields()},f=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);m(e=>e?[...e,s]:[s]),g(s.key),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(R.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:Z,onCancel:y,children:(0,l.jsxs)(M.Z,{form:u,onFinish:f,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(O.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(L,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(F.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(F.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(F.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(O.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(O.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(O.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(R.Z,{title:"Save your key",visible:x,onOk:Z,onCancel:y,footer:null,children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)(E.Z,{children:["API Key: ",j]}):(0,l.jsx)(E.Z,{children:"Key being created, this might take 30s"})})]})})]})},q=s(33393),B=s(13810),K=s(61244),V=s(10827),J=s(3851),G=s(2044),W=s(64167),$=s(74480),Y=s(7178),H=s(9853),X=s(56863),Q=s(42440),ee=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},children:"View Spend Report"}),(0,l.jsxs)(R.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(Q.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(X.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(Q.Z,{children:u}),(0,l.jsx)(B.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(H.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},et=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Key Alias"}),(0,l.jsx)($.Z,{children:"Secret Key"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Key Budget (USD)"}),(0,l.jsx)($.Z,{children:"Spend Report"}),(0,l.jsx)($.Z,{children:"Team ID"}),(0,l.jsx)($.Z,{children:"Metadata"}),(0,l.jsx)($.Z,{children:"Models"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)($.Z,{children:"Expires"})]})}),(0,l.jsx)(J.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:null!=e.key_alias?(0,l.jsx)(E.Z,{children:e.key_alias}):(0,l.jsx)(E.Z,{children:"Not Set"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.spend})}),(0,l.jsx)(G.Z,{children:null!=e.max_budget?(0,l.jsx)(E.Z,{children:e.max_budget}):(0,l.jsx)(E.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(ee,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.team_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:null!=e.expires?(0,l.jsx)(E.Z,{children:e.expires}):(0,l.jsx)(E.Z,{children:"Never expires"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{onClick:()=>p(e.token),icon:q.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},es=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(B.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(X.Z,{children:["$",o]}),(0,l.jsxs)(Q.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},el=s(36083),en=s(68967),er=s(27166),ea=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=el.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(er.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},eo=s(37963);console.log("isLocal:",!1);var ei=e=>{let{userID:t,userRole:s,teams:a,setUserRole:o,userEmail:i,setUserEmail:c,setTeams:d}=e,[h,m]=(0,n.useState)(null),[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,eo.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),o(t)}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!h){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),d(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,h,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&o("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(T.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(es,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(et,{userID:t,accessToken:y,data:h,setData:m}),(0,l.jsx)(z,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:h,setData:m}),(0,l.jsx)(ea,{teams:a,setSelectedTeam:b})]})})})},ec=s(5);let{Option:ed}=F.default;var eh=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=M.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(R.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(F.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(ed,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(O.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},em=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:e.model_name})}),(0,l.jsx)(G.Z,{children:e.provider}),(0,l.jsx)(G.Z,{children:e.user_access?(0,l.jsx)(ec.Z,{color:"green",children:"Yes"}):(0,l.jsx)(eh,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(G.Z,{children:e.input_cost}),(0,l.jsx)(G.Z,{children:e.output_cost}),(0,l.jsx)(G.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(B.Z,{children:(0,l.jsxs)(V.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Q.Z,{children:"Pending Requests"}),(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"User ID"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Requested Models"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})})]})]}),(0,l.jsx)(J.Z,{children:d.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},eu=s(92836),ex=s(26734),ep=s(41608),ej=s(32126),eg=s(23682);let{Option:eZ}=F.default;var ey=e=>{let{userID:t,accessToken:s}=e,[r]=M.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(R.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(M.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(O.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(O.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(eZ,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(O.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(R.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ef=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(null),[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(1);return((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await u(t,null,r,!0);console.log("user data response:",e),i(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&!o&&e();let l=async()=>{try{let e=await f(t);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};r&&("Admin"==r||"Admin Viewer"==r)&&!c&&l()},[t,s,r,a]),o&&t&&s&&r&&a)?(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ey,{userID:a,accessToken:t}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(eu.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(eu.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"User ID"}),(0,l.jsx)($.Z,{children:"User Role"}),(0,l.jsx)($.Z,{children:"User Models"}),(0,l.jsx)($.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)($.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)(J.Z,{children:o.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_id}),(0,l.jsx)(G.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(G.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(G.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"End User"}),(0,l.jsx)($.Z,{children:"Spend"}),(0,l.jsx)($.Z,{children:"Total Events"})]})}),(0,l.jsx)(J.Z,{children:null==c?void 0:c.map((e,t)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.end_user}),(0,l.jsx)(G.Z,{children:e.total_spend}),(0,l.jsx)(G.Z,{children:e.total_events})]},t))})]})})]})]})}),function(){if(!o)return null;let e=Math.ceil(o.length/25),t=Math.min(25*h,o.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(h-1)*25+1," – ",t," of ",o.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===h,onClick:()=>m(h-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:h===e,onClick:()=>m(h+1),children:"Next →"})]})]})}()]})}):(0,l.jsx)("div",{children:"Loading..."})},ew=s(8510),ek=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=M.Z.useForm(),[d]=M.Z.useForm(),{Title:h,Paragraph:m}=el.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Team Name"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Budget (USD)"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)(J.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.team_alias}),(0,l.jsx)(G.Z,{children:e.spend}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(R.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(O.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(er.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(R.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},e_=e=>{let{searchParams:t,accessToken:s}=e,[r]=M.Z.useForm(),[a]=M.Z.useForm(),{Title:i,Paragraph:d}=el.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.user_role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(R.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(O.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},eb=s(12968),ev=s(67951);async function eS(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new eb.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eN=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eS(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(B.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{className:"mt-4",children:[(0,l.jsx)(eu.Z,{children:"Chat"}),(0,l.jsx)(eu.Z,{children:"API Reference"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(V.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Chat"})})})}),(0,l.jsx)(J.Z,{children:c.map((e,t)=>(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{children:[(0,l.jsx)(eu.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(eu.Z,{children:"LlamaIndex"}),(0,l.jsx)(eu.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eA=s(33509),eC=s(30569);let{Sider:eI}=eA.default;var eP=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eC.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eC.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eC.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eT=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(P.Z,{numColSpan:2,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Monthly Spend"}),(0,l.jsx)(H.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top API Keys"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Users"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Models"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eE=()=>{let{Title:e,Paragraph:t}=el.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(!0),x=(0,r.useSearchParams)(),p=x.get("userID"),j=x.get("token"),[g,Z]=(0,n.useState)("api-keys"),[y,f]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(j){let e=(0,eo.o)(j);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&Z("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?u("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[j]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:p,userRole:s,userEmail:o,showSSOBanner:m}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eP,{setPage:Z,userRole:s,defaultSelectedKey:null}),"api-keys"==g?(0,l.jsx)(ei,{userID:p,userRole:s,teams:d,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h}):"models"==g?(0,l.jsx)(em,{userID:p,userRole:s,token:j,accessToken:y}):"llm-playground"==g?(0,l.jsx)(eN,{userID:p,userRole:s,token:j,accessToken:y}):"users"==g?(0,l.jsx)(ef,{userID:p,userRole:s,token:j,accessToken:y}):"teams"==g?(0,l.jsx)(ek,{teams:d,setTeams:h,searchParams:x,accessToken:y}):"admin-panel"==g?(0,l.jsx)(e_,{setTeams:h,searchParams:x,accessToken:y}):(0,l.jsx)(eT,{userID:p,userRole:s,token:j,accessToken:y})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/css/16eb955147cb6b2f.css b/ui/litellm-dashboard/out/_next/static/css/16eb955147cb6b2f.css deleted file mode 100644 index 1cab6dc8b..000000000 --- a/ui/litellm-dashboard/out/_next/static/css/16eb955147cb6b2f.css +++ /dev/null @@ -1,5 +0,0 @@ -@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/ec159349637c90ad-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/513657b02c5c193f-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/fd4db3eb5472fc27-s.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/51ed15f9841b9f9d-s.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/05a31a2ca4975f99-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/d6b16ce4a6175f26-s.woff2) format("woff2");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Inter_c23dc8;font-style:normal;font-weight:100 900;font-display:swap;src:url(/ui/_next/static/media/c9a5bc6a7c948fb0-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Inter_Fallback_c23dc8;src:local("Arial");ascent-override:90.20%;descent-override:22.48%;line-gap-override:0.00%;size-adjust:107.40%}.__className_c23dc8{font-family:__Inter_c23dc8,__Inter_Fallback_c23dc8;font-style:normal} - -/* -! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com -*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{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,pre,samp{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}[type=button],[type=reset],[type=submit],button{-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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af}input::placeholder,textarea::placeholder{color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors:active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors:active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media (forced-colors:active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,:after,:before{--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:rgba(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:rgba(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: }.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}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2{left:.5rem}.right-0{right:0}.right-1{right:.25rem}.right-1\/2{right:50%}.right-10{right:2.5rem}.top-0{top:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.m-2{margin:.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-2{margin-top:.5rem;margin-bottom:.5rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-mb-px{margin-bottom:-1px}.-ml-0{margin-left:0}.-ml-0\.5{margin-left:-.125rem}.-ml-1{margin-left:-.25rem}.-ml-1\.5{margin-left:-.375rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.mb-0{margin-bottom:0}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-2\.5{margin-left:.625rem}.ml-px{margin-left:1px}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-8{margin-right:2rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0{height:0}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-\[75vh\]{height:75vh}.h-full{height:100%}.max-h-\[228px\]{max-height:228px}.max-h-\[50vh\]{max-height:50vh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-9{width:2.25rem}.w-\[90\%\]{width:90%}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-screen{width:100vw}.min-w-\[10rem\]{min-width:10rem}.min-w-min{min-width:-moz-min-content;min-width:min-content}.max-w-\[100px\]{max-width:100px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-4{--tw-translate-y:-1rem}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1\/2{--tw-translate-x:50%}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-y-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y:0px}.-rotate-180{--tw-rotate:-180deg}.-rotate-180,.-rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate:-90deg}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.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}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.gap-0{gap:0}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.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)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem * var(--tw-space-x-reverse));margin-left:calc(.125rem * calc(1 - var(--tw-space-x-reverse)))}.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-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem * var(--tw-space-x-reverse));margin-left:calc(2.5rem * 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-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)))}.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-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-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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-tremor-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-clip{overflow-x:clip}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[1px\]{border-radius:1px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-tremor-default{border-radius:.5rem}.rounded-tremor-full{border-radius:9999px}.rounded-tremor-small{border-radius:.375rem}.rounded-b-tremor-default{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-tremor-default{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-tremor-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-tremor-small{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-tremor-default{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-tremor-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-tremor-small{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-tremor-default{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-4{border-right-width:4px}.border-t-4{border-top-width:4px}.border-t-\[1px\]{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.border-dark-tremor-background{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-dark-tremor-border{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-dark-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-dark-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-dark-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-dark-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-tremor-background{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.bg-dark-tremor-background{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-dark-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-dark-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-dark-tremor-brand-emphasis{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-dark-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}.bg-dark-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-dark-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.bg-slate-950\/30{background-color:rgba(2,6,23,.3)}.bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-tremor-background-emphasis{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-tremor-border{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.bg-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(134 136 239/var(--tw-bg-opacity))}.bg-tremor-brand-muted\/50{background-color:rgba(134,136,239,.5)}.bg-tremor-brand-subtle{--tw-bg-opacity:1;background-color:rgb(142 145 235/var(--tw-bg-opacity))}.bg-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.bg-opacity-10{--tw-bg-opacity:0.1}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-opacity-30{--tw-bg-opacity:0.3}.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:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-tremor-background{--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-tremor-background{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.fill-amber-100{fill:#fef3c7}.fill-amber-200{fill:#fde68a}.fill-amber-300{fill:#fcd34d}.fill-amber-400{fill:#fbbf24}.fill-amber-50{fill:#fffbeb}.fill-amber-500{fill:#f59e0b}.fill-amber-600{fill:#d97706}.fill-amber-700{fill:#b45309}.fill-amber-800{fill:#92400e}.fill-amber-900{fill:#78350f}.fill-amber-950{fill:#451a03}.fill-blue-100{fill:#dbeafe}.fill-blue-200{fill:#bfdbfe}.fill-blue-300{fill:#93c5fd}.fill-blue-400{fill:#60a5fa}.fill-blue-50{fill:#eff6ff}.fill-blue-500{fill:#3b82f6}.fill-blue-600{fill:#2563eb}.fill-blue-700{fill:#1d4ed8}.fill-blue-800{fill:#1e40af}.fill-blue-900{fill:#1e3a8a}.fill-blue-950{fill:#172554}.fill-cyan-100{fill:#cffafe}.fill-cyan-200{fill:#a5f3fc}.fill-cyan-300{fill:#67e8f9}.fill-cyan-400{fill:#22d3ee}.fill-cyan-50{fill:#ecfeff}.fill-cyan-500{fill:#06b6d4}.fill-cyan-600{fill:#0891b2}.fill-cyan-700{fill:#0e7490}.fill-cyan-800{fill:#155e75}.fill-cyan-900{fill:#164e63}.fill-cyan-950{fill:#083344}.fill-emerald-100{fill:#d1fae5}.fill-emerald-200{fill:#a7f3d0}.fill-emerald-300{fill:#6ee7b7}.fill-emerald-400{fill:#34d399}.fill-emerald-50{fill:#ecfdf5}.fill-emerald-500{fill:#10b981}.fill-emerald-600{fill:#059669}.fill-emerald-700{fill:#047857}.fill-emerald-800{fill:#065f46}.fill-emerald-900{fill:#064e3b}.fill-emerald-950{fill:#022c22}.fill-fuchsia-100{fill:#fae8ff}.fill-fuchsia-200{fill:#f5d0fe}.fill-fuchsia-300{fill:#f0abfc}.fill-fuchsia-400{fill:#e879f9}.fill-fuchsia-50{fill:#fdf4ff}.fill-fuchsia-500{fill:#d946ef}.fill-fuchsia-600{fill:#c026d3}.fill-fuchsia-700{fill:#a21caf}.fill-fuchsia-800{fill:#86198f}.fill-fuchsia-900{fill:#701a75}.fill-fuchsia-950{fill:#4a044e}.fill-gray-100{fill:#f3f4f6}.fill-gray-200{fill:#e5e7eb}.fill-gray-300{fill:#d1d5db}.fill-gray-400{fill:#9ca3af}.fill-gray-50{fill:#f9fafb}.fill-gray-500{fill:#6b7280}.fill-gray-600{fill:#4b5563}.fill-gray-700{fill:#374151}.fill-gray-800{fill:#1f2937}.fill-gray-900{fill:#111827}.fill-gray-950{fill:#030712}.fill-green-100{fill:#dcfce7}.fill-green-200{fill:#bbf7d0}.fill-green-300{fill:#86efac}.fill-green-400{fill:#4ade80}.fill-green-50{fill:#f0fdf4}.fill-green-500{fill:#22c55e}.fill-green-600{fill:#16a34a}.fill-green-700{fill:#15803d}.fill-green-800{fill:#166534}.fill-green-900{fill:#14532d}.fill-green-950{fill:#052e16}.fill-indigo-100{fill:#e0e7ff}.fill-indigo-200{fill:#c7d2fe}.fill-indigo-300{fill:#a5b4fc}.fill-indigo-400{fill:#818cf8}.fill-indigo-50{fill:#eef2ff}.fill-indigo-500{fill:#6366f1}.fill-indigo-600{fill:#4f46e5}.fill-indigo-700{fill:#4338ca}.fill-indigo-800{fill:#3730a3}.fill-indigo-900{fill:#312e81}.fill-indigo-950{fill:#1e1b4b}.fill-lime-100{fill:#ecfccb}.fill-lime-200{fill:#d9f99d}.fill-lime-300{fill:#bef264}.fill-lime-400{fill:#a3e635}.fill-lime-50{fill:#f7fee7}.fill-lime-500{fill:#84cc16}.fill-lime-600{fill:#65a30d}.fill-lime-700{fill:#4d7c0f}.fill-lime-800{fill:#3f6212}.fill-lime-900{fill:#365314}.fill-lime-950{fill:#1a2e05}.fill-neutral-100{fill:#f5f5f5}.fill-neutral-200{fill:#e5e5e5}.fill-neutral-300{fill:#d4d4d4}.fill-neutral-400{fill:#a3a3a3}.fill-neutral-50{fill:#fafafa}.fill-neutral-500{fill:#737373}.fill-neutral-600{fill:#525252}.fill-neutral-700{fill:#404040}.fill-neutral-800{fill:#262626}.fill-neutral-900{fill:#171717}.fill-neutral-950{fill:#0a0a0a}.fill-orange-100{fill:#ffedd5}.fill-orange-200{fill:#fed7aa}.fill-orange-300{fill:#fdba74}.fill-orange-400{fill:#fb923c}.fill-orange-50{fill:#fff7ed}.fill-orange-500{fill:#f97316}.fill-orange-600{fill:#ea580c}.fill-orange-700{fill:#c2410c}.fill-orange-800{fill:#9a3412}.fill-orange-900{fill:#7c2d12}.fill-orange-950{fill:#431407}.fill-pink-100{fill:#fce7f3}.fill-pink-200{fill:#fbcfe8}.fill-pink-300{fill:#f9a8d4}.fill-pink-400{fill:#f472b6}.fill-pink-50{fill:#fdf2f8}.fill-pink-500{fill:#ec4899}.fill-pink-600{fill:#db2777}.fill-pink-700{fill:#be185d}.fill-pink-800{fill:#9d174d}.fill-pink-900{fill:#831843}.fill-pink-950{fill:#500724}.fill-purple-100{fill:#f3e8ff}.fill-purple-200{fill:#e9d5ff}.fill-purple-300{fill:#d8b4fe}.fill-purple-400{fill:#c084fc}.fill-purple-50{fill:#faf5ff}.fill-purple-500{fill:#a855f7}.fill-purple-600{fill:#9333ea}.fill-purple-700{fill:#7e22ce}.fill-purple-800{fill:#6b21a8}.fill-purple-900{fill:#581c87}.fill-purple-950{fill:#3b0764}.fill-red-100{fill:#fee2e2}.fill-red-200{fill:#fecaca}.fill-red-300{fill:#fca5a5}.fill-red-400{fill:#f87171}.fill-red-50{fill:#fef2f2}.fill-red-500{fill:#ef4444}.fill-red-600{fill:#dc2626}.fill-red-700{fill:#b91c1c}.fill-red-800{fill:#991b1b}.fill-red-900{fill:#7f1d1d}.fill-red-950{fill:#450a0a}.fill-rose-100{fill:#ffe4e6}.fill-rose-200{fill:#fecdd3}.fill-rose-300{fill:#fda4af}.fill-rose-400{fill:#fb7185}.fill-rose-50{fill:#fff1f2}.fill-rose-500{fill:#f43f5e}.fill-rose-600{fill:#e11d48}.fill-rose-700{fill:#be123c}.fill-rose-800{fill:#9f1239}.fill-rose-900{fill:#881337}.fill-rose-950{fill:#4c0519}.fill-sky-100{fill:#e0f2fe}.fill-sky-200{fill:#bae6fd}.fill-sky-300{fill:#7dd3fc}.fill-sky-400{fill:#38bdf8}.fill-sky-50{fill:#f0f9ff}.fill-sky-500{fill:#0ea5e9}.fill-sky-600{fill:#0284c7}.fill-sky-700{fill:#0369a1}.fill-sky-800{fill:#075985}.fill-sky-900{fill:#0c4a6e}.fill-sky-950{fill:#082f49}.fill-slate-100{fill:#f1f5f9}.fill-slate-200{fill:#e2e8f0}.fill-slate-300{fill:#cbd5e1}.fill-slate-400{fill:#94a3b8}.fill-slate-50{fill:#f8fafc}.fill-slate-500{fill:#64748b}.fill-slate-600{fill:#475569}.fill-slate-700{fill:#334155}.fill-slate-800{fill:#1e293b}.fill-slate-900{fill:#0f172a}.fill-slate-950{fill:#020617}.fill-stone-100{fill:#f5f5f4}.fill-stone-200{fill:#e7e5e4}.fill-stone-300{fill:#d6d3d1}.fill-stone-400{fill:#a8a29e}.fill-stone-50{fill:#fafaf9}.fill-stone-500{fill:#78716c}.fill-stone-600{fill:#57534e}.fill-stone-700{fill:#44403c}.fill-stone-800{fill:#292524}.fill-stone-900{fill:#1c1917}.fill-stone-950{fill:#0c0a09}.fill-teal-100{fill:#ccfbf1}.fill-teal-200{fill:#99f6e4}.fill-teal-300{fill:#5eead4}.fill-teal-400{fill:#2dd4bf}.fill-teal-50{fill:#f0fdfa}.fill-teal-500{fill:#14b8a6}.fill-teal-600{fill:#0d9488}.fill-teal-700{fill:#0f766e}.fill-teal-800{fill:#115e59}.fill-teal-900{fill:#134e4a}.fill-teal-950{fill:#042f2e}.fill-tremor-content{fill:#6b7280}.fill-tremor-content-emphasis{fill:#374151}.fill-violet-100{fill:#ede9fe}.fill-violet-200{fill:#ddd6fe}.fill-violet-300{fill:#c4b5fd}.fill-violet-400{fill:#a78bfa}.fill-violet-50{fill:#f5f3ff}.fill-violet-500{fill:#8b5cf6}.fill-violet-600{fill:#7c3aed}.fill-violet-700{fill:#6d28d9}.fill-violet-800{fill:#5b21b6}.fill-violet-900{fill:#4c1d95}.fill-violet-950{fill:#2e1065}.fill-yellow-100{fill:#fef9c3}.fill-yellow-200{fill:#fef08a}.fill-yellow-300{fill:#fde047}.fill-yellow-400{fill:#facc15}.fill-yellow-50{fill:#fefce8}.fill-yellow-500{fill:#eab308}.fill-yellow-600{fill:#ca8a04}.fill-yellow-700{fill:#a16207}.fill-yellow-800{fill:#854d0e}.fill-yellow-900{fill:#713f12}.fill-yellow-950{fill:#422006}.fill-zinc-100{fill:#f4f4f5}.fill-zinc-200{fill:#e4e4e7}.fill-zinc-300{fill:#d4d4d8}.fill-zinc-400{fill:#a1a1aa}.fill-zinc-50{fill:#fafafa}.fill-zinc-500{fill:#71717a}.fill-zinc-600{fill:#52525b}.fill-zinc-700{fill:#3f3f46}.fill-zinc-800{fill:#27272a}.fill-zinc-900{fill:#18181b}.fill-zinc-950{fill:#09090b}.stroke-amber-100{stroke:#fef3c7}.stroke-amber-200{stroke:#fde68a}.stroke-amber-300{stroke:#fcd34d}.stroke-amber-400{stroke:#fbbf24}.stroke-amber-50{stroke:#fffbeb}.stroke-amber-500{stroke:#f59e0b}.stroke-amber-600{stroke:#d97706}.stroke-amber-700{stroke:#b45309}.stroke-amber-800{stroke:#92400e}.stroke-amber-900{stroke:#78350f}.stroke-amber-950{stroke:#451a03}.stroke-blue-100{stroke:#dbeafe}.stroke-blue-200{stroke:#bfdbfe}.stroke-blue-300{stroke:#93c5fd}.stroke-blue-400{stroke:#60a5fa}.stroke-blue-50{stroke:#eff6ff}.stroke-blue-500{stroke:#3b82f6}.stroke-blue-600{stroke:#2563eb}.stroke-blue-700{stroke:#1d4ed8}.stroke-blue-800{stroke:#1e40af}.stroke-blue-900{stroke:#1e3a8a}.stroke-blue-950{stroke:#172554}.stroke-cyan-100{stroke:#cffafe}.stroke-cyan-200{stroke:#a5f3fc}.stroke-cyan-300{stroke:#67e8f9}.stroke-cyan-400{stroke:#22d3ee}.stroke-cyan-50{stroke:#ecfeff}.stroke-cyan-500{stroke:#06b6d4}.stroke-cyan-600{stroke:#0891b2}.stroke-cyan-700{stroke:#0e7490}.stroke-cyan-800{stroke:#155e75}.stroke-cyan-900{stroke:#164e63}.stroke-cyan-950{stroke:#083344}.stroke-dark-tremor-background{stroke:#111827}.stroke-dark-tremor-border{stroke:#374151}.stroke-emerald-100{stroke:#d1fae5}.stroke-emerald-200{stroke:#a7f3d0}.stroke-emerald-300{stroke:#6ee7b7}.stroke-emerald-400{stroke:#34d399}.stroke-emerald-50{stroke:#ecfdf5}.stroke-emerald-500{stroke:#10b981}.stroke-emerald-600{stroke:#059669}.stroke-emerald-700{stroke:#047857}.stroke-emerald-800{stroke:#065f46}.stroke-emerald-900{stroke:#064e3b}.stroke-emerald-950{stroke:#022c22}.stroke-fuchsia-100{stroke:#fae8ff}.stroke-fuchsia-200{stroke:#f5d0fe}.stroke-fuchsia-300{stroke:#f0abfc}.stroke-fuchsia-400{stroke:#e879f9}.stroke-fuchsia-50{stroke:#fdf4ff}.stroke-fuchsia-500{stroke:#d946ef}.stroke-fuchsia-600{stroke:#c026d3}.stroke-fuchsia-700{stroke:#a21caf}.stroke-fuchsia-800{stroke:#86198f}.stroke-fuchsia-900{stroke:#701a75}.stroke-fuchsia-950{stroke:#4a044e}.stroke-gray-100{stroke:#f3f4f6}.stroke-gray-200{stroke:#e5e7eb}.stroke-gray-300{stroke:#d1d5db}.stroke-gray-400{stroke:#9ca3af}.stroke-gray-50{stroke:#f9fafb}.stroke-gray-500{stroke:#6b7280}.stroke-gray-600{stroke:#4b5563}.stroke-gray-700{stroke:#374151}.stroke-gray-800{stroke:#1f2937}.stroke-gray-900{stroke:#111827}.stroke-gray-950{stroke:#030712}.stroke-green-100{stroke:#dcfce7}.stroke-green-200{stroke:#bbf7d0}.stroke-green-300{stroke:#86efac}.stroke-green-400{stroke:#4ade80}.stroke-green-50{stroke:#f0fdf4}.stroke-green-500{stroke:#22c55e}.stroke-green-600{stroke:#16a34a}.stroke-green-700{stroke:#15803d}.stroke-green-800{stroke:#166534}.stroke-green-900{stroke:#14532d}.stroke-green-950{stroke:#052e16}.stroke-indigo-100{stroke:#e0e7ff}.stroke-indigo-200{stroke:#c7d2fe}.stroke-indigo-300{stroke:#a5b4fc}.stroke-indigo-400{stroke:#818cf8}.stroke-indigo-50{stroke:#eef2ff}.stroke-indigo-500{stroke:#6366f1}.stroke-indigo-600{stroke:#4f46e5}.stroke-indigo-700{stroke:#4338ca}.stroke-indigo-800{stroke:#3730a3}.stroke-indigo-900{stroke:#312e81}.stroke-indigo-950{stroke:#1e1b4b}.stroke-lime-100{stroke:#ecfccb}.stroke-lime-200{stroke:#d9f99d}.stroke-lime-300{stroke:#bef264}.stroke-lime-400{stroke:#a3e635}.stroke-lime-50{stroke:#f7fee7}.stroke-lime-500{stroke:#84cc16}.stroke-lime-600{stroke:#65a30d}.stroke-lime-700{stroke:#4d7c0f}.stroke-lime-800{stroke:#3f6212}.stroke-lime-900{stroke:#365314}.stroke-lime-950{stroke:#1a2e05}.stroke-neutral-100{stroke:#f5f5f5}.stroke-neutral-200{stroke:#e5e5e5}.stroke-neutral-300{stroke:#d4d4d4}.stroke-neutral-400{stroke:#a3a3a3}.stroke-neutral-50{stroke:#fafafa}.stroke-neutral-500{stroke:#737373}.stroke-neutral-600{stroke:#525252}.stroke-neutral-700{stroke:#404040}.stroke-neutral-800{stroke:#262626}.stroke-neutral-900{stroke:#171717}.stroke-neutral-950{stroke:#0a0a0a}.stroke-orange-100{stroke:#ffedd5}.stroke-orange-200{stroke:#fed7aa}.stroke-orange-300{stroke:#fdba74}.stroke-orange-400{stroke:#fb923c}.stroke-orange-50{stroke:#fff7ed}.stroke-orange-500{stroke:#f97316}.stroke-orange-600{stroke:#ea580c}.stroke-orange-700{stroke:#c2410c}.stroke-orange-800{stroke:#9a3412}.stroke-orange-900{stroke:#7c2d12}.stroke-orange-950{stroke:#431407}.stroke-pink-100{stroke:#fce7f3}.stroke-pink-200{stroke:#fbcfe8}.stroke-pink-300{stroke:#f9a8d4}.stroke-pink-400{stroke:#f472b6}.stroke-pink-50{stroke:#fdf2f8}.stroke-pink-500{stroke:#ec4899}.stroke-pink-600{stroke:#db2777}.stroke-pink-700{stroke:#be185d}.stroke-pink-800{stroke:#9d174d}.stroke-pink-900{stroke:#831843}.stroke-pink-950{stroke:#500724}.stroke-purple-100{stroke:#f3e8ff}.stroke-purple-200{stroke:#e9d5ff}.stroke-purple-300{stroke:#d8b4fe}.stroke-purple-400{stroke:#c084fc}.stroke-purple-50{stroke:#faf5ff}.stroke-purple-500{stroke:#a855f7}.stroke-purple-600{stroke:#9333ea}.stroke-purple-700{stroke:#7e22ce}.stroke-purple-800{stroke:#6b21a8}.stroke-purple-900{stroke:#581c87}.stroke-purple-950{stroke:#3b0764}.stroke-red-100{stroke:#fee2e2}.stroke-red-200{stroke:#fecaca}.stroke-red-300{stroke:#fca5a5}.stroke-red-400{stroke:#f87171}.stroke-red-50{stroke:#fef2f2}.stroke-red-500{stroke:#ef4444}.stroke-red-600{stroke:#dc2626}.stroke-red-700{stroke:#b91c1c}.stroke-red-800{stroke:#991b1b}.stroke-red-900{stroke:#7f1d1d}.stroke-red-950{stroke:#450a0a}.stroke-rose-100{stroke:#ffe4e6}.stroke-rose-200{stroke:#fecdd3}.stroke-rose-300{stroke:#fda4af}.stroke-rose-400{stroke:#fb7185}.stroke-rose-50{stroke:#fff1f2}.stroke-rose-500{stroke:#f43f5e}.stroke-rose-600{stroke:#e11d48}.stroke-rose-700{stroke:#be123c}.stroke-rose-800{stroke:#9f1239}.stroke-rose-900{stroke:#881337}.stroke-rose-950{stroke:#4c0519}.stroke-sky-100{stroke:#e0f2fe}.stroke-sky-200{stroke:#bae6fd}.stroke-sky-300{stroke:#7dd3fc}.stroke-sky-400{stroke:#38bdf8}.stroke-sky-50{stroke:#f0f9ff}.stroke-sky-500{stroke:#0ea5e9}.stroke-sky-600{stroke:#0284c7}.stroke-sky-700{stroke:#0369a1}.stroke-sky-800{stroke:#075985}.stroke-sky-900{stroke:#0c4a6e}.stroke-sky-950{stroke:#082f49}.stroke-slate-100{stroke:#f1f5f9}.stroke-slate-200{stroke:#e2e8f0}.stroke-slate-300{stroke:#cbd5e1}.stroke-slate-400{stroke:#94a3b8}.stroke-slate-50{stroke:#f8fafc}.stroke-slate-500{stroke:#64748b}.stroke-slate-600{stroke:#475569}.stroke-slate-700{stroke:#334155}.stroke-slate-800{stroke:#1e293b}.stroke-slate-900{stroke:#0f172a}.stroke-slate-950{stroke:#020617}.stroke-stone-100{stroke:#f5f5f4}.stroke-stone-200{stroke:#e7e5e4}.stroke-stone-300{stroke:#d6d3d1}.stroke-stone-400{stroke:#a8a29e}.stroke-stone-50{stroke:#fafaf9}.stroke-stone-500{stroke:#78716c}.stroke-stone-600{stroke:#57534e}.stroke-stone-700{stroke:#44403c}.stroke-stone-800{stroke:#292524}.stroke-stone-900{stroke:#1c1917}.stroke-stone-950{stroke:#0c0a09}.stroke-teal-100{stroke:#ccfbf1}.stroke-teal-200{stroke:#99f6e4}.stroke-teal-300{stroke:#5eead4}.stroke-teal-400{stroke:#2dd4bf}.stroke-teal-50{stroke:#f0fdfa}.stroke-teal-500{stroke:#14b8a6}.stroke-teal-600{stroke:#0d9488}.stroke-teal-700{stroke:#0f766e}.stroke-teal-800{stroke:#115e59}.stroke-teal-900{stroke:#134e4a}.stroke-teal-950{stroke:#042f2e}.stroke-tremor-background{stroke:#fff}.stroke-tremor-border{stroke:#e5e7eb}.stroke-tremor-brand{stroke:#6366f1}.stroke-tremor-brand-muted\/50{stroke:rgba(134,136,239,.5)}.stroke-violet-100{stroke:#ede9fe}.stroke-violet-200{stroke:#ddd6fe}.stroke-violet-300{stroke:#c4b5fd}.stroke-violet-400{stroke:#a78bfa}.stroke-violet-50{stroke:#f5f3ff}.stroke-violet-500{stroke:#8b5cf6}.stroke-violet-600{stroke:#7c3aed}.stroke-violet-700{stroke:#6d28d9}.stroke-violet-800{stroke:#5b21b6}.stroke-violet-900{stroke:#4c1d95}.stroke-violet-950{stroke:#2e1065}.stroke-yellow-100{stroke:#fef9c3}.stroke-yellow-200{stroke:#fef08a}.stroke-yellow-300{stroke:#fde047}.stroke-yellow-400{stroke:#facc15}.stroke-yellow-50{stroke:#fefce8}.stroke-yellow-500{stroke:#eab308}.stroke-yellow-600{stroke:#ca8a04}.stroke-yellow-700{stroke:#a16207}.stroke-yellow-800{stroke:#854d0e}.stroke-yellow-900{stroke:#713f12}.stroke-yellow-950{stroke:#422006}.stroke-zinc-100{stroke:#f4f4f5}.stroke-zinc-200{stroke:#e4e4e7}.stroke-zinc-300{stroke:#d4d4d8}.stroke-zinc-400{stroke:#a1a1aa}.stroke-zinc-50{stroke:#fafafa}.stroke-zinc-500{stroke:#71717a}.stroke-zinc-600{stroke:#52525b}.stroke-zinc-700{stroke:#3f3f46}.stroke-zinc-800{stroke:#27272a}.stroke-zinc-900{stroke:#18181b}.stroke-zinc-950{stroke:#09090b}.stroke-1{stroke-width:1}.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-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.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-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm,.text-tremor-default{font-size:.875rem;line-height:1.25rem}.text-tremor-label{font-size:.75rem;line-height:.4rem}.text-tremor-metric{font-size:1.875rem;line-height:2.25rem}.text-tremor-title{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.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-6{line-height:1.5rem}.text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-dark-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-dark-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-dark-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-dark-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-dark-tremor-content-subtle{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-inherit{color:inherit}.text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-tremor-content-subtle{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.accent-dark-tremor-brand,.accent-tremor-brand{accent-color:#6366f1}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow,.shadow-dark-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-dark-tremor-card,.shadow-dark-tremor-input{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-dark-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-tremor-card,.shadow-tremor-dropdown{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-tremor-dropdown{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-input,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-tremor-brand{outline-color:#6366f1}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--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)}.ring-2{--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)}.ring-amber-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 243 199/var(--tw-ring-opacity))}.ring-amber-200{--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity))}.ring-amber-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity))}.ring-amber-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity))}.ring-amber-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 251 235/var(--tw-ring-opacity))}.ring-amber-500{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.ring-amber-600{--tw-ring-opacity:1;--tw-ring-color:rgb(217 119 6/var(--tw-ring-opacity))}.ring-amber-700{--tw-ring-opacity:1;--tw-ring-color:rgb(180 83 9/var(--tw-ring-opacity))}.ring-amber-800{--tw-ring-opacity:1;--tw-ring-color:rgb(146 64 14/var(--tw-ring-opacity))}.ring-amber-900{--tw-ring-opacity:1;--tw-ring-color:rgb(120 53 15/var(--tw-ring-opacity))}.ring-amber-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 26 3/var(--tw-ring-opacity))}.ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity))}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgb(191 219 254/var(--tw-ring-opacity))}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity))}.ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgb(239 246 255/var(--tw-ring-opacity))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity))}.ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgb(29 78 216/var(--tw-ring-opacity))}.ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 64 175/var(--tw-ring-opacity))}.ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgb(30 58 138/var(--tw-ring-opacity))}.ring-blue-950{--tw-ring-opacity:1;--tw-ring-color:rgb(23 37 84/var(--tw-ring-opacity))}.ring-cyan-100{--tw-ring-opacity:1;--tw-ring-color:rgb(207 250 254/var(--tw-ring-opacity))}.ring-cyan-200{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity))}.ring-cyan-300{--tw-ring-opacity:1;--tw-ring-color:rgb(103 232 249/var(--tw-ring-opacity))}.ring-cyan-400{--tw-ring-opacity:1;--tw-ring-color:rgb(34 211 238/var(--tw-ring-opacity))}.ring-cyan-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 254 255/var(--tw-ring-opacity))}.ring-cyan-500{--tw-ring-opacity:1;--tw-ring-color:rgb(6 182 212/var(--tw-ring-opacity))}.ring-cyan-600{--tw-ring-opacity:1;--tw-ring-color:rgb(8 145 178/var(--tw-ring-opacity))}.ring-cyan-700{--tw-ring-opacity:1;--tw-ring-color:rgb(14 116 144/var(--tw-ring-opacity))}.ring-cyan-800{--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity))}.ring-cyan-900{--tw-ring-opacity:1;--tw-ring-color:rgb(22 78 99/var(--tw-ring-opacity))}.ring-cyan-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 51 68/var(--tw-ring-opacity))}.ring-dark-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-emerald-100{--tw-ring-opacity:1;--tw-ring-color:rgb(209 250 229/var(--tw-ring-opacity))}.ring-emerald-200{--tw-ring-opacity:1;--tw-ring-color:rgb(167 243 208/var(--tw-ring-opacity))}.ring-emerald-300{--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity))}.ring-emerald-400{--tw-ring-opacity:1;--tw-ring-color:rgb(52 211 153/var(--tw-ring-opacity))}.ring-emerald-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 253 245/var(--tw-ring-opacity))}.ring-emerald-500{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity))}.ring-emerald-600{--tw-ring-opacity:1;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))}.ring-emerald-700{--tw-ring-opacity:1;--tw-ring-color:rgb(4 120 87/var(--tw-ring-opacity))}.ring-emerald-800{--tw-ring-opacity:1;--tw-ring-color:rgb(6 95 70/var(--tw-ring-opacity))}.ring-emerald-900{--tw-ring-opacity:1;--tw-ring-color:rgb(6 78 59/var(--tw-ring-opacity))}.ring-emerald-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 44 34/var(--tw-ring-opacity))}.ring-fuchsia-100{--tw-ring-opacity:1;--tw-ring-color:rgb(250 232 255/var(--tw-ring-opacity))}.ring-fuchsia-200{--tw-ring-opacity:1;--tw-ring-color:rgb(245 208 254/var(--tw-ring-opacity))}.ring-fuchsia-300{--tw-ring-opacity:1;--tw-ring-color:rgb(240 171 252/var(--tw-ring-opacity))}.ring-fuchsia-400{--tw-ring-opacity:1;--tw-ring-color:rgb(232 121 249/var(--tw-ring-opacity))}.ring-fuchsia-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 244 255/var(--tw-ring-opacity))}.ring-fuchsia-500{--tw-ring-opacity:1;--tw-ring-color:rgb(217 70 239/var(--tw-ring-opacity))}.ring-fuchsia-600{--tw-ring-opacity:1;--tw-ring-color:rgb(192 38 211/var(--tw-ring-opacity))}.ring-fuchsia-700{--tw-ring-opacity:1;--tw-ring-color:rgb(162 28 175/var(--tw-ring-opacity))}.ring-fuchsia-800{--tw-ring-opacity:1;--tw-ring-color:rgb(134 25 143/var(--tw-ring-opacity))}.ring-fuchsia-900{--tw-ring-opacity:1;--tw-ring-color:rgb(112 26 117/var(--tw-ring-opacity))}.ring-fuchsia-950{--tw-ring-opacity:1;--tw-ring-color:rgb(74 4 78/var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 244 246/var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgb(249 250 251/var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81/var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgb(17 24 39/var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgb(3 7 18/var(--tw-ring-opacity))}.ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgb(220 252 231/var(--tw-ring-opacity))}.ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgb(187 247 208/var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity))}.ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgb(74 222 128/var(--tw-ring-opacity))}.ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 244/var(--tw-ring-opacity))}.ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgb(22 163 74/var(--tw-ring-opacity))}.ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgb(21 128 61/var(--tw-ring-opacity))}.ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgb(22 101 52/var(--tw-ring-opacity))}.ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgb(20 83 45/var(--tw-ring-opacity))}.ring-green-950{--tw-ring-opacity:1;--tw-ring-color:rgb(5 46 22/var(--tw-ring-opacity))}.ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 231 255/var(--tw-ring-opacity))}.ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgb(199 210 254/var(--tw-ring-opacity))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity))}.ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgb(129 140 248/var(--tw-ring-opacity))}.ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgb(238 242 255/var(--tw-ring-opacity))}.ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity))}.ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgb(67 56 202/var(--tw-ring-opacity))}.ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgb(55 48 163/var(--tw-ring-opacity))}.ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgb(49 46 129/var(--tw-ring-opacity))}.ring-indigo-950{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}.ring-lime-100{--tw-ring-opacity:1;--tw-ring-color:rgb(236 252 203/var(--tw-ring-opacity))}.ring-lime-200{--tw-ring-opacity:1;--tw-ring-color:rgb(217 249 157/var(--tw-ring-opacity))}.ring-lime-300{--tw-ring-opacity:1;--tw-ring-color:rgb(190 242 100/var(--tw-ring-opacity))}.ring-lime-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 230 53/var(--tw-ring-opacity))}.ring-lime-50{--tw-ring-opacity:1;--tw-ring-color:rgb(247 254 231/var(--tw-ring-opacity))}.ring-lime-500{--tw-ring-opacity:1;--tw-ring-color:rgb(132 204 22/var(--tw-ring-opacity))}.ring-lime-600{--tw-ring-opacity:1;--tw-ring-color:rgb(101 163 13/var(--tw-ring-opacity))}.ring-lime-700{--tw-ring-opacity:1;--tw-ring-color:rgb(77 124 15/var(--tw-ring-opacity))}.ring-lime-800{--tw-ring-opacity:1;--tw-ring-color:rgb(63 98 18/var(--tw-ring-opacity))}.ring-lime-900{--tw-ring-opacity:1;--tw-ring-color:rgb(54 83 20/var(--tw-ring-opacity))}.ring-lime-950{--tw-ring-opacity:1;--tw-ring-color:rgb(26 46 5/var(--tw-ring-opacity))}.ring-neutral-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 245/var(--tw-ring-opacity))}.ring-neutral-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 229 229/var(--tw-ring-opacity))}.ring-neutral-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 212/var(--tw-ring-opacity))}.ring-neutral-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 163 163/var(--tw-ring-opacity))}.ring-neutral-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-neutral-500{--tw-ring-opacity:1;--tw-ring-color:rgb(115 115 115/var(--tw-ring-opacity))}.ring-neutral-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 82/var(--tw-ring-opacity))}.ring-neutral-700{--tw-ring-opacity:1;--tw-ring-color:rgb(64 64 64/var(--tw-ring-opacity))}.ring-neutral-800{--tw-ring-opacity:1;--tw-ring-color:rgb(38 38 38/var(--tw-ring-opacity))}.ring-neutral-900{--tw-ring-opacity:1;--tw-ring-color:rgb(23 23 23/var(--tw-ring-opacity))}.ring-neutral-950{--tw-ring-opacity:1;--tw-ring-color:rgb(10 10 10/var(--tw-ring-opacity))}.ring-orange-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 237 213/var(--tw-ring-opacity))}.ring-orange-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 215 170/var(--tw-ring-opacity))}.ring-orange-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 186 116/var(--tw-ring-opacity))}.ring-orange-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 146 60/var(--tw-ring-opacity))}.ring-orange-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 247 237/var(--tw-ring-opacity))}.ring-orange-500{--tw-ring-opacity:1;--tw-ring-color:rgb(249 115 22/var(--tw-ring-opacity))}.ring-orange-600{--tw-ring-opacity:1;--tw-ring-color:rgb(234 88 12/var(--tw-ring-opacity))}.ring-orange-700{--tw-ring-opacity:1;--tw-ring-color:rgb(194 65 12/var(--tw-ring-opacity))}.ring-orange-800{--tw-ring-opacity:1;--tw-ring-color:rgb(154 52 18/var(--tw-ring-opacity))}.ring-orange-900{--tw-ring-opacity:1;--tw-ring-color:rgb(124 45 18/var(--tw-ring-opacity))}.ring-orange-950{--tw-ring-opacity:1;--tw-ring-color:rgb(67 20 7/var(--tw-ring-opacity))}.ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgb(252 231 243/var(--tw-ring-opacity))}.ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgb(251 207 232/var(--tw-ring-opacity))}.ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgb(249 168 212/var(--tw-ring-opacity))}.ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgb(244 114 182/var(--tw-ring-opacity))}.ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 242 248/var(--tw-ring-opacity))}.ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgb(236 72 153/var(--tw-ring-opacity))}.ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgb(219 39 119/var(--tw-ring-opacity))}.ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 24 93/var(--tw-ring-opacity))}.ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgb(157 23 77/var(--tw-ring-opacity))}.ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgb(131 24 67/var(--tw-ring-opacity))}.ring-pink-950{--tw-ring-opacity:1;--tw-ring-color:rgb(80 7 36/var(--tw-ring-opacity))}.ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 232 255/var(--tw-ring-opacity))}.ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgb(233 213 255/var(--tw-ring-opacity))}.ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgb(216 180 254/var(--tw-ring-opacity))}.ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity))}.ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 245 255/var(--tw-ring-opacity))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity))}.ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgb(147 51 234/var(--tw-ring-opacity))}.ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgb(126 34 206/var(--tw-ring-opacity))}.ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgb(107 33 168/var(--tw-ring-opacity))}.ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgb(88 28 135/var(--tw-ring-opacity))}.ring-purple-950{--tw-ring-opacity:1;--tw-ring-color:rgb(59 7 100/var(--tw-ring-opacity))}.ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 226 226/var(--tw-ring-opacity))}.ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 202 202/var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity))}.ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgb(248 113 113/var(--tw-ring-opacity))}.ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 242 242/var(--tw-ring-opacity))}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgb(185 28 28/var(--tw-ring-opacity))}.ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgb(153 27 27/var(--tw-ring-opacity))}.ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgb(127 29 29/var(--tw-ring-opacity))}.ring-red-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 10 10/var(--tw-ring-opacity))}.ring-rose-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 228 230/var(--tw-ring-opacity))}.ring-rose-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 205 211/var(--tw-ring-opacity))}.ring-rose-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 164 175/var(--tw-ring-opacity))}.ring-rose-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 113 133/var(--tw-ring-opacity))}.ring-rose-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 241 242/var(--tw-ring-opacity))}.ring-rose-500{--tw-ring-opacity:1;--tw-ring-color:rgb(244 63 94/var(--tw-ring-opacity))}.ring-rose-600{--tw-ring-opacity:1;--tw-ring-color:rgb(225 29 72/var(--tw-ring-opacity))}.ring-rose-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 18 60/var(--tw-ring-opacity))}.ring-rose-800{--tw-ring-opacity:1;--tw-ring-color:rgb(159 18 57/var(--tw-ring-opacity))}.ring-rose-900{--tw-ring-opacity:1;--tw-ring-color:rgb(136 19 55/var(--tw-ring-opacity))}.ring-rose-950{--tw-ring-opacity:1;--tw-ring-color:rgb(76 5 25/var(--tw-ring-opacity))}.ring-sky-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 242 254/var(--tw-ring-opacity))}.ring-sky-200{--tw-ring-opacity:1;--tw-ring-color:rgb(186 230 253/var(--tw-ring-opacity))}.ring-sky-300{--tw-ring-opacity:1;--tw-ring-color:rgb(125 211 252/var(--tw-ring-opacity))}.ring-sky-400{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.ring-sky-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 249 255/var(--tw-ring-opacity))}.ring-sky-500{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.ring-sky-600{--tw-ring-opacity:1;--tw-ring-color:rgb(2 132 199/var(--tw-ring-opacity))}.ring-sky-700{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.ring-sky-800{--tw-ring-opacity:1;--tw-ring-color:rgb(7 89 133/var(--tw-ring-opacity))}.ring-sky-900{--tw-ring-opacity:1;--tw-ring-color:rgb(12 74 110/var(--tw-ring-opacity))}.ring-sky-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 47 73/var(--tw-ring-opacity))}.ring-slate-100{--tw-ring-opacity:1;--tw-ring-color:rgb(241 245 249/var(--tw-ring-opacity))}.ring-slate-200{--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity))}.ring-slate-300{--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity))}.ring-slate-400{--tw-ring-opacity:1;--tw-ring-color:rgb(148 163 184/var(--tw-ring-opacity))}.ring-slate-50{--tw-ring-opacity:1;--tw-ring-color:rgb(248 250 252/var(--tw-ring-opacity))}.ring-slate-500{--tw-ring-opacity:1;--tw-ring-color:rgb(100 116 139/var(--tw-ring-opacity))}.ring-slate-600{--tw-ring-opacity:1;--tw-ring-color:rgb(71 85 105/var(--tw-ring-opacity))}.ring-slate-700{--tw-ring-opacity:1;--tw-ring-color:rgb(51 65 85/var(--tw-ring-opacity))}.ring-slate-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 41 59/var(--tw-ring-opacity))}.ring-slate-900{--tw-ring-opacity:1;--tw-ring-color:rgb(15 23 42/var(--tw-ring-opacity))}.ring-slate-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 6 23/var(--tw-ring-opacity))}.ring-stone-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 244/var(--tw-ring-opacity))}.ring-stone-200{--tw-ring-opacity:1;--tw-ring-color:rgb(231 229 228/var(--tw-ring-opacity))}.ring-stone-300{--tw-ring-opacity:1;--tw-ring-color:rgb(214 211 209/var(--tw-ring-opacity))}.ring-stone-400{--tw-ring-opacity:1;--tw-ring-color:rgb(168 162 158/var(--tw-ring-opacity))}.ring-stone-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 249/var(--tw-ring-opacity))}.ring-stone-500{--tw-ring-opacity:1;--tw-ring-color:rgb(120 113 108/var(--tw-ring-opacity))}.ring-stone-600{--tw-ring-opacity:1;--tw-ring-color:rgb(87 83 78/var(--tw-ring-opacity))}.ring-stone-700{--tw-ring-opacity:1;--tw-ring-color:rgb(68 64 60/var(--tw-ring-opacity))}.ring-stone-800{--tw-ring-opacity:1;--tw-ring-color:rgb(41 37 36/var(--tw-ring-opacity))}.ring-stone-900{--tw-ring-opacity:1;--tw-ring-color:rgb(28 25 23/var(--tw-ring-opacity))}.ring-stone-950{--tw-ring-opacity:1;--tw-ring-color:rgb(12 10 9/var(--tw-ring-opacity))}.ring-teal-100{--tw-ring-opacity:1;--tw-ring-color:rgb(204 251 241/var(--tw-ring-opacity))}.ring-teal-200{--tw-ring-opacity:1;--tw-ring-color:rgb(153 246 228/var(--tw-ring-opacity))}.ring-teal-300{--tw-ring-opacity:1;--tw-ring-color:rgb(94 234 212/var(--tw-ring-opacity))}.ring-teal-400{--tw-ring-opacity:1;--tw-ring-color:rgb(45 212 191/var(--tw-ring-opacity))}.ring-teal-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 250/var(--tw-ring-opacity))}.ring-teal-500{--tw-ring-opacity:1;--tw-ring-color:rgb(20 184 166/var(--tw-ring-opacity))}.ring-teal-600{--tw-ring-opacity:1;--tw-ring-color:rgb(13 148 136/var(--tw-ring-opacity))}.ring-teal-700{--tw-ring-opacity:1;--tw-ring-color:rgb(15 118 110/var(--tw-ring-opacity))}.ring-teal-800{--tw-ring-opacity:1;--tw-ring-color:rgb(17 94 89/var(--tw-ring-opacity))}.ring-teal-900{--tw-ring-opacity:1;--tw-ring-color:rgb(19 78 74/var(--tw-ring-opacity))}.ring-teal-950{--tw-ring-opacity:1;--tw-ring-color:rgb(4 47 46/var(--tw-ring-opacity))}.ring-tremor-brand-inverted{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-tremor-brand-muted{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.ring-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-violet-100{--tw-ring-opacity:1;--tw-ring-color:rgb(237 233 254/var(--tw-ring-opacity))}.ring-violet-200{--tw-ring-opacity:1;--tw-ring-color:rgb(221 214 254/var(--tw-ring-opacity))}.ring-violet-300{--tw-ring-opacity:1;--tw-ring-color:rgb(196 181 253/var(--tw-ring-opacity))}.ring-violet-400{--tw-ring-opacity:1;--tw-ring-color:rgb(167 139 250/var(--tw-ring-opacity))}.ring-violet-50{--tw-ring-opacity:1;--tw-ring-color:rgb(245 243 255/var(--tw-ring-opacity))}.ring-violet-500{--tw-ring-opacity:1;--tw-ring-color:rgb(139 92 246/var(--tw-ring-opacity))}.ring-violet-600{--tw-ring-opacity:1;--tw-ring-color:rgb(124 58 237/var(--tw-ring-opacity))}.ring-violet-700{--tw-ring-opacity:1;--tw-ring-color:rgb(109 40 217/var(--tw-ring-opacity))}.ring-violet-800{--tw-ring-opacity:1;--tw-ring-color:rgb(91 33 182/var(--tw-ring-opacity))}.ring-violet-900{--tw-ring-opacity:1;--tw-ring-color:rgb(76 29 149/var(--tw-ring-opacity))}.ring-violet-950{--tw-ring-opacity:1;--tw-ring-color:rgb(46 16 101/var(--tw-ring-opacity))}.ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 249 195/var(--tw-ring-opacity))}.ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 240 138/var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 224 71/var(--tw-ring-opacity))}.ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgb(250 204 21/var(--tw-ring-opacity))}.ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 252 232/var(--tw-ring-opacity))}.ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgb(234 179 8/var(--tw-ring-opacity))}.ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgb(202 138 4/var(--tw-ring-opacity))}.ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgb(161 98 7/var(--tw-ring-opacity))}.ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgb(133 77 14/var(--tw-ring-opacity))}.ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgb(113 63 18/var(--tw-ring-opacity))}.ring-yellow-950{--tw-ring-opacity:1;--tw-ring-color:rgb(66 32 6/var(--tw-ring-opacity))}.ring-zinc-100{--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity))}.ring-zinc-200{--tw-ring-opacity:1;--tw-ring-color:rgb(228 228 231/var(--tw-ring-opacity))}.ring-zinc-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 216/var(--tw-ring-opacity))}.ring-zinc-400{--tw-ring-opacity:1;--tw-ring-color:rgb(161 161 170/var(--tw-ring-opacity))}.ring-zinc-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-zinc-500{--tw-ring-opacity:1;--tw-ring-color:rgb(113 113 122/var(--tw-ring-opacity))}.ring-zinc-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 91/var(--tw-ring-opacity))}.ring-zinc-700{--tw-ring-opacity:1;--tw-ring-color:rgb(63 63 70/var(--tw-ring-opacity))}.ring-zinc-800{--tw-ring-opacity:1;--tw-ring-color:rgb(39 39 42/var(--tw-ring-opacity))}.ring-zinc-900{--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity))}.ring-zinc-950{--tw-ring-opacity:1;--tw-ring-color:rgb(9 9 11/var(--tw-ring-opacity))}.ring-opacity-40{--tw-ring-opacity:0.4}.blur{--tw-blur:blur(8px)}.blur,.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.\[scrollbar-width\:none\]{scrollbar-width:none}:root{--foreground-rgb:0,0,0;--background-start-rgb:255,255,255;--background-end-rgb:255,255,255}body{color:rgb(var(--foreground-rgb));background:linear-gradient(to bottom,transparent,rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb))}.placeholder\:text-tremor-content::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.first\:rounded-l-\[4px\]:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.last\:rounded-r-\[4px\]:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.focus-within\:relative:focus-within{position:relative}.hover\:border-b-2:hover{border-bottom-width:2px}.hover\:border-amber-100:hover{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.hover\:border-amber-200:hover{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.hover\:border-amber-300:hover{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.hover\:border-amber-400:hover{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.hover\:border-amber-50:hover{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.hover\:border-amber-500:hover{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.hover\:border-amber-600:hover{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.hover\:border-amber-700:hover{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.hover\:border-amber-800:hover{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.hover\:border-amber-900:hover{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.hover\:border-amber-950:hover{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.hover\:border-blue-950:hover{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.hover\:border-cyan-100:hover{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.hover\:border-cyan-200:hover{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.hover\:border-cyan-300:hover{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.hover\:border-cyan-400:hover{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.hover\:border-cyan-50:hover{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.hover\:border-cyan-500:hover{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.hover\:border-cyan-600:hover{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.hover\:border-cyan-700:hover{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.hover\:border-cyan-800:hover{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.hover\:border-cyan-900:hover{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.hover\:border-cyan-950:hover{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.hover\:border-emerald-100:hover{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.hover\:border-emerald-200:hover{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.hover\:border-emerald-300:hover{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.hover\:border-emerald-400:hover{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.hover\:border-emerald-50:hover{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.hover\:border-emerald-500:hover{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.hover\:border-emerald-600:hover{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.hover\:border-emerald-700:hover{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.hover\:border-emerald-800:hover{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.hover\:border-emerald-900:hover{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.hover\:border-emerald-950:hover{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.hover\:border-fuchsia-100:hover{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.hover\:border-fuchsia-200:hover{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.hover\:border-fuchsia-300:hover{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.hover\:border-fuchsia-400:hover{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.hover\:border-fuchsia-50:hover{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.hover\:border-fuchsia-500:hover{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.hover\:border-fuchsia-600:hover{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.hover\:border-fuchsia-700:hover{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.hover\:border-fuchsia-800:hover{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.hover\:border-fuchsia-900:hover{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.hover\:border-fuchsia-950:hover{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.hover\:border-gray-950:hover{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.hover\:border-green-950:hover{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.hover\:border-indigo-950:hover{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.hover\:border-lime-100:hover{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.hover\:border-lime-200:hover{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.hover\:border-lime-300:hover{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.hover\:border-lime-400:hover{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.hover\:border-lime-50:hover{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.hover\:border-lime-500:hover{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.hover\:border-lime-600:hover{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.hover\:border-lime-700:hover{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.hover\:border-lime-800:hover{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.hover\:border-lime-900:hover{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.hover\:border-lime-950:hover{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.hover\:border-neutral-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.hover\:border-neutral-200:hover{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.hover\:border-neutral-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.hover\:border-neutral-400:hover{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.hover\:border-neutral-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-neutral-500:hover{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.hover\:border-neutral-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.hover\:border-neutral-700:hover{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.hover\:border-neutral-800:hover{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.hover\:border-neutral-900:hover{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.hover\:border-neutral-950:hover{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.hover\:border-orange-100:hover{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.hover\:border-orange-200:hover{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.hover\:border-orange-300:hover{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.hover\:border-orange-400:hover{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.hover\:border-orange-50:hover{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.hover\:border-orange-600:hover{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.hover\:border-orange-700:hover{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.hover\:border-orange-800:hover{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.hover\:border-orange-900:hover{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.hover\:border-orange-950:hover{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.hover\:border-pink-950:hover{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.hover\:border-purple-950:hover{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.hover\:border-red-950:hover{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.hover\:border-rose-100:hover{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.hover\:border-rose-200:hover{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.hover\:border-rose-300:hover{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.hover\:border-rose-400:hover{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.hover\:border-rose-50:hover{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.hover\:border-rose-500:hover{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.hover\:border-rose-600:hover{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.hover\:border-rose-700:hover{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.hover\:border-rose-800:hover{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.hover\:border-rose-900:hover{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.hover\:border-rose-950:hover{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.hover\:border-sky-100:hover{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.hover\:border-sky-200:hover{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.hover\:border-sky-300:hover{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.hover\:border-sky-400:hover{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.hover\:border-sky-50:hover{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.hover\:border-sky-500:hover{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.hover\:border-sky-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-sky-700:hover{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.hover\:border-sky-800:hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.hover\:border-sky-900:hover{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.hover\:border-sky-950:hover{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.hover\:border-slate-100:hover{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.hover\:border-slate-200:hover{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.hover\:border-slate-300:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.hover\:border-slate-400:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.hover\:border-slate-50:hover{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.hover\:border-slate-500:hover{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.hover\:border-slate-600:hover{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.hover\:border-slate-700:hover{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.hover\:border-slate-800:hover{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.hover\:border-slate-900:hover{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.hover\:border-slate-950:hover{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.hover\:border-stone-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.hover\:border-stone-200:hover{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.hover\:border-stone-300:hover{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.hover\:border-stone-400:hover{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.hover\:border-stone-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.hover\:border-stone-500:hover{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.hover\:border-stone-600:hover{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.hover\:border-stone-700:hover{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.hover\:border-stone-800:hover{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.hover\:border-stone-900:hover{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.hover\:border-stone-950:hover{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.hover\:border-teal-100:hover{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.hover\:border-teal-200:hover{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.hover\:border-teal-300:hover{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.hover\:border-teal-400:hover{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.hover\:border-teal-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.hover\:border-teal-500:hover{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.hover\:border-teal-600:hover{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.hover\:border-teal-700:hover{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.hover\:border-teal-800:hover{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.hover\:border-teal-900:hover{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.hover\:border-teal-950:hover{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.hover\:border-tremor-brand-emphasis:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-tremor-content:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-violet-100:hover{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.hover\:border-violet-200:hover{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.hover\:border-violet-300:hover{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.hover\:border-violet-400:hover{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.hover\:border-violet-50:hover{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.hover\:border-violet-500:hover{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.hover\:border-violet-600:hover{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.hover\:border-violet-700:hover{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.hover\:border-violet-800:hover{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.hover\:border-violet-900:hover{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.hover\:border-violet-950:hover{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.hover\:border-yellow-950:hover{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.hover\:border-zinc-100:hover{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.hover\:border-zinc-200:hover{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.hover\:border-zinc-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:border-zinc-400:hover{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.hover\:border-zinc-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-zinc-500:hover{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.hover\:border-zinc-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.hover\:border-zinc-700:hover{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.hover\:border-zinc-800:hover{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.hover\:border-zinc-900:hover{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.hover\:border-zinc-950:hover{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.hover\:bg-amber-100:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.hover\:bg-amber-200:hover{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.hover\:bg-amber-300:hover{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.hover\:bg-amber-400:hover{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.hover\:bg-amber-50:hover{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.hover\:bg-amber-700:hover{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.hover\:bg-amber-800:hover{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.hover\:bg-amber-900:hover{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.hover\:bg-amber-950:hover{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.hover\:bg-blue-950:hover{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.hover\:bg-cyan-100:hover{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.hover\:bg-cyan-200:hover{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.hover\:bg-cyan-300:hover{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.hover\:bg-cyan-400:hover{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.hover\:bg-cyan-50:hover{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.hover\:bg-cyan-500:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.hover\:bg-cyan-600:hover{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.hover\:bg-cyan-700:hover{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.hover\:bg-cyan-800:hover{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.hover\:bg-cyan-900:hover{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.hover\:bg-cyan-950:hover{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.hover\:bg-emerald-100:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.hover\:bg-emerald-200:hover{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.hover\:bg-emerald-300:hover{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.hover\:bg-emerald-400:hover{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.hover\:bg-emerald-800:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.hover\:bg-emerald-900:hover{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.hover\:bg-emerald-950:hover{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.hover\:bg-fuchsia-100:hover{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-200:hover{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.hover\:bg-fuchsia-300:hover{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.hover\:bg-fuchsia-400:hover{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.hover\:bg-fuchsia-50:hover{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-500:hover{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.hover\:bg-fuchsia-600:hover{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.hover\:bg-fuchsia-700:hover{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.hover\:bg-fuchsia-800:hover{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.hover\:bg-fuchsia-900:hover{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.hover\:bg-fuchsia-950:hover{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.hover\:bg-gray-950:hover{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.hover\:bg-green-950:hover{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.hover\:bg-indigo-950:hover{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.hover\:bg-lime-100:hover{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.hover\:bg-lime-200:hover{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.hover\:bg-lime-300:hover{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.hover\:bg-lime-400:hover{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.hover\:bg-lime-50:hover{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.hover\:bg-lime-500:hover{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.hover\:bg-lime-600:hover{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.hover\:bg-lime-700:hover{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.hover\:bg-lime-800:hover{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.hover\:bg-lime-900:hover{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.hover\:bg-lime-950:hover{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.hover\:bg-neutral-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.hover\:bg-neutral-200:hover{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.hover\:bg-neutral-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.hover\:bg-neutral-400:hover{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.hover\:bg-neutral-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-neutral-500:hover{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.hover\:bg-neutral-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.hover\:bg-neutral-700:hover{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.hover\:bg-neutral-800:hover{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.hover\:bg-neutral-900:hover{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.hover\:bg-neutral-950:hover{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.hover\:bg-orange-100:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.hover\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.hover\:bg-orange-300:hover{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.hover\:bg-orange-400:hover{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.hover\:bg-orange-50:hover{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.hover\:bg-orange-800:hover{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.hover\:bg-orange-900:hover{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.hover\:bg-orange-950:hover{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.hover\:bg-pink-950:hover{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.hover\:bg-purple-950:hover{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.hover\:bg-red-950:hover{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.hover\:bg-rose-100:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.hover\:bg-rose-200:hover{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.hover\:bg-rose-300:hover{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.hover\:bg-rose-400:hover{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.hover\:bg-rose-50:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.hover\:bg-rose-500:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.hover\:bg-rose-600:hover{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.hover\:bg-rose-700:hover{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.hover\:bg-rose-800:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.hover\:bg-rose-900:hover{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.hover\:bg-rose-950:hover{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.hover\:bg-sky-100:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.hover\:bg-sky-200:hover{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.hover\:bg-sky-300:hover{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.hover\:bg-sky-400:hover{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.hover\:bg-sky-50:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.hover\:bg-sky-500:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.hover\:bg-sky-600:hover{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.hover\:bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.hover\:bg-sky-800:hover{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.hover\:bg-sky-900:hover{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.hover\:bg-sky-950:hover{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-slate-300:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.hover\:bg-slate-400:hover{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\:bg-slate-500:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.hover\:bg-slate-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.hover\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.hover\:bg-slate-900:hover{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.hover\:bg-slate-950:hover{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.hover\:bg-stone-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.hover\:bg-stone-200:hover{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.hover\:bg-stone-300:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.hover\:bg-stone-400:hover{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.hover\:bg-stone-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.hover\:bg-stone-500:hover{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.hover\:bg-stone-600:hover{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.hover\:bg-stone-700:hover{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.hover\:bg-stone-800:hover{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.hover\:bg-stone-900:hover{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.hover\:bg-stone-950:hover{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.hover\:bg-teal-100:hover{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.hover\:bg-teal-200:hover{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.hover\:bg-teal-300:hover{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.hover\:bg-teal-400:hover{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.hover\:bg-teal-500:hover{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.hover\:bg-teal-700:hover{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.hover\:bg-teal-800:hover{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.hover\:bg-teal-900:hover{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.hover\:bg-teal-950:hover{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.hover\:bg-tremor-background-muted:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-tremor-background-subtle:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-emphasis:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-faint:hover{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.hover\:bg-violet-100:hover{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.hover\:bg-violet-200:hover{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.hover\:bg-violet-300:hover{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.hover\:bg-violet-400:hover{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.hover\:bg-violet-50:hover{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.hover\:bg-violet-500:hover{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.hover\:bg-violet-600:hover{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.hover\:bg-violet-800:hover{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.hover\:bg-violet-900:hover{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.hover\:bg-violet-950:hover{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.hover\:bg-yellow-950:hover{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.hover\:bg-zinc-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.hover\:bg-zinc-200:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.hover\:bg-zinc-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.hover\:bg-zinc-400:hover{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-zinc-500:hover{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.hover\:bg-zinc-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.hover\:bg-zinc-700:hover{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.hover\:bg-zinc-800:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.hover\:bg-zinc-900:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.hover\:bg-zinc-950:hover{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.hover\:text-amber-100:hover{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.hover\:text-amber-200:hover{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.hover\:text-amber-300:hover{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.hover\:text-amber-400:hover{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.hover\:text-amber-50:hover{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.hover\:text-amber-500:hover{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.hover\:text-amber-600:hover{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.hover\:text-amber-700:hover{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.hover\:text-amber-800:hover{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.hover\:text-amber-900:hover{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.hover\:text-amber-950:hover{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.hover\:text-blue-950:hover{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.hover\:text-cyan-100:hover{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.hover\:text-cyan-200:hover{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.hover\:text-cyan-300:hover{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.hover\:text-cyan-400:hover{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.hover\:text-cyan-50:hover{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.hover\:text-cyan-500:hover{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.hover\:text-cyan-600:hover{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.hover\:text-cyan-700:hover{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.hover\:text-cyan-800:hover{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.hover\:text-cyan-900:hover{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.hover\:text-cyan-950:hover{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.hover\:text-emerald-100:hover{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.hover\:text-emerald-200:hover{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.hover\:text-emerald-300:hover{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.hover\:text-emerald-400:hover{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.hover\:text-emerald-50:hover{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.hover\:text-emerald-500:hover{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.hover\:text-emerald-800:hover{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.hover\:text-emerald-900:hover{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.hover\:text-emerald-950:hover{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.hover\:text-fuchsia-100:hover{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.hover\:text-fuchsia-200:hover{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.hover\:text-fuchsia-300:hover{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.hover\:text-fuchsia-400:hover{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.hover\:text-fuchsia-50:hover{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.hover\:text-fuchsia-500:hover{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.hover\:text-fuchsia-600:hover{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.hover\:text-fuchsia-700:hover{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.hover\:text-fuchsia-800:hover{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.hover\:text-fuchsia-900:hover{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.hover\:text-fuchsia-950:hover{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-gray-950:hover{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.hover\:text-green-100:hover{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.hover\:text-green-200:hover{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.hover\:text-green-300:hover{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.hover\:text-green-400:hover{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.hover\:text-green-50:hover{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.hover\:text-green-500:hover{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.hover\:text-green-700:hover{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.hover\:text-green-800:hover{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.hover\:text-green-950:hover{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.hover\:text-indigo-950:hover{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.hover\:text-lime-100:hover{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.hover\:text-lime-200:hover{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.hover\:text-lime-300:hover{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.hover\:text-lime-400:hover{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.hover\:text-lime-50:hover{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.hover\:text-lime-500:hover{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.hover\:text-lime-600:hover{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.hover\:text-lime-700:hover{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.hover\:text-lime-800:hover{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.hover\:text-lime-900:hover{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.hover\:text-lime-950:hover{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.hover\:text-neutral-100:hover{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.hover\:text-neutral-200:hover{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.hover\:text-neutral-300:hover{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.hover\:text-neutral-400:hover{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.hover\:text-neutral-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-neutral-500:hover{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.hover\:text-neutral-600:hover{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.hover\:text-neutral-700:hover{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.hover\:text-neutral-900:hover{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.hover\:text-neutral-950:hover{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.hover\:text-orange-100:hover{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.hover\:text-orange-200:hover{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.hover\:text-orange-300:hover{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.hover\:text-orange-400:hover{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.hover\:text-orange-50:hover{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.hover\:text-orange-500:hover{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.hover\:text-orange-700:hover{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.hover\:text-orange-800:hover{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.hover\:text-orange-900:hover{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.hover\:text-orange-950:hover{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.hover\:text-pink-950:hover{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.hover\:text-purple-950:hover{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.hover\:text-red-100:hover{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.hover\:text-red-200:hover{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.hover\:text-red-50:hover{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.hover\:text-red-950:hover{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.hover\:text-rose-100:hover{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.hover\:text-rose-200:hover{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.hover\:text-rose-300:hover{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.hover\:text-rose-400:hover{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.hover\:text-rose-50:hover{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.hover\:text-rose-500:hover{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.hover\:text-rose-600:hover{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.hover\:text-rose-700:hover{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.hover\:text-rose-800:hover{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.hover\:text-rose-900:hover{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.hover\:text-rose-950:hover{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.hover\:text-sky-100:hover{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.hover\:text-sky-200:hover{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.hover\:text-sky-300:hover{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.hover\:text-sky-400:hover{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.hover\:text-sky-50:hover{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.hover\:text-sky-500:hover{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.hover\:text-sky-600:hover{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.hover\:text-sky-700:hover{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.hover\:text-sky-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-sky-900:hover{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.hover\:text-sky-950:hover{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.hover\:text-slate-100:hover{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.hover\:text-slate-200:hover{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.hover\:text-slate-300:hover{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.hover\:text-slate-400:hover{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.hover\:text-slate-50:hover{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.hover\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\:text-slate-800:hover{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:text-slate-950:hover{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.hover\:text-stone-100:hover{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.hover\:text-stone-200:hover{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.hover\:text-stone-300:hover{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.hover\:text-stone-400:hover{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.hover\:text-stone-50:hover{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.hover\:text-stone-500:hover{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.hover\:text-stone-600:hover{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.hover\:text-stone-700:hover{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.hover\:text-stone-800:hover{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.hover\:text-stone-900:hover{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.hover\:text-stone-950:hover{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.hover\:text-teal-100:hover{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.hover\:text-teal-200:hover{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.hover\:text-teal-300:hover{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.hover\:text-teal-400:hover{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.hover\:text-teal-50:hover{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.hover\:text-teal-500:hover{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.hover\:text-teal-600:hover{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.hover\:text-teal-700:hover{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.hover\:text-teal-800:hover{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.hover\:text-teal-900:hover{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.hover\:text-teal-950:hover{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.hover\:text-tremor-brand-emphasis:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-tremor-content:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-tremor-content-emphasis:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-violet-100:hover{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.hover\:text-violet-200:hover{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.hover\:text-violet-300:hover{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.hover\:text-violet-400:hover{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.hover\:text-violet-50:hover{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.hover\:text-violet-500:hover{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.hover\:text-violet-600:hover{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.hover\:text-violet-700:hover{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.hover\:text-violet-800:hover{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.hover\:text-violet-900:hover{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.hover\:text-violet-950:hover{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.hover\:text-yellow-950:hover{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.hover\:text-zinc-100:hover{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.hover\:text-zinc-200:hover{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.hover\:text-zinc-300:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.hover\:text-zinc-400:hover{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.hover\:text-zinc-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-zinc-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.hover\:text-zinc-800:hover{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.hover\:text-zinc-950:hover{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-tremor-brand-subtle:focus{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0: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(0px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.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)}.focus\:ring-tremor-brand-muted:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.group:active .group-active\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.aria-selected\:\!bg-tremor-background-subtle[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity))!important}.aria-selected\:bg-tremor-background-emphasis[aria-selected=true]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.aria-selected\:\!text-tremor-content[aria-selected=true]{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.aria-selected\:text-tremor-brand-inverted[aria-selected=true],.aria-selected\:text-tremor-content-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.ui-selected\:border-b-2[data-headlessui-state~=selected]{border-bottom-width:2px}.ui-selected\:border-amber-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.ui-selected\:border-amber-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.ui-selected\:border-amber-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.ui-selected\:border-amber-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.ui-selected\:border-amber-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.ui-selected\:border-amber-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.ui-selected\:border-amber-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.ui-selected\:border-amber-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.ui-selected\:border-amber-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.ui-selected\:border-amber-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.ui-selected\:border-amber-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.ui-selected\:border-blue-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.ui-selected\:border-blue-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.ui-selected\:border-blue-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.ui-selected\:border-blue-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.ui-selected\:border-blue-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.ui-selected\:border-blue-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.ui-selected\:border-blue-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ui-selected\:border-blue-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.ui-selected\:border-blue-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.ui-selected\:border-blue-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.ui-selected\:border-blue-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.ui-selected\:border-cyan-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.ui-selected\:border-cyan-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.ui-selected\:border-cyan-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.ui-selected\:border-cyan-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.ui-selected\:border-cyan-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.ui-selected\:border-cyan-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.ui-selected\:border-cyan-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.ui-selected\:border-cyan-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.ui-selected\:border-cyan-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.ui-selected\:border-cyan-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.ui-selected\:border-cyan-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.ui-selected\:border-emerald-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.ui-selected\:border-emerald-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.ui-selected\:border-emerald-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.ui-selected\:border-emerald-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.ui-selected\:border-emerald-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.ui-selected\:border-emerald-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.ui-selected\:border-emerald-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.ui-selected\:border-emerald-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.ui-selected\:border-emerald-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.ui-selected\:border-emerald-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.ui-selected\:border-emerald-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.ui-selected\:border-gray-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.ui-selected\:border-gray-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-gray-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.ui-selected\:border-gray-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.ui-selected\:border-gray-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.ui-selected\:border-gray-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.ui-selected\:border-gray-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.ui-selected\:border-gray-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.ui-selected\:border-gray-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.ui-selected\:border-gray-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.ui-selected\:border-gray-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.ui-selected\:border-green-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.ui-selected\:border-green-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.ui-selected\:border-green-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.ui-selected\:border-green-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.ui-selected\:border-green-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.ui-selected\:border-green-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.ui-selected\:border-green-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ui-selected\:border-green-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.ui-selected\:border-green-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.ui-selected\:border-green-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.ui-selected\:border-green-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.ui-selected\:border-indigo-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.ui-selected\:border-indigo-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.ui-selected\:border-indigo-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.ui-selected\:border-indigo-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-indigo-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.ui-selected\:border-indigo-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.ui-selected\:border-indigo-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.ui-selected\:border-indigo-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.ui-selected\:border-indigo-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.ui-selected\:border-lime-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.ui-selected\:border-lime-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.ui-selected\:border-lime-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.ui-selected\:border-lime-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.ui-selected\:border-lime-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.ui-selected\:border-lime-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.ui-selected\:border-lime-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.ui-selected\:border-lime-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.ui-selected\:border-lime-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.ui-selected\:border-lime-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.ui-selected\:border-lime-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.ui-selected\:border-neutral-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.ui-selected\:border-neutral-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.ui-selected\:border-neutral-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.ui-selected\:border-neutral-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.ui-selected\:border-neutral-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-neutral-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.ui-selected\:border-neutral-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.ui-selected\:border-neutral-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.ui-selected\:border-neutral-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.ui-selected\:border-neutral-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.ui-selected\:border-neutral-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.ui-selected\:border-orange-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.ui-selected\:border-orange-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.ui-selected\:border-orange-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.ui-selected\:border-orange-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.ui-selected\:border-orange-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.ui-selected\:border-orange-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.ui-selected\:border-orange-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.ui-selected\:border-orange-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.ui-selected\:border-orange-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.ui-selected\:border-orange-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.ui-selected\:border-orange-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.ui-selected\:border-pink-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.ui-selected\:border-pink-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.ui-selected\:border-pink-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.ui-selected\:border-pink-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.ui-selected\:border-pink-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.ui-selected\:border-pink-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.ui-selected\:border-pink-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.ui-selected\:border-pink-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.ui-selected\:border-pink-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.ui-selected\:border-pink-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.ui-selected\:border-pink-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.ui-selected\:border-purple-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.ui-selected\:border-purple-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.ui-selected\:border-purple-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.ui-selected\:border-purple-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.ui-selected\:border-purple-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.ui-selected\:border-purple-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.ui-selected\:border-purple-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ui-selected\:border-purple-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.ui-selected\:border-purple-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.ui-selected\:border-purple-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.ui-selected\:border-purple-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.ui-selected\:border-red-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.ui-selected\:border-red-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.ui-selected\:border-red-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.ui-selected\:border-red-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.ui-selected\:border-red-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.ui-selected\:border-red-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.ui-selected\:border-red-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ui-selected\:border-red-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.ui-selected\:border-red-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.ui-selected\:border-red-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.ui-selected\:border-red-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.ui-selected\:border-rose-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.ui-selected\:border-rose-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.ui-selected\:border-rose-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.ui-selected\:border-rose-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.ui-selected\:border-rose-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.ui-selected\:border-rose-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.ui-selected\:border-rose-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.ui-selected\:border-rose-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.ui-selected\:border-rose-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.ui-selected\:border-rose-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.ui-selected\:border-rose-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.ui-selected\:border-sky-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.ui-selected\:border-sky-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.ui-selected\:border-sky-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.ui-selected\:border-sky-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.ui-selected\:border-sky-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.ui-selected\:border-sky-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.ui-selected\:border-sky-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.ui-selected\:border-sky-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.ui-selected\:border-sky-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.ui-selected\:border-sky-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.ui-selected\:border-sky-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.ui-selected\:border-slate-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.ui-selected\:border-slate-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.ui-selected\:border-slate-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.ui-selected\:border-slate-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.ui-selected\:border-slate-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.ui-selected\:border-slate-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.ui-selected\:border-slate-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.ui-selected\:border-slate-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.ui-selected\:border-slate-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.ui-selected\:border-slate-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.ui-selected\:border-slate-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.ui-selected\:border-stone-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.ui-selected\:border-stone-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.ui-selected\:border-stone-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ui-selected\:border-stone-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.ui-selected\:border-stone-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.ui-selected\:border-stone-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.ui-selected\:border-stone-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.ui-selected\:border-stone-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.ui-selected\:border-stone-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.ui-selected\:border-stone-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.ui-selected\:border-stone-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.ui-selected\:border-teal-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.ui-selected\:border-teal-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.ui-selected\:border-teal-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.ui-selected\:border-teal-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.ui-selected\:border-teal-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.ui-selected\:border-teal-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.ui-selected\:border-teal-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.ui-selected\:border-teal-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.ui-selected\:border-teal-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.ui-selected\:border-teal-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.ui-selected\:border-teal-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.ui-selected\:border-tremor-border[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-tremor-brand[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-violet-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.ui-selected\:border-violet-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.ui-selected\:border-violet-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.ui-selected\:border-violet-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.ui-selected\:border-violet-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.ui-selected\:border-violet-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.ui-selected\:border-violet-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.ui-selected\:border-violet-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.ui-selected\:border-violet-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.ui-selected\:border-violet-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.ui-selected\:border-violet-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.ui-selected\:border-yellow-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.ui-selected\:border-yellow-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.ui-selected\:border-yellow-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.ui-selected\:border-yellow-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.ui-selected\:border-yellow-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.ui-selected\:border-yellow-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.ui-selected\:border-yellow-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ui-selected\:border-yellow-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.ui-selected\:border-yellow-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.ui-selected\:border-yellow-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.ui-selected\:border-yellow-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.ui-selected\:border-zinc-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.ui-selected\:border-zinc-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.ui-selected\:border-zinc-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.ui-selected\:border-zinc-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.ui-selected\:border-zinc-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-zinc-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.ui-selected\:border-zinc-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.ui-selected\:border-zinc-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.ui-selected\:border-zinc-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.ui-selected\:border-zinc-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.ui-selected\:border-zinc-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.ui-selected\:bg-amber-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.ui-selected\:bg-amber-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.ui-selected\:bg-amber-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.ui-selected\:bg-amber-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.ui-selected\:bg-amber-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.ui-selected\:bg-amber-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.ui-selected\:bg-amber-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.ui-selected\:bg-amber-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.ui-selected\:bg-amber-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.ui-selected\:bg-amber-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.ui-selected\:bg-amber-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.ui-selected\:bg-blue-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.ui-selected\:bg-blue-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.ui-selected\:bg-blue-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.ui-selected\:bg-blue-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.ui-selected\:bg-blue-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.ui-selected\:bg-blue-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.ui-selected\:bg-blue-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.ui-selected\:bg-blue-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.ui-selected\:bg-blue-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.ui-selected\:bg-gray-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.ui-selected\:bg-gray-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.ui-selected\:bg-gray-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.ui-selected\:bg-gray-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.ui-selected\:bg-gray-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-gray-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.ui-selected\:bg-gray-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.ui-selected\:bg-gray-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.ui-selected\:bg-gray-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.ui-selected\:bg-gray-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.ui-selected\:bg-gray-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.ui-selected\:bg-green-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.ui-selected\:bg-green-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.ui-selected\:bg-green-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.ui-selected\:bg-green-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.ui-selected\:bg-green-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.ui-selected\:bg-green-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.ui-selected\:bg-green-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.ui-selected\:bg-green-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.ui-selected\:bg-green-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.ui-selected\:bg-green-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.ui-selected\:bg-green-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.ui-selected\:bg-lime-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.ui-selected\:bg-lime-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.ui-selected\:bg-lime-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.ui-selected\:bg-lime-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.ui-selected\:bg-lime-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.ui-selected\:bg-lime-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.ui-selected\:bg-lime-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.ui-selected\:bg-lime-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.ui-selected\:bg-lime-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.ui-selected\:bg-lime-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.ui-selected\:bg-lime-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-orange-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.ui-selected\:bg-orange-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.ui-selected\:bg-orange-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.ui-selected\:bg-orange-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.ui-selected\:bg-orange-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.ui-selected\:bg-orange-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.ui-selected\:bg-orange-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.ui-selected\:bg-pink-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.ui-selected\:bg-pink-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.ui-selected\:bg-pink-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.ui-selected\:bg-pink-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.ui-selected\:bg-pink-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.ui-selected\:bg-pink-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.ui-selected\:bg-pink-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.ui-selected\:bg-pink-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.ui-selected\:bg-pink-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.ui-selected\:bg-pink-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.ui-selected\:bg-pink-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.ui-selected\:bg-purple-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.ui-selected\:bg-purple-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.ui-selected\:bg-purple-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.ui-selected\:bg-purple-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.ui-selected\:bg-purple-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.ui-selected\:bg-purple-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.ui-selected\:bg-purple-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.ui-selected\:bg-purple-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.ui-selected\:bg-red-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.ui-selected\:bg-red-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.ui-selected\:bg-red-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.ui-selected\:bg-red-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.ui-selected\:bg-red-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.ui-selected\:bg-red-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.ui-selected\:bg-red-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-red-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.ui-selected\:bg-red-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.ui-selected\:bg-red-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.ui-selected\:bg-red-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-rose-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.ui-selected\:bg-rose-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.ui-selected\:bg-rose-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.ui-selected\:bg-rose-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.ui-selected\:bg-rose-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.ui-selected\:bg-rose-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.ui-selected\:bg-rose-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.ui-selected\:bg-rose-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.ui-selected\:bg-rose-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.ui-selected\:bg-rose-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.ui-selected\:bg-rose-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.ui-selected\:bg-sky-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.ui-selected\:bg-sky-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.ui-selected\:bg-sky-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.ui-selected\:bg-sky-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.ui-selected\:bg-sky-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.ui-selected\:bg-sky-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.ui-selected\:bg-sky-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.ui-selected\:bg-sky-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.ui-selected\:bg-sky-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.ui-selected\:bg-sky-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.ui-selected\:bg-sky-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.ui-selected\:bg-slate-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.ui-selected\:bg-slate-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.ui-selected\:bg-slate-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.ui-selected\:bg-slate-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.ui-selected\:bg-slate-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.ui-selected\:bg-slate-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.ui-selected\:bg-slate-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.ui-selected\:bg-slate-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.ui-selected\:bg-slate-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.ui-selected\:bg-slate-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.ui-selected\:bg-slate-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ui-selected\:bg-stone-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ui-selected\:bg-stone-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ui-selected\:bg-stone-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.ui-selected\:bg-stone-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.ui-selected\:bg-stone-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.ui-selected\:bg-stone-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.ui-selected\:bg-stone-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.ui-selected\:bg-stone-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.ui-selected\:bg-stone-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.ui-selected\:bg-teal-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.ui-selected\:bg-teal-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.ui-selected\:bg-teal-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.ui-selected\:bg-teal-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.ui-selected\:bg-teal-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.ui-selected\:bg-teal-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.ui-selected\:bg-teal-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.ui-selected\:bg-teal-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.ui-selected\:bg-teal-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.ui-selected\:bg-teal-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.ui-selected\:bg-teal-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background-muted[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-violet-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.ui-selected\:bg-violet-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.ui-selected\:bg-violet-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.ui-selected\:bg-violet-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.ui-selected\:bg-violet-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.ui-selected\:bg-violet-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.ui-selected\:bg-violet-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.ui-selected\:bg-violet-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.ui-selected\:bg-violet-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.ui-selected\:text-amber-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.ui-selected\:text-amber-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.ui-selected\:text-amber-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.ui-selected\:text-amber-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.ui-selected\:text-amber-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.ui-selected\:text-amber-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.ui-selected\:text-amber-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.ui-selected\:text-amber-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.ui-selected\:text-amber-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.ui-selected\:text-amber-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.ui-selected\:text-amber-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.ui-selected\:text-blue-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.ui-selected\:text-blue-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.ui-selected\:text-blue-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.ui-selected\:text-blue-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ui-selected\:text-blue-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.ui-selected\:text-blue-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.ui-selected\:text-blue-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ui-selected\:text-blue-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.ui-selected\:text-blue-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.ui-selected\:text-blue-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.ui-selected\:text-blue-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.ui-selected\:text-cyan-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.ui-selected\:text-cyan-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.ui-selected\:text-cyan-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.ui-selected\:text-cyan-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.ui-selected\:text-cyan-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.ui-selected\:text-cyan-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.ui-selected\:text-cyan-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.ui-selected\:text-cyan-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.ui-selected\:text-cyan-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.ui-selected\:text-cyan-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.ui-selected\:text-cyan-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-emerald-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.ui-selected\:text-emerald-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.ui-selected\:text-emerald-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.ui-selected\:text-emerald-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.ui-selected\:text-emerald-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.ui-selected\:text-emerald-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.ui-selected\:text-emerald-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.ui-selected\:text-emerald-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.ui-selected\:text-emerald-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.ui-selected\:text-emerald-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.ui-selected\:text-emerald-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.ui-selected\:text-gray-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.ui-selected\:text-gray-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.ui-selected\:text-gray-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.ui-selected\:text-gray-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.ui-selected\:text-gray-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.ui-selected\:text-gray-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.ui-selected\:text-gray-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.ui-selected\:text-gray-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-gray-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.ui-selected\:text-gray-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-gray-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.ui-selected\:text-green-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.ui-selected\:text-green-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.ui-selected\:text-green-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.ui-selected\:text-green-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.ui-selected\:text-green-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.ui-selected\:text-green-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.ui-selected\:text-green-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ui-selected\:text-green-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.ui-selected\:text-green-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.ui-selected\:text-green-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.ui-selected\:text-green-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.ui-selected\:text-indigo-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.ui-selected\:text-indigo-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.ui-selected\:text-indigo-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.ui-selected\:text-indigo-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-indigo-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.ui-selected\:text-indigo-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.ui-selected\:text-indigo-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.ui-selected\:text-indigo-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.ui-selected\:text-indigo-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.ui-selected\:text-lime-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.ui-selected\:text-lime-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.ui-selected\:text-lime-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.ui-selected\:text-lime-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.ui-selected\:text-lime-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.ui-selected\:text-lime-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.ui-selected\:text-lime-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.ui-selected\:text-lime-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.ui-selected\:text-lime-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.ui-selected\:text-lime-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.ui-selected\:text-lime-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.ui-selected\:text-neutral-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.ui-selected\:text-neutral-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.ui-selected\:text-neutral-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.ui-selected\:text-neutral-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.ui-selected\:text-neutral-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-neutral-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.ui-selected\:text-neutral-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.ui-selected\:text-neutral-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.ui-selected\:text-neutral-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.ui-selected\:text-neutral-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.ui-selected\:text-neutral-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.ui-selected\:text-orange-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.ui-selected\:text-orange-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.ui-selected\:text-orange-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.ui-selected\:text-orange-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.ui-selected\:text-orange-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.ui-selected\:text-orange-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.ui-selected\:text-orange-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.ui-selected\:text-orange-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.ui-selected\:text-orange-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.ui-selected\:text-orange-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.ui-selected\:text-orange-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.ui-selected\:text-pink-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.ui-selected\:text-pink-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.ui-selected\:text-pink-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.ui-selected\:text-pink-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.ui-selected\:text-pink-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.ui-selected\:text-pink-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.ui-selected\:text-pink-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.ui-selected\:text-pink-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.ui-selected\:text-pink-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.ui-selected\:text-pink-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.ui-selected\:text-pink-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.ui-selected\:text-purple-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.ui-selected\:text-purple-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.ui-selected\:text-purple-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.ui-selected\:text-purple-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.ui-selected\:text-purple-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.ui-selected\:text-purple-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.ui-selected\:text-purple-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ui-selected\:text-purple-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.ui-selected\:text-purple-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.ui-selected\:text-purple-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.ui-selected\:text-purple-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.ui-selected\:text-red-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.ui-selected\:text-red-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.ui-selected\:text-red-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.ui-selected\:text-red-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.ui-selected\:text-red-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.ui-selected\:text-red-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.ui-selected\:text-red-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ui-selected\:text-red-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.ui-selected\:text-red-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.ui-selected\:text-red-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.ui-selected\:text-red-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.ui-selected\:text-rose-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.ui-selected\:text-rose-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.ui-selected\:text-rose-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.ui-selected\:text-rose-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.ui-selected\:text-rose-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.ui-selected\:text-rose-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.ui-selected\:text-rose-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.ui-selected\:text-rose-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.ui-selected\:text-rose-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.ui-selected\:text-rose-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.ui-selected\:text-rose-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.ui-selected\:text-sky-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.ui-selected\:text-sky-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.ui-selected\:text-sky-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.ui-selected\:text-sky-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.ui-selected\:text-sky-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.ui-selected\:text-sky-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.ui-selected\:text-sky-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.ui-selected\:text-sky-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.ui-selected\:text-sky-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.ui-selected\:text-sky-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.ui-selected\:text-sky-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.ui-selected\:text-slate-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.ui-selected\:text-slate-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.ui-selected\:text-slate-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.ui-selected\:text-slate-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.ui-selected\:text-slate-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.ui-selected\:text-slate-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.ui-selected\:text-slate-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.ui-selected\:text-slate-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.ui-selected\:text-slate-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.ui-selected\:text-slate-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ui-selected\:text-slate-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.ui-selected\:text-stone-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.ui-selected\:text-stone-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.ui-selected\:text-stone-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.ui-selected\:text-stone-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.ui-selected\:text-stone-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.ui-selected\:text-stone-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ui-selected\:text-stone-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ui-selected\:text-stone-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.ui-selected\:text-stone-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.ui-selected\:text-stone-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.ui-selected\:text-stone-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.ui-selected\:text-teal-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.ui-selected\:text-teal-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.ui-selected\:text-teal-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.ui-selected\:text-teal-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.ui-selected\:text-teal-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.ui-selected\:text-teal-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.ui-selected\:text-teal-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.ui-selected\:text-teal-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.ui-selected\:text-teal-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.ui-selected\:text-teal-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.ui-selected\:text-teal-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.ui-selected\:text-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-emphasis[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-strong[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-violet-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.ui-selected\:text-violet-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.ui-selected\:text-violet-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.ui-selected\:text-violet-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.ui-selected\:text-violet-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.ui-selected\:text-violet-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.ui-selected\:text-violet-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.ui-selected\:text-violet-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.ui-selected\:text-violet-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.ui-selected\:text-violet-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.ui-selected\:text-violet-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.ui-selected\:text-yellow-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.ui-selected\:text-yellow-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.ui-selected\:text-yellow-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.ui-selected\:text-yellow-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.ui-selected\:text-yellow-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.ui-selected\:text-yellow-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.ui-selected\:text-yellow-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ui-selected\:text-yellow-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.ui-selected\:text-yellow-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.ui-selected\:text-yellow-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.ui-selected\:text-yellow-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.ui-selected\:text-zinc-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.ui-selected\:text-zinc-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.ui-selected\:text-zinc-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.ui-selected\:text-zinc-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.ui-selected\:text-zinc-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-zinc-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.ui-selected\:text-zinc-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.ui-selected\:text-zinc-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.ui-selected\:text-zinc-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.ui-selected\:text-zinc-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.ui-selected\:text-zinc-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.ui-selected\:shadow-tremor-input[data-headlessui-state~=selected]{--tw-shadow:0 1px 2px 0 rgba(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)}:where([data-headlessui-state~=selected]) .ui-selected\:border-b-2{border-bottom-width:2px}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(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)}.ui-active\:bg-tremor-background-muted[data-headlessui-state~=active]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-active\:text-tremor-content-strong[data-headlessui-state~=active]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=active]) .ui-active\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=active]) .ui-active\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:divide-dark-tremor-border)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}:is(.dark .dark\:border-dark-tremor-background){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-emphasis){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-inverted){--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-subtle){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-emphasis){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-subtle){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-border){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand){--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted){--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted\/70){background-color:rgba(30,27,75,.7)}:is(.dark .dark\:bg-dark-tremor-brand-subtle){--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-content-subtle){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:bg-slate-950\/50){background-color:rgba(2,6,23,.5)}:is(.dark .dark\:bg-opacity-10){--tw-bg-opacity:0.1}:is(.dark .dark\:bg-opacity-25){--tw-bg-opacity:0.25}:is(.dark .dark\:bg-opacity-30){--tw-bg-opacity:0.3}:is(.dark .dark\:from-dark-tremor-background){--tw-gradient-from:#111827 var(--tw-gradient-from-position);--tw-gradient-to:rgba(17,24,39,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(.dark .dark\:to-dark-tremor-background){--tw-gradient-to:#111827 var(--tw-gradient-to-position)}:is(.dark .dark\:fill-dark-tremor-content){fill:#6b7280}:is(.dark .dark\:fill-dark-tremor-content-emphasis){fill:#e5e7eb}:is(.dark .dark\:stroke-dark-tremor-background){stroke:#111827}:is(.dark .dark\:stroke-dark-tremor-border){stroke:#374151}:is(.dark .dark\:stroke-dark-tremor-brand){stroke:#6366f1}:is(.dark .dark\:stroke-dark-tremor-brand-muted){stroke:#1e1b4b}:is(.dark .dark\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-emphasis){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-inverted){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-subtle){--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:accent-dark-tremor-brand){accent-color:#6366f1}:is(.dark .dark\:opacity-25){opacity:.25}:is(.dark .dark\:shadow-dark-tremor-card){--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:shadow-dark-tremor-dropdown){--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(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)}:is(.dark .dark\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:outline-dark-tremor-brand){outline-color:#6366f1}:is(.dark .dark\:ring-dark-tremor-brand-inverted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-brand-muted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-ring){--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-brand-emphasis:hover){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-content-emphasis:hover){--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-muted:hover){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-subtle:hover){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-emphasis:hover){--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-faint:hover){--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-opacity-20:hover){--tw-bg-opacity:0.2}:is(.dark .dark\:hover\:text-dark-tremor-brand-emphasis:hover){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:is(.dark .hover\:dark\:text-dark-tremor-content):hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:focus\:border-dark-tremor-brand-subtle:focus){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .focus\:dark\:border-dark-tremor-brand-subtle):focus{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:focus\:ring-dark-tremor-brand-muted:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .focus\:dark\:ring-dark-tremor-brand-muted):focus{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .group:hover .dark\:group-hover\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .aria-selected\:dark\:\!bg-dark-tremor-background-subtle)[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(31 41 55/var(--tw-bg-opacity))!important}:is(.dark .dark\:aria-selected\:bg-dark-tremor-background-emphasis[aria-selected=true]){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-content-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-border[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-brand[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background-muted[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-emphasis[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-strong[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:shadow-dark-tremor-input[data-headlessui-state~=selected]){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:ui-active\:bg-dark-tremor-background-muted[data-headlessui-state~=active]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-active\:text-dark-tremor-content-strong[data-headlessui-state~=active]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}@media (min-width:640px){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:items-start{align-items:flex-start}.sm\: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)))}.sm\: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))}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}}@media (min-width:768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}}@media (min-width:1024px){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:max-w-\[200px\]{max-width:200px}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button,.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none} \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.html b/ui/litellm-dashboard/out/index.html index a40ac1ea3..99ac50ef5 100644 --- a/ui/litellm-dashboard/out/index.html +++ b/ui/litellm-dashboard/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.txt b/ui/litellm-dashboard/out/index.txt index 2d9afff4b..a259886a9 100644 --- a/ui/litellm-dashboard/out/index.txt +++ b/ui/litellm-dashboard/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[9125,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-ad3e13d2fec661b5.js"],""] +3:I[74961,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-a458360dd75bd774.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["SP1Cm97dc_3zo4HlsJJjg",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/16eb955147cb6b2f.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["HnLepq2YNME88Nzo5qHls",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null diff --git a/ui/litellm-dashboard/src/app/page.tsx b/ui/litellm-dashboard/src/app/page.tsx index 21ea43aab..e0abcda6d 100644 --- a/ui/litellm-dashboard/src/app/page.tsx +++ b/ui/litellm-dashboard/src/app/page.tsx @@ -18,6 +18,7 @@ const CreateKeyPage = () => { const [userRole, setUserRole] = useState(""); const [userEmail, setUserEmail] = useState(null); const [teams, setTeams] = useState(null); + const [keys, setKeys] = useState(null); const [showSSOBanner, setShowSSOBanner] = useState(true); const searchParams = useSearchParams(); @@ -111,10 +112,12 @@ const CreateKeyPage = () => { userID={userID} userRole={userRole} teams={teams} + keys={keys} setUserRole={setUserRole} userEmail={userEmail} setUserEmail={setUserEmail} setTeams={setTeams} + setKeys={setKeys} /> ) : page == "models" ? ( { userID={userID} userRole={userRole} token={token} + keys={keys} accessToken={accessToken} + setKeys={setKeys} /> ) : page == "teams" ? ( { try { - const url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/logs` : `/global/spend/logs`; + const url = proxyBaseUrl + ? `${proxyBaseUrl}/global/spend/logs` + : `/global/spend/logs`; console.log("in keySpendLogsCall:", url); const response = await fetch(`${url}/?api_key=${token}`, { method: "GET", @@ -404,20 +406,42 @@ export const adminTopKeysCall = async (accessToken: String) => { } }; -export const adminTopEndUsersCall = async (accessToken: String) => { +export const adminTopEndUsersCall = async ( + accessToken: String, + keyToken: String | null +) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/end_users` : `/global/spend/end_users`; + let body = ""; + if (keyToken) { + body = JSON.stringify({ api_key: keyToken }); + } message.info("Making top end users request"); - const response = await fetch(url, { - method: "GET", + + // Define requestOptions with body as an optional property + const requestOptions: { + method: string; + headers: { + Authorization: string; + "Content-Type": string; + }; + body?: string; // The body is optional and might not be present + } = { + method: "POST", headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json", }, - }); + }; + + if (keyToken) { + requestOptions.body = JSON.stringify({ api_key: keyToken }); + } + + const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); message.error(errorData); @@ -749,8 +773,10 @@ export const userUpdateUserCall = async ( } }; - -export const PredictedSpendLogsCall = async (accessToken: string, requestData: any) => { +export const PredictedSpendLogsCall = async ( + accessToken: string, + requestData: any +) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/predict/spend/logs` @@ -764,11 +790,9 @@ export const PredictedSpendLogsCall = async (accessToken: string, requestData: a Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json", }, - body: JSON.stringify( - { - data: requestData - } - ), + body: JSON.stringify({ + data: requestData, + }), }); if (!response.ok) { @@ -786,4 +810,3 @@ export const PredictedSpendLogsCall = async (accessToken: string, requestData: a throw error; } }; - diff --git a/ui/litellm-dashboard/src/components/user_dashboard.tsx b/ui/litellm-dashboard/src/components/user_dashboard.tsx index ce3ac5eaa..61e0fe235 100644 --- a/ui/litellm-dashboard/src/components/user_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/user_dashboard.tsx @@ -23,21 +23,24 @@ interface UserDashboardProps { userRole: string | null; userEmail: string | null; teams: any[] | null; + keys: any[] | null; setUserRole: React.Dispatch>; setUserEmail: React.Dispatch>; setTeams: React.Dispatch>; + setKeys: React.Dispatch>; } const UserDashboard: React.FC = ({ userID, userRole, teams, + keys, setUserRole, userEmail, setUserEmail, setTeams, + setKeys, }) => { - const [data, setData] = useState(null); // Keep the initialization of state here const [userSpendData, setUserSpendData] = useState( null ); @@ -113,7 +116,7 @@ const UserDashboard: React.FC = ({ } } } - if (userID && accessToken && userRole && !data) { + if (userID && accessToken && userRole && !keys && !userSpendData) { const cachedUserModels = sessionStorage.getItem("userModels" + userID); if (cachedUserModels) { setUserModels(JSON.parse(cachedUserModels)); @@ -127,7 +130,7 @@ const UserDashboard: React.FC = ({ )}; team values: ${Object.entries(response.teams)}` ); setUserSpendData(response["user_info"]); - setData(response["keys"]); // Assuming this is the correct path to your data + setKeys(response["keys"]); // Assuming this is the correct path to your data setTeams(response["teams"]); setSelectedTeam(response["teams"] ? response["teams"][0] : null); sessionStorage.setItem( @@ -165,7 +168,7 @@ const UserDashboard: React.FC = ({ fetchData(); } } - }, [userID, token, accessToken, data, userRole]); + }, [userID, token, accessToken, keys, userRole]); if (userID == null || token == null) { // Now you can construct the full URL @@ -207,8 +210,8 @@ const UserDashboard: React.FC = ({ = ({ userRole={userRole} userModels={userModels} accessToken={accessToken} - data={data} - setData={setData} + data={keys} + setData={setKeys} /> diff --git a/ui/litellm-dashboard/src/components/view_users.tsx b/ui/litellm-dashboard/src/components/view_users.tsx index 5b2b5f6de..0c32b31e8 100644 --- a/ui/litellm-dashboard/src/components/view_users.tsx +++ b/ui/litellm-dashboard/src/components/view_users.tsx @@ -29,15 +29,19 @@ import Paragraph from "antd/es/skeleton/Paragraph"; interface ViewUserDashboardProps { accessToken: string | null; token: string | null; + keys: any[] | null; userRole: string | null; userID: string | null; + setKeys: React.Dispatch>; } const ViewUserDashboard: React.FC = ({ accessToken, token, + keys, userRole, userID, + setKeys, }) => { const [userData, setUserData] = useState(null); const [endUsers, setEndUsers] = useState(null); @@ -70,7 +74,7 @@ const ViewUserDashboard: React.FC = ({ const fetchEndUserSpend = async () => { try { - const topEndUsers = await adminTopEndUsersCall(accessToken); + const topEndUsers = await adminTopEndUsersCall(accessToken, null); console.log("user data response:", topEndUsers); setEndUsers(topEndUsers); } catch (error) { @@ -94,6 +98,16 @@ const ViewUserDashboard: React.FC = ({ return
Loading...
; } + const onKeyClick = async (keyToken: String) => { + try { + const topEndUsers = await adminTopEndUsersCall(accessToken, keyToken); + console.log("user data response:", topEndUsers); + setEndUsers(topEndUsers); + } catch (error) { + console.error("There was an error fetching the model data", error); + } + }; + function renderPagination() { if (!userData) return null; @@ -175,9 +189,23 @@ const ViewUserDashboard: React.FC = ({
Key
From c1ba512ae88c1342506e266a1d4a1a0640c568a5 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 20:51:07 -0800 Subject: [PATCH 013/304] refactor(main.py): trigger new build --- litellm/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/main.py b/litellm/main.py index a8d919117..67586603d 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,6 +12,7 @@ from typing import Any, Literal, Union from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy + import httpx import litellm from ._logging import verbose_logger From 57f37f743886a0249f630a6792d49dffc2c5d9b7 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 20:51:19 -0800 Subject: [PATCH 014/304] =?UTF-8?q?bump:=20version=201.28.7=20=E2=86=92=20?= =?UTF-8?q?1.28.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5ab83ee6d..0dbe465c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.7" +version = "1.28.8" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.7" +version = "1.28.8" version_files = [ "pyproject.toml:^version" ] From bf92f84b001391f8c7f97da924231f46a38b7591 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 23:53:16 -0500 Subject: [PATCH 015/304] update prices and context window --- model_prices_and_context_window.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 66061acc4..13e54bdf9 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -1211,6 +1211,20 @@ "litellm_provider": "bedrock", "mode": "embedding" }, + "bedrock/us-west-2/mistral.mixtral-8x7b-instruct": { + "max_tokens": 32000, + "input_cost_per_token": 0.00000045, + "output_cost_per_token": 0.0000007, + "litellm_provider": "bedrock", + "mode": "completion" + }, + "bedrock/us-west-2/mistral.mistral-7b-instruct": { + "max_tokens": 32000, + "input_cost_per_token": 0.00000015, + "output_cost_per_token": 0.0000002, + "litellm_provider": "bedrock", + "mode": "completion" + }, "anthropic.claude-v1": { "max_tokens": 100000, "max_output_tokens": 8191, @@ -2195,4 +2209,4 @@ "mode": "embedding" } -} +} \ No newline at end of file From d3a742efc8f827fe9de7656ac4a7d0352d7752fb Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 20:57:23 -0800 Subject: [PATCH 016/304] docs(supported_embedding.md): add vertex ai embeddings to docs --- .../docs/embedding/supported_embedding.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/my-website/docs/embedding/supported_embedding.md b/docs/my-website/docs/embedding/supported_embedding.md index d864c5796..6c638d6de 100644 --- a/docs/my-website/docs/embedding/supported_embedding.md +++ b/docs/my-website/docs/embedding/supported_embedding.md @@ -235,6 +235,35 @@ print(response) | mistral-embed | `embedding(model="mistral/mistral-embed", input)` | +## Vertex AI Embedding Models + +### Usage - Embedding +```python +import litellm +from litellm import embedding +litellm.vertex_project = "hardy-device-38811" # Your Project ID +litellm.vertex_location = "us-central1" # proj location + + +os.environ['VOYAGE_API_KEY'] = "" +response = embedding( + model="vertex_ai/textembedding-gecko", + input=["good morning from litellm"], +) +print(response) +``` + +## Supported Models +All models listed [here](https://github.com/BerriAI/litellm/blob/57f37f743886a0249f630a6792d49dffc2c5d9b7/model_prices_and_context_window.json#L835) are supported + +| Model Name | Function Call | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| textembedding-gecko | `embedding(model="vertex_ai/textembedding-gecko", input)` | +| textembedding-gecko-multilingual | `embedding(model="vertex_ai/textembedding-gecko-multilingual", input)` | +| textembedding-gecko-multilingual@001 | `embedding(model="vertex_ai/textembedding-gecko-multilingual@001", input)` | +| textembedding-gecko@001 | `embedding(model="vertex_ai/textembedding-gecko@001", input)` | +| textembedding-gecko@003 | `embedding(model="vertex_ai/textembedding-gecko@003", input)` | + ## Voyage AI Embedding Models ### Usage - Embedding From 2c97b952eae2bc90ec921dcb284103c0833ba528 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Fri, 1 Mar 2024 23:58:03 -0500 Subject: [PATCH 017/304] follow camelcase convention --- litellm/llms/bedrock.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 3f14ac9e4..e0938ded8 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -287,14 +287,14 @@ class AmazonMistralConfig: Reference: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-mistral.html Supported Params for the Amazon / Mistral models: - - `max_tokens` (integer) max tokens, + - `maxTokens` (integer) max tokens, - `temperature` (float) temperature for model, - - `top_p` (float) top p for model + - `topP` (float) top p for model - `stop` [string] A list of stop sequences that if generated by the model, stops the model from generating further output. - - `top_k` (float) top k for model + - `topK` (float) top k for model """ - max_tokens: Optional[int] = None + maxTokens: Optional[int] = None temperature: Optional[float] = None topP: Optional[float] = None topK: Optional[float] = None @@ -302,7 +302,7 @@ class AmazonMistralConfig: def __init__( self, - max_tokens: Optional[int] = None, + maxTokens: Optional[int] = None, temperature: Optional[float] = None, topP: Optional[int] = None, topK: Optional[float] = None, @@ -1118,4 +1118,4 @@ def image_generation( image_dict = {"url": artifact["base64"]} model_response.data = image_dict - return model_response + return model_response \ No newline at end of file From 67110df3e13ed1b1a0e1d5d825aa1ad5262dd448 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Sat, 2 Mar 2024 00:07:21 -0500 Subject: [PATCH 018/304] change to snake case 'cause of aws docs --- litellm/llms/bedrock.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index e0938ded8..1a25e167a 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -287,25 +287,25 @@ class AmazonMistralConfig: Reference: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-mistral.html Supported Params for the Amazon / Mistral models: - - `maxTokens` (integer) max tokens, + - `max_tokens` (integer) max tokens, - `temperature` (float) temperature for model, - - `topP` (float) top p for model + - `top_p` (float) top p for model - `stop` [string] A list of stop sequences that if generated by the model, stops the model from generating further output. - - `topK` (float) top k for model + - `top_k` (float) top k for model """ - maxTokens: Optional[int] = None + max_tokens: Optional[int] = None temperature: Optional[float] = None - topP: Optional[float] = None - topK: Optional[float] = None + top_p: Optional[float] = None + top_k: Optional[float] = None stop: Optional[list[str]] = None def __init__( self, - maxTokens: Optional[int] = None, + max_tokens: Optional[int] = None, temperature: Optional[float] = None, - topP: Optional[int] = None, - topK: Optional[float] = None, + top_p: Optional[int] = None, + top_k: Optional[float] = None, stop: Optional[list[str]] = None, ) -> None: locals_ = locals() From 39037d1e223d393e34ab18e3e982b9120fb2fc76 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 1 Mar 2024 21:23:10 -0800 Subject: [PATCH 019/304] fix(utils.py): handle mistral streaming error --- litellm/utils.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/litellm/utils.py b/litellm/utils.py index 6d64368f8..4d124ee06 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -6571,6 +6571,17 @@ def exception_type( model=model, response=original_exception.response, ) + elif "Mistral API raised a streaming error" in error_str: + exception_mapping_worked = True + _request = httpx.Request( + method="POST", url="https://api.openai.com/v1" + ) + raise APIError( + message=f"{exception_provider} - {message}", + llm_provider=custom_llm_provider, + model=model, + response=httpx.Response(status_code=500, request=_request), + ) elif hasattr(original_exception, "status_code"): exception_mapping_worked = True if original_exception.status_code == 401: @@ -8787,6 +8798,10 @@ class CustomStreamWrapper: completion_obj["content"] = response_obj["text"] print_verbose(f"completion obj content: {completion_obj['content']}") if response_obj["is_finished"]: + if response_obj["finish_reason"] == "error": + raise Exception( + "Mistral API raised a streaming error - finish_reason: error, no content string given." + ) model_response.choices[0].finish_reason = response_obj[ "finish_reason" ] From 381858139ec50fbbd7411113871300f5c4e88c1e Mon Sep 17 00:00:00 2001 From: Mikhail Khludnev Date: Sat, 2 Mar 2024 13:41:59 +0300 Subject: [PATCH 020/304] utils.validate_environment to handle OLLAMA_API_BASE env --- litellm/tests/test_utils.py | 17 +++++++++++++++-- litellm/utils.py | 5 +++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/litellm/tests/test_utils.py b/litellm/tests/test_utils.py index 5da214dbc..2e5ac889f 100644 --- a/litellm/tests/test_utils.py +++ b/litellm/tests/test_utils.py @@ -1,4 +1,6 @@ -import sys, os +import sys +from unittest import mock + from dotenv import load_dotenv import copy @@ -214,8 +216,19 @@ def test_validate_environment_empty_model(): raise Exception() -# test_validate_environment_empty_model() +@mock.patch.dict(os.environ, {"OLLAMA_API_BASE": "foo"}, clear=True) +def test_validate_environment_ollama(): + for provider in ["ollama", "ollama_chat"]: + kv = validate_environment(provider+"/mistral") + assert kv["keys_in_environment"] + assert kv["missing_keys"] == [] +@mock.patch.dict(os.environ, {}, clear=True) +def test_validate_environment_ollama_failed(): + for provider in ["ollama", "ollama_chat"]: + kv = validate_environment(provider+"/mistral") + assert not kv["keys_in_environment"] + assert kv["missing_keys"] == ["OLLAMA_API_BASE"] def test_function_to_dict(): print("testing function to dict for get current weather") diff --git a/litellm/utils.py b/litellm/utils.py index 6d64368f8..3603495cd 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5602,6 +5602,11 @@ def validate_environment(model: Optional[str] = None) -> dict: else: missing_keys.append("AWS_ACCESS_KEY_ID") missing_keys.append("AWS_SECRET_ACCESS_KEY") + elif custom_llm_provider in ["ollama", "ollama_chat"]: + if "OLLAMA_API_BASE" in os.environ: + keys_in_environment = True + else: + missing_keys.append("OLLAMA_API_BASE") else: ## openai - chatcompletion + text completion if ( From 468995b288b613c5fe6976b256e8833172663fa4 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 09:34:01 -0800 Subject: [PATCH 021/304] docs(supported_embeddings.md): add vertex ai embeddings to docs --- .../docs/embedding/supported_embedding.md | 78 ++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/docs/my-website/docs/embedding/supported_embedding.md b/docs/my-website/docs/embedding/supported_embedding.md index 6c638d6de..62a10b44d 100644 --- a/docs/my-website/docs/embedding/supported_embedding.md +++ b/docs/my-website/docs/embedding/supported_embedding.md @@ -1,3 +1,6 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Embedding Models ## Quick Start @@ -7,8 +10,81 @@ import os os.environ['OPENAI_API_KEY'] = "" response = embedding(model='text-embedding-ada-002', input=["good morning from litellm"]) ``` +## Proxy Usage -### Input Params for `litellm.embedding()` +**NOTE** +For `vertex_ai`, +```bash +export GOOGLE_APPLICATION_CREDENTIALS="absolute/path/to/service_account.json" +``` + +### Add model to config + +```yaml +model_list: +- model_name: textembedding-gecko + litellm_params: + model: vertex_ai/textembedding-gecko + +general_settings: + master_key: sk-1234 +``` + +### Start proxy + +```bash +litellm --config /path/to/config.yaml + +# RUNNING on http://0.0.0.0:8000 +``` + +### Test + + + + +```bash +curl --location 'http://0.0.0.0:8000/embeddings' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{"input": ["Academia.edu uses"], "model": "textembedding-gecko", "encoding_format": "base64"}' +``` + + + + +```python +from openai import OpenAI +client = OpenAI( + api_key="sk-1234", + base_url="http://0.0.0.0:8000" +) + +client.embeddings.create( + model="textembedding-gecko", + input="The food was delicious and the waiter...", + encoding_format="float" +) +``` + + + +```python +from langchain_openai import OpenAIEmbeddings + +embeddings = OpenAIEmbeddings(model="textembedding-gecko", openai_api_base="http://0.0.0.0:8000", openai_api_key="sk-1234") + +text = "This is a test document." + +query_result = embeddings.embed_query(text) + +print(f"VERTEX AI EMBEDDINGS") +print(query_result[:5]) +``` + + + +## Input Params for `litellm.embedding()` ### Required Fields - `model`: *string* - ID of the model to use. `model='text-embedding-ada-002'` From 3aba9019ac27481361c3fa87956907f5c41dd4ca Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 10:06:33 -0800 Subject: [PATCH 022/304] (feat) track used api_base in response --- litellm/router.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/litellm/router.py b/litellm/router.py index 6f33d0b0d..59cbf43d5 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -357,6 +357,11 @@ class Router: verbose_router_logger.info( f"litellm.completion(model={model_name})\033[32m 200 OK\033[0m" ) + # set used api_base in response + if hasattr(response, "_hidden_params"): + response._hidden_params["api_base"] = deployment.get( + "litellm_params", {} + ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -446,6 +451,12 @@ class Router: verbose_router_logger.info( f"litellm.acompletion(model={model_name})\033[32m 200 OK\033[0m" ) + + # set used api_base in response + if hasattr(response, "_hidden_params"): + response._hidden_params["api_base"] = deployment.get( + "litellm_params", {} + ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -602,6 +613,12 @@ class Router: verbose_router_logger.info( f"litellm.aimage_generation(model={model_name})\033[32m 200 OK\033[0m" ) + + # set used api_base in response + if hasattr(response, "_hidden_params"): + response._hidden_params["api_base"] = deployment.get( + "litellm_params", {} + ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -694,6 +711,11 @@ class Router: verbose_router_logger.info( f"litellm.amoderation(model={model_name})\033[32m 200 OK\033[0m" ) + # set used api_base in response + if hasattr(response, "_hidden_params"): + response._hidden_params["api_base"] = deployment.get( + "litellm_params", {} + ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -825,6 +847,12 @@ class Router: verbose_router_logger.info( f"litellm.atext_completion(model={model_name})\033[32m 200 OK\033[0m" ) + + # set used api_base in response + if hasattr(response, "_hidden_params"): + response._hidden_params["api_base"] = deployment.get( + "litellm_params", {} + ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -954,6 +982,12 @@ class Router: verbose_router_logger.info( f"litellm.aembedding(model={model_name})\033[32m 200 OK\033[0m" ) + + # set used api_base in response + if hasattr(response, "_hidden_params"): + response._hidden_params["api_base"] = deployment.get( + "litellm_params", {} + ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( From a4e24761a037624b11d4d565c3ad588e428d7286 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Sat, 2 Mar 2024 13:25:04 -0500 Subject: [PATCH 023/304] map optional params --- litellm/utils.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index 6d64368f8..b0cca2cb3 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4551,6 +4551,21 @@ def get_optional_params( optional_params["temperature"] = temperature if max_tokens is not None: optional_params["max_tokens"] = max_tokens + elif "mistral" in model: + supported_params = ["max_tokens", "temperature", "stop", "top_p", "stream"] + _check_valid_arg(supported_params=supported_params) + # mistral params on bedrock + # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" + if max_tokens is not None: + optional_params["max_tokens"] = max_tokens + if temperature is not None: + optional_params["temperature"] = temperature + if top_p is not None: + optional_params["top_p"] = top_p + if stop is not None: + optional_params["stop"] = stop + if stream is not None: + optional_params["stream"] = stream elif custom_llm_provider == "aleph_alpha": supported_params = [ "max_tokens", @@ -9657,4 +9672,4 @@ def _get_base_model_from_metadata(model_call_details=None): base_model = model_info.get("base_model", None) if base_model is not None: return base_model - return None + return None \ No newline at end of file From 12d7ea914a9e988ee2d40c3e284e0c26865dc7d3 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Sat, 2 Mar 2024 13:34:39 -0500 Subject: [PATCH 024/304] update comments --- litellm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index b0cca2cb3..67bf7108f 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4555,7 +4555,7 @@ def get_optional_params( supported_params = ["max_tokens", "temperature", "stop", "top_p", "stream"] _check_valid_arg(supported_params=supported_params) # mistral params on bedrock - # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" + # \"max_tokens\":400,\"temperature\":0.7,\"top_p\":0.7,\"stop\":[\"\\\\n\\\\nHuman:\"]}" if max_tokens is not None: optional_params["max_tokens"] = max_tokens if temperature is not None: From 0bb45b33fd1050abeeb48ce3bcc173d604219b36 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 11:06:03 -0800 Subject: [PATCH 025/304] (feat) send api_base --- litellm/proxy/utils.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 1cc52401a..948e686dd 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -64,6 +64,7 @@ class ProxyLogging: litellm.callbacks.append(self.max_parallel_request_limiter) litellm.callbacks.append(self.max_budget_limiter) litellm.callbacks.append(self.cache_control_check) + litellm.callbacks.append(self.response_taking_too_long_callback) for callback in litellm.callbacks: if callback not in litellm.input_callback: litellm.input_callback.append(callback) @@ -142,6 +143,30 @@ class ProxyLogging: raise e return data + async def response_taking_too_long_callback( + self, + kwargs, # kwargs to completion + completion_response, # response from completion + start_time, + end_time, # start/end time + ): + if self.alerting is None: + return + time_difference = end_time - start_time + # Convert the timedelta to float (in seconds) + time_difference_float = time_difference.total_seconds() + litellm_params = kwargs.get("litellm_params", {}) + api_base = litellm_params.get("api_base", "") + model = kwargs.get("model", "") + messages = kwargs.get("messages", "") + request_info = f"\nRequest Model: `{model}`\nAPI Base: `{api_base}`\nMessages: `{messages}`" + slow_message = f"`Responses are slow - {round(time_difference_float,2)}s response time > Alerting threshold: {self.alerting_threshold}s`" + if time_difference_float > self.alerting_threshold: + await self.alerting_handler( + message=slow_message + request_info, + level="Low", + ) + async def response_taking_too_long( self, start_time: Optional[float] = None, @@ -189,16 +214,6 @@ class ProxyLogging: level="Medium", ) - elif ( - type == "slow_response" and start_time is not None and end_time is not None - ): - slow_message = f"`Responses are slow - {round(end_time-start_time,2)}s response time > Alerting threshold: {self.alerting_threshold}s`" - if end_time - start_time > self.alerting_threshold: - await self.alerting_handler( - message=slow_message + request_info, - level="Low", - ) - async def budget_alerts( self, type: Literal[ From 127bc743b2b298a3b79e80ec453b78aab5ca6e79 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 11:09:40 -0800 Subject: [PATCH 026/304] (feat) cleanup --- litellm/proxy/proxy_server.py | 42 ----------------------------------- 1 file changed, 42 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 869de6dde..17db8c3ab 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -2138,14 +2138,6 @@ async def async_data_generator(response, user_api_key_dict): except Exception as e: yield f"data: {str(e)}\n\n" - ### ALERTING ### - end_time = time.time() - asyncio.create_task( - proxy_logging_obj.response_taking_too_long( - start_time=start_time, end_time=end_time, type="slow_response" - ) - ) - # Streaming is done, yield the [DONE] chunk done_message = "[DONE]" yield f"data: {done_message}\n\n" @@ -2494,14 +2486,6 @@ async def completion( headers=custom_headers, ) - ### ALERTING ### - end_time = time.time() - asyncio.create_task( - proxy_logging_obj.response_taking_too_long( - start_time=start_time, end_time=end_time, type="slow_response" - ) - ) - fastapi_response.headers["x-litellm-model-id"] = model_id return response except Exception as e: @@ -2700,14 +2684,6 @@ async def chat_completion( headers=custom_headers, ) - ### ALERTING ### - end_time = time.time() - asyncio.create_task( - proxy_logging_obj.response_taking_too_long( - start_time=start_time, end_time=end_time, type="slow_response" - ) - ) - fastapi_response.headers["x-litellm-model-id"] = model_id ### CALL HOOKS ### - modify outgoing data @@ -2915,12 +2891,6 @@ async def embeddings( ### ALERTING ### data["litellm_status"] = "success" # used for alerting - end_time = time.time() - asyncio.create_task( - proxy_logging_obj.response_taking_too_long( - start_time=start_time, end_time=end_time, type="slow_response" - ) - ) return response except Exception as e: @@ -3066,12 +3036,6 @@ async def image_generation( ### ALERTING ### data["litellm_status"] = "success" # used for alerting - end_time = time.time() - asyncio.create_task( - proxy_logging_obj.response_taking_too_long( - start_time=start_time, end_time=end_time, type="slow_response" - ) - ) return response except Exception as e: @@ -3225,12 +3189,6 @@ async def moderations( ### ALERTING ### data["litellm_status"] = "success" # used for alerting - end_time = time.time() - asyncio.create_task( - proxy_logging_obj.response_taking_too_long( - start_time=start_time, end_time=end_time, type="slow_response" - ) - ) return response except Exception as e: From 868a415aa0160985ee27850f0faef04e06b1dfb1 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 11:12:09 -0800 Subject: [PATCH 027/304] Revert "(feat) track used api_base in response" This reverts commit 3aba9019ac27481361c3fa87956907f5c41dd4ca. --- litellm/router.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 59cbf43d5..6f33d0b0d 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -357,11 +357,6 @@ class Router: verbose_router_logger.info( f"litellm.completion(model={model_name})\033[32m 200 OK\033[0m" ) - # set used api_base in response - if hasattr(response, "_hidden_params"): - response._hidden_params["api_base"] = deployment.get( - "litellm_params", {} - ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -451,12 +446,6 @@ class Router: verbose_router_logger.info( f"litellm.acompletion(model={model_name})\033[32m 200 OK\033[0m" ) - - # set used api_base in response - if hasattr(response, "_hidden_params"): - response._hidden_params["api_base"] = deployment.get( - "litellm_params", {} - ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -613,12 +602,6 @@ class Router: verbose_router_logger.info( f"litellm.aimage_generation(model={model_name})\033[32m 200 OK\033[0m" ) - - # set used api_base in response - if hasattr(response, "_hidden_params"): - response._hidden_params["api_base"] = deployment.get( - "litellm_params", {} - ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -711,11 +694,6 @@ class Router: verbose_router_logger.info( f"litellm.amoderation(model={model_name})\033[32m 200 OK\033[0m" ) - # set used api_base in response - if hasattr(response, "_hidden_params"): - response._hidden_params["api_base"] = deployment.get( - "litellm_params", {} - ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -847,12 +825,6 @@ class Router: verbose_router_logger.info( f"litellm.atext_completion(model={model_name})\033[32m 200 OK\033[0m" ) - - # set used api_base in response - if hasattr(response, "_hidden_params"): - response._hidden_params["api_base"] = deployment.get( - "litellm_params", {} - ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( @@ -982,12 +954,6 @@ class Router: verbose_router_logger.info( f"litellm.aembedding(model={model_name})\033[32m 200 OK\033[0m" ) - - # set used api_base in response - if hasattr(response, "_hidden_params"): - response._hidden_params["api_base"] = deployment.get( - "litellm_params", {} - ).get("api_base", None) return response except Exception as e: verbose_router_logger.info( From 2602102ce620f1bef6b5534677c4d0cca1d51a3d Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 11:55:16 -0800 Subject: [PATCH 028/304] feat(proxy_server.py): enable `/organizations/new` endpoint allows admins to create organizations which can own teams --- litellm/proxy/_types.py | 38 +++++++++++++++ litellm/proxy/proxy_server.py | 90 ++++++++++++++++++++++++++++++++--- litellm/proxy/schema.prisma | 48 ++++++++++++++++--- schema.prisma | 43 +++++++++++++++-- 4 files changed, 202 insertions(+), 17 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index ce4de2d14..6a73162ec 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -324,6 +324,44 @@ class TeamRequest(LiteLLMBase): teams: List[str] +class NewOrganizationRequest(LiteLLMBase): + organization_alias: Optional[str] = None + models: List = [] + budget_id: Optional[str] = None + tpm_limit: Optional[int] = None + rpm_limit: Optional[int] = None + max_budget: Optional[float] = None + + +class LiteLLM_BudgetTable(LiteLLMBase): + """Represents user-controllable params for a LiteLLM_BudgetTable record""" + + max_budget: Optional[float] = None + max_parallel_requests: Optional[int] = None + tpm_limit: Optional[int] = None + rpm_limit: Optional[int] = None + model_max_budget: dict + budget_duration: Optional[str] = None + budget_reset_at: Optional[datetime] = None + created_by: str + updated_by: str + + +class LiteLLM_OrganizationTable(LiteLLMBase): + + organization_id: str + organization_alias: Optional[str] = None + budget_id: str + metadata: dict + models: List[str] + spend: float + model_spend: dict + created_at: datetime + created_by: str + updated_at: datetime + updated_by: str + + class KeyManagementSystem(enum.Enum): GOOGLE_KMS = "google_kms" AZURE_KEY_VAULT = "azure_key_vault" diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 869de6dde..384d10961 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -239,6 +239,7 @@ health_check_interval = None health_check_results = {} queue: List = [] litellm_proxy_budget_name = "litellm-proxy-budget" +litellm_proxy_admin_name = "default_user_id" ui_access_mode: Literal["admin", "all"] = "all" proxy_budget_rescheduler_min_time = 597 proxy_budget_rescheduler_max_time = 605 @@ -335,7 +336,11 @@ async def user_api_key_auth( # note: never string compare api keys, this is vulenerable to a time attack. Use secrets.compare_digest instead is_master_key_valid = secrets.compare_digest(api_key, master_key) if is_master_key_valid: - return UserAPIKeyAuth(api_key=master_key, user_role="proxy_admin") + return UserAPIKeyAuth( + api_key=master_key, + user_role="proxy_admin", + user_id=litellm_proxy_admin_name, + ) if isinstance( api_key, str ): # if generated token, make sure it starts with sk-. @@ -360,7 +365,6 @@ async def user_api_key_auth( valid_token = await prisma_client.get_data( token=api_key, table_name="combined_view" ) - elif custom_db_client is not None: try: valid_token = await custom_db_client.get_data( @@ -2213,7 +2217,7 @@ def parse_cache_control(cache_control): @router.on_event("startup") async def startup_event(): - global prisma_client, master_key, use_background_health_checks, llm_router, llm_model_list, general_settings, proxy_budget_rescheduler_min_time, proxy_budget_rescheduler_max_time + global prisma_client, master_key, use_background_health_checks, llm_router, llm_model_list, general_settings, proxy_budget_rescheduler_min_time, proxy_budget_rescheduler_max_time, litellm_proxy_admin_name import json ### LOAD MASTER KEY ### @@ -2260,9 +2264,8 @@ async def startup_event(): if prisma_client is not None and master_key is not None: # add master key to db - user_id = "default_user_id" if os.getenv("PROXY_ADMIN_ID", None) is not None: - user_id = os.getenv("PROXY_ADMIN_ID") + litellm_proxy_admin_name = os.getenv("PROXY_ADMIN_ID") asyncio.create_task( generate_key_helper_fn( @@ -2272,7 +2275,7 @@ async def startup_event(): config={}, spend=0, token=master_key, - user_id=user_id, + user_id=litellm_proxy_admin_name, user_role="proxy_admin", query_type="update_data", update_key_values={ @@ -5412,6 +5415,81 @@ async def team_info( ) +#### ORGANIZATION MANAGEMENT #### + + +@router.post( + "/organization/new", + tags=["organization management"], + dependencies=[Depends(user_api_key_auth)], + response_model=LiteLLM_OrganizationTable, +) +async def new_organization( + data: NewOrganizationRequest, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + global prisma_client + + if prisma_client is None: + raise HTTPException(status_code=500, detail={"error": "No db connected"}) + + if data.budget_id is None: + """ + Every organization needs a budget attached. + + If none provided, create one based on user max + """ + budget_row = LiteLLM_BudgetTable( + max_budget=user_api_key_dict.max_budget, + max_parallel_requests=user_api_key_dict.max_parallel_requests, + model_max_budget=user_api_key_dict.model_max_budget, + tpm_limit=user_api_key_dict.tpm_limit, + rpm_limit=user_api_key_dict.rpm_limit, + budget_duration=user_api_key_dict.budget_duration, + budget_reset_at=user_api_key_dict.budget_reset_at, + created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + ) + + new_budget = prisma_client.jsonify_object( + budget_row.model_dump(exclude_none=True) + ) + + _budget = await prisma_client.db.litellm_budgettable.create(data={**new_budget}) # type: ignore + + data.budget_id = _budget.budget_id + + response = await prisma_client.db.litellm_organizationtable.create( + data={ + **data.model_dump(exclude_none=True), # type: ignore + "created_by": user_api_key_dict.user_id, + "updated_by": user_api_key_dict.user_id, + } + ) + + return response + + +@router.post( + "/organization/update", + tags=["organization management"], + dependencies=[Depends(user_api_key_auth)], + response_model=LiteLLM_TeamTable, +) +async def update_organization(): + pass + + +@router.post( + "/organization/delete", + tags=["organization management"], + dependencies=[Depends(user_api_key_auth)], + response_model=LiteLLM_TeamTable, +) +async def delete_organization(): + pass + + #### MODEL MANAGEMENT #### diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 6a9b72728..4e0da8222 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -7,10 +7,44 @@ generator client { provider = "prisma-client-py" } +// Budget / Rate Limits for an org +model LiteLLM_BudgetTable { + budget_id String @id @default(uuid()) + max_budget Float? + max_parallel_requests Int? + tpm_limit BigInt? + rpm_limit BigInt? + model_max_budget Json @default("{}") + budget_duration String? + budget_reset_at DateTime? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + organization LiteLLM_OrganizationTable[] +} + +model LiteLLM_OrganizationTable { + organization_id String @id @default(uuid()) + organization_alias String? + budget_id String + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + teams LiteLLM_TeamTable[] +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { - team_id String @unique + team_id String @id @default(uuid()) team_alias String? + organization_id String? admins String[] members String[] members_with_roles Json @default("{}") @@ -27,11 +61,12 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users model LiteLLM_UserTable { - user_id String @unique + user_id String @id team_id String? teams String[] @default([]) user_role String? @@ -51,7 +86,7 @@ model LiteLLM_UserTable { // Generate Tokens for Proxy model LiteLLM_VerificationToken { - token String @unique + token String @id key_name String? key_alias String? spend Float @default(0.0) @@ -82,7 +117,7 @@ model LiteLLM_Config { // View spend, model, api_key per request model LiteLLM_SpendLogs { - request_id String @unique + request_id String @id call_type String api_key String @default ("") spend Float @default(0.0) @@ -98,11 +133,12 @@ model LiteLLM_SpendLogs { cache_key String @default("") request_tags Json @default("[]") team_id String? - end_user String? + end_user String? } + // Beta - allow team members to request access to a model model LiteLLM_UserNotifications { - request_id String @unique + request_id String @id user_id String models String[] justification String diff --git a/schema.prisma b/schema.prisma index d08295e10..f31fa130a 100644 --- a/schema.prisma +++ b/schema.prisma @@ -7,10 +7,42 @@ generator client { provider = "prisma-client-py" } +// Budget / Rate Limits for an org +model LiteLLM_BudgetTable { + budget_id String @id @default(uuid()) + max_budget Float? + max_parallel_requests Int? + tpm_limit BigInt? + rpm_limit BigInt? + model_max_budget Json @default("{}") + budget_duration String? + budget_reset_at DateTime? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String +} + +model LiteLLM_OrganizationTable { + organization_id String @id @default(uuid()) + organization_alias String? + budget_id String + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + litellm_budget_table LiteLLM_BudgetTable @relation(fields: [budget_id], references: [budget_id]) +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { - team_id String @unique + team_id String @id @default(uuid()) team_alias String? + organization_id String? admins String[] members String[] members_with_roles Json @default("{}") @@ -27,11 +59,12 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + litellm_organization_table LiteLLM_OrganizationTable @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users model LiteLLM_UserTable { - user_id String @unique + user_id String @id team_id String? teams String[] @default([]) user_role String? @@ -51,7 +84,7 @@ model LiteLLM_UserTable { // Generate Tokens for Proxy model LiteLLM_VerificationToken { - token String @unique + token String @id key_name String? key_alias String? spend Float @default(0.0) @@ -82,7 +115,7 @@ model LiteLLM_Config { // View spend, model, api_key per request model LiteLLM_SpendLogs { - request_id String @unique + request_id String @id call_type String api_key String @default ("") spend Float @default(0.0) @@ -103,7 +136,7 @@ model LiteLLM_SpendLogs { // Beta - allow team members to request access to a model model LiteLLM_UserNotifications { - request_id String @unique + request_id String @id user_id String models String[] justification String From 5feea0483188af59a09e63bada96dc7a48fada7c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 11:59:17 -0800 Subject: [PATCH 029/304] build: update schema.prisma --- litellm/proxy/schema.prisma | 46 ++++++++++++++++++++++++++++++++----- schema.prisma | 43 ++++++++++++++++++++++++++++++---- 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 6a9b72728..f31fa130a 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -7,10 +7,42 @@ generator client { provider = "prisma-client-py" } +// Budget / Rate Limits for an org +model LiteLLM_BudgetTable { + budget_id String @id @default(uuid()) + max_budget Float? + max_parallel_requests Int? + tpm_limit BigInt? + rpm_limit BigInt? + model_max_budget Json @default("{}") + budget_duration String? + budget_reset_at DateTime? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String +} + +model LiteLLM_OrganizationTable { + organization_id String @id @default(uuid()) + organization_alias String? + budget_id String + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + litellm_budget_table LiteLLM_BudgetTable @relation(fields: [budget_id], references: [budget_id]) +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { - team_id String @unique + team_id String @id @default(uuid()) team_alias String? + organization_id String? admins String[] members String[] members_with_roles Json @default("{}") @@ -27,11 +59,12 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + litellm_organization_table LiteLLM_OrganizationTable @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users model LiteLLM_UserTable { - user_id String @unique + user_id String @id team_id String? teams String[] @default([]) user_role String? @@ -51,7 +84,7 @@ model LiteLLM_UserTable { // Generate Tokens for Proxy model LiteLLM_VerificationToken { - token String @unique + token String @id key_name String? key_alias String? spend Float @default(0.0) @@ -82,7 +115,7 @@ model LiteLLM_Config { // View spend, model, api_key per request model LiteLLM_SpendLogs { - request_id String @unique + request_id String @id call_type String api_key String @default ("") spend Float @default(0.0) @@ -98,11 +131,12 @@ model LiteLLM_SpendLogs { cache_key String @default("") request_tags Json @default("[]") team_id String? - end_user String? + end_user String? } + // Beta - allow team members to request access to a model model LiteLLM_UserNotifications { - request_id String @unique + request_id String @id user_id String models String[] justification String diff --git a/schema.prisma b/schema.prisma index d08295e10..f31fa130a 100644 --- a/schema.prisma +++ b/schema.prisma @@ -7,10 +7,42 @@ generator client { provider = "prisma-client-py" } +// Budget / Rate Limits for an org +model LiteLLM_BudgetTable { + budget_id String @id @default(uuid()) + max_budget Float? + max_parallel_requests Int? + tpm_limit BigInt? + rpm_limit BigInt? + model_max_budget Json @default("{}") + budget_duration String? + budget_reset_at DateTime? + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String +} + +model LiteLLM_OrganizationTable { + organization_id String @id @default(uuid()) + organization_alias String? + budget_id String + metadata Json @default("{}") + models String[] + spend Float @default(0.0) + model_spend Json @default("{}") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + litellm_budget_table LiteLLM_BudgetTable @relation(fields: [budget_id], references: [budget_id]) +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { - team_id String @unique + team_id String @id @default(uuid()) team_alias String? + organization_id String? admins String[] members String[] members_with_roles Json @default("{}") @@ -27,11 +59,12 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + litellm_organization_table LiteLLM_OrganizationTable @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users model LiteLLM_UserTable { - user_id String @unique + user_id String @id team_id String? teams String[] @default([]) user_role String? @@ -51,7 +84,7 @@ model LiteLLM_UserTable { // Generate Tokens for Proxy model LiteLLM_VerificationToken { - token String @unique + token String @id key_name String? key_alias String? spend Float @default(0.0) @@ -82,7 +115,7 @@ model LiteLLM_Config { // View spend, model, api_key per request model LiteLLM_SpendLogs { - request_id String @unique + request_id String @id call_type String api_key String @default ("") spend Float @default(0.0) @@ -103,7 +136,7 @@ model LiteLLM_SpendLogs { // Beta - allow team members to request access to a model model LiteLLM_UserNotifications { - request_id String @unique + request_id String @id user_id String models String[] justification String From eedd446a6ac0ca5f24f78e0283eff03f31f532b2 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 12:01:05 -0800 Subject: [PATCH 030/304] fix(proxy_server.py): fix pydantic versioning issue --- litellm/proxy/proxy_server.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 384d10961..e5af9186c 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -5451,9 +5451,7 @@ async def new_organization( updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, ) - new_budget = prisma_client.jsonify_object( - budget_row.model_dump(exclude_none=True) - ) + new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) _budget = await prisma_client.db.litellm_budgettable.create(data={**new_budget}) # type: ignore @@ -5461,7 +5459,7 @@ async def new_organization( response = await prisma_client.db.litellm_organizationtable.create( data={ - **data.model_dump(exclude_none=True), # type: ignore + **data.json(exclude_none=True), # type: ignore "created_by": user_api_key_dict.user_id, "updated_by": user_api_key_dict.user_id, } From 0418ba5fc3a487313856d1af4fe6b6c14e69fb45 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 12:02:06 -0800 Subject: [PATCH 031/304] (feat) log api_base in spend logs --- litellm/proxy/_types.py | 1 + litellm/proxy/schema.prisma | 1 + litellm/proxy/utils.py | 1 + schema.prisma | 1 + 4 files changed, 4 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index ce4de2d14..175f801da 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -542,6 +542,7 @@ class LiteLLM_SpendLogs(LiteLLMBase): request_id: str api_key: str model: Optional[str] = "" + api_base: Optional[str] = "" call_type: str spend: Optional[float] = 0.0 total_tokens: Optional[int] = 0 diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 6a9b72728..9c5c00d13 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -92,6 +92,7 @@ model LiteLLM_SpendLogs { startTime DateTime // Assuming start_time is a DateTime field endTime DateTime // Assuming end_time is a DateTime field model String @default("") + api_base String @default("") user String @default("") metadata Json @default("{}") cache_hit String @default("") diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 948e686dd..c67448c86 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1600,6 +1600,7 @@ def get_logging_payload(kwargs, response_obj, start_time, end_time): "completion_tokens": usage.get("completion_tokens", 0), "request_tags": metadata.get("tags", []), "end_user": kwargs.get("user", ""), + "api_base": litellm_params.get("api_base", ""), } verbose_proxy_logger.debug(f"SpendTable: created payload - payload: {payload}\n\n") diff --git a/schema.prisma b/schema.prisma index d08295e10..06964e4a6 100644 --- a/schema.prisma +++ b/schema.prisma @@ -92,6 +92,7 @@ model LiteLLM_SpendLogs { startTime DateTime // Assuming start_time is a DateTime field endTime DateTime // Assuming end_time is a DateTime field model String @default("") + api_base String @default("") user String @default("") metadata Json @default("{}") cache_hit String @default("") From e60ae9388ea9ec9ea0ca481b16aa4aa886ef72c8 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 12:08:34 -0800 Subject: [PATCH 032/304] =?UTF-8?q?bump:=20version=201.28.8=20=E2=86=92=20?= =?UTF-8?q?1.28.9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0dbe465c3..65e8645fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.8" +version = "1.28.9" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.8" +version = "1.28.9" version_files = [ "pyproject.toml:^version" ] From 6fb19c5d420b9f8ac475df075ce8cadd5fc2a6bc Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 12:13:54 -0800 Subject: [PATCH 033/304] test(test_organizations.py): add testing for `/organization/new` endpoint --- litellm/proxy/schema.prisma | 4 ++-- schema.prisma | 8 ++++--- tests/test_organizations.py | 46 +++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 tests/test_organizations.py diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 4e0da8222..2607cf2b0 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -21,12 +21,12 @@ model LiteLLM_BudgetTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String - organization LiteLLM_OrganizationTable[] + organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget } model LiteLLM_OrganizationTable { organization_id String @id @default(uuid()) - organization_alias String? + organization_alias String budget_id String metadata Json @default("{}") models String[] diff --git a/schema.prisma b/schema.prisma index f31fa130a..2607cf2b0 100644 --- a/schema.prisma +++ b/schema.prisma @@ -21,11 +21,12 @@ model LiteLLM_BudgetTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String + organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget } model LiteLLM_OrganizationTable { organization_id String @id @default(uuid()) - organization_alias String? + organization_alias String budget_id String metadata Json @default("{}") models String[] @@ -35,7 +36,8 @@ model LiteLLM_OrganizationTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String - litellm_budget_table LiteLLM_BudgetTable @relation(fields: [budget_id], references: [budget_id]) + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + teams LiteLLM_TeamTable[] } // Assign prod keys to groups, not individuals @@ -59,7 +61,7 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") - litellm_organization_table LiteLLM_OrganizationTable @relation(fields: [organization_id], references: [organization_id]) + litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users diff --git a/tests/test_organizations.py b/tests/test_organizations.py new file mode 100644 index 000000000..00e99cb66 --- /dev/null +++ b/tests/test_organizations.py @@ -0,0 +1,46 @@ +# What this tests ? +## Tests /organization endpoints. +import pytest +import asyncio +import aiohttp +import time, uuid +from openai import AsyncOpenAI + + +async def new_organization(session, i, organization_alias, max_budget=None): + url = "http://0.0.0.0:4000/organization/new" + headers = {"Authorization": "Bearer sk-1234", "Content-Type": "application/json"} + data = { + "organization_alias": organization_alias, + "models": ["azure-models"], + "max_budget": max_budget, + } + + async with session.post(url, headers=headers, json=data) as response: + status = response.status + response_text = await response.text() + + print(f"Response {i} (Status code: {status}):") + print(response_text) + print() + + if status != 200: + raise Exception(f"Request {i} did not return a 200 status code: {status}") + + return await response.json() + + +@pytest.mark.asyncio +async def test_organization_new(): + """ + Make 20 parallel calls to /user/new. Assert all worked. + """ + organization_alias = f"Organization: {uuid.uuid4()}" + async with aiohttp.ClientSession() as session: + tasks = [ + new_organization( + session=session, i=0, organization_alias=organization_alias + ) + for i in range(1, 20) + ] + await asyncio.gather(*tasks) From 8a249b5fe91255458f22c325f9217a582280976c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 12:18:28 -0800 Subject: [PATCH 034/304] build(schema.prisma): update schema with new orgs and budget table --- litellm/proxy/schema.prisma | 8 +++++--- schema.prisma | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 2744ae5c0..7eb59ee48 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -21,11 +21,12 @@ model LiteLLM_BudgetTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String + organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget } model LiteLLM_OrganizationTable { organization_id String @id @default(uuid()) - organization_alias String? + organization_alias String budget_id String metadata Json @default("{}") models String[] @@ -35,7 +36,8 @@ model LiteLLM_OrganizationTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String - litellm_budget_table LiteLLM_BudgetTable @relation(fields: [budget_id], references: [budget_id]) + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + teams LiteLLM_TeamTable[] } // Assign prod keys to groups, not individuals @@ -59,7 +61,7 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") - litellm_organization_table LiteLLM_OrganizationTable @relation(fields: [organization_id], references: [organization_id]) + litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users diff --git a/schema.prisma b/schema.prisma index 2744ae5c0..7eb59ee48 100644 --- a/schema.prisma +++ b/schema.prisma @@ -21,11 +21,12 @@ model LiteLLM_BudgetTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String + organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget } model LiteLLM_OrganizationTable { organization_id String @id @default(uuid()) - organization_alias String? + organization_alias String budget_id String metadata Json @default("{}") models String[] @@ -35,7 +36,8 @@ model LiteLLM_OrganizationTable { created_by String updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String - litellm_budget_table LiteLLM_BudgetTable @relation(fields: [budget_id], references: [budget_id]) + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) + teams LiteLLM_TeamTable[] } // Assign prod keys to groups, not individuals @@ -59,7 +61,7 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") - litellm_organization_table LiteLLM_OrganizationTable @relation(fields: [organization_id], references: [organization_id]) + litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) } // Track spend, rate limit, budget Users From b042b5dc3b94564e4291a31c2954c0014975c04f Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 12:25:40 -0800 Subject: [PATCH 035/304] (feat) set soft_budgets on keys --- litellm/proxy/schema.prisma | 2 ++ schema.prisma | 2 ++ 2 files changed, 4 insertions(+) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 7eb59ee48..1fe55f24e 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -11,6 +11,7 @@ generator client { model LiteLLM_BudgetTable { budget_id String @id @default(uuid()) max_budget Float? + soft_budget Float? max_parallel_requests Int? tpm_limit BigInt? rpm_limit BigInt? @@ -107,6 +108,7 @@ model LiteLLM_VerificationToken { allowed_cache_controls String[] @default([]) model_spend Json @default("{}") model_max_budget Json @default("{}") + budget_id String? } // store proxy config.yaml diff --git a/schema.prisma b/schema.prisma index 7eb59ee48..1fe55f24e 100644 --- a/schema.prisma +++ b/schema.prisma @@ -11,6 +11,7 @@ generator client { model LiteLLM_BudgetTable { budget_id String @id @default(uuid()) max_budget Float? + soft_budget Float? max_parallel_requests Int? tpm_limit BigInt? rpm_limit BigInt? @@ -107,6 +108,7 @@ model LiteLLM_VerificationToken { allowed_cache_controls String[] @default([]) model_spend Json @default("{}") model_max_budget Json @default("{}") + budget_id String? } // store proxy config.yaml From eb4f90115d42207290ed4b3beba8447ea1168a69 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 12:52:09 -0800 Subject: [PATCH 036/304] (feat) create soft budget --- litellm/proxy/_types.py | 15 +++++++++++++++ litellm/proxy/proxy_server.py | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 175f801da..e4b28001d 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -324,6 +324,21 @@ class TeamRequest(LiteLLMBase): teams: List[str] +class LiteLLM_BudgetTable(LiteLLMBase): + """Represents user-controllable params for a LiteLLM_BudgetTable record""" + + max_budget: Optional[float] = None + soft_budget: Optional[float] = None + max_parallel_requests: Optional[int] = None + tpm_limit: Optional[int] = None + rpm_limit: Optional[int] = None + model_max_budget: dict + budget_duration: Optional[str] = None + budget_reset_at: Optional[datetime] = None + created_by: str + updated_by: str + + class KeyManagementSystem(enum.Enum): GOOGLE_KMS = "google_kms" AZURE_KEY_VAULT = "azure_key_vault" diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 17db8c3ab..37b28baea 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1869,6 +1869,19 @@ async def generate_key_helper_fn( rpm_limit = rpm_limit allowed_cache_controls = allowed_cache_controls + # TODO: @ishaan-jaff: Migrate all budget tracking to use LiteLLM_BudgetTable + if prisma_client is not None: + # create the Budget Row for the LiteLLM Verification Token + budget_row = LiteLLM_BudgetTable( + soft_budget=50, + model_max_budget=model_max_budget or {}, + created_by=user_id, + updated_by=user_id, + ) + new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) + _budget = await prisma_client.db.litellm_budgettable.create(data={**new_budget}) # type: ignore + _budget_id = getattr(_budget, "id", None) + try: # Create a new verification token (you may want to enhance this logic based on your needs) user_data = { @@ -1906,6 +1919,7 @@ async def generate_key_helper_fn( "allowed_cache_controls": allowed_cache_controls, "permissions": permissions_json, "model_max_budget": model_max_budget_json, + "budget_id": _budget_id, } if ( general_settings.get("allow_user_auth", False) == True From fd9f8b7010fbd249d8b8587b66478011e2d29146 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 13:05:00 -0800 Subject: [PATCH 037/304] (docs) setting soft budgets --- docs/my-website/docs/proxy/virtual_keys.md | 2 ++ litellm/__init__.py | 3 +++ litellm/proxy/proxy_server.py | 7 ++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/my-website/docs/proxy/virtual_keys.md b/docs/my-website/docs/proxy/virtual_keys.md index e350ce9d5..70fd6e6a8 100644 --- a/docs/my-website/docs/proxy/virtual_keys.md +++ b/docs/my-website/docs/proxy/virtual_keys.md @@ -79,6 +79,7 @@ curl 'http://0.0.0.0:8000/key/generate' \ "metadata": {"user": "ishaan@berri.ai"}, "team_id": "core-infra", "max_budget": 10, + "soft_budget": 5, }' ``` @@ -93,6 +94,7 @@ Request Params: - `config`: *Optional[dict]* - any key-specific configs, overrides config in config.yaml - `spend`: *Optional[int]* - Amount spent by key. Default is 0. Will be updated by proxy whenever key is used. https://docs.litellm.ai/docs/proxy/virtual_keys#managing-auth---tracking-spend - `max_budget`: *Optional[float]* - Specify max budget for a given key. +- `soft_budget`: *Optional[float]* - Specify soft limit budget for a given key. Get Alerts when key hits its soft budget - `model_max_budget`: *Optional[dict[str, float]]* - Specify max budget for each model, `model_max_budget={"gpt4": 0.5, "gpt-5": 0.01}` - `max_parallel_requests`: *Optional[int]* - Rate limit a user based on the number of parallel requests. Raises 429 error, if user's parallel requests > x. - `metadata`: *Optional[dict]* - Metadata for key, store information for key. Example metadata = {"team": "core-infra", "app": "app2", "email": "ishaan@berri.ai" } diff --git a/litellm/__init__.py b/litellm/__init__.py index cd639ddb9..f218fe036 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -79,6 +79,9 @@ max_budget: float = 0.0 # set the max budget across all providers budget_duration: Optional[str] = ( None # proxy only - resets budget after fixed duration. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"). ) +default_soft_budget: float = ( + 50.0 # by default all litellm proxy keys have a soft budget of 50.0 +) _openai_finish_reasons = ["stop", "length", "function_call", "content_filter", "null"] _openai_completion_params = [ "functions", diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 37b28baea..dcd4283ba 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1810,6 +1810,9 @@ async def generate_key_helper_fn( spend: float, key_max_budget: Optional[float] = None, # key_max_budget is used to Budget Per key key_budget_duration: Optional[str] = None, + key_soft_budget: Optional[ + float + ] = None, # key_soft_budget is used to Budget Per key max_budget: Optional[float] = None, # max_budget is used to Budget Per user budget_duration: Optional[str] = None, # max_budget is used to Budget Per user token: Optional[str] = None, @@ -1873,7 +1876,7 @@ async def generate_key_helper_fn( if prisma_client is not None: # create the Budget Row for the LiteLLM Verification Token budget_row = LiteLLM_BudgetTable( - soft_budget=50, + soft_budget=key_soft_budget or litellm.default_soft_budget, model_max_budget=model_max_budget or {}, created_by=user_id, updated_by=user_id, @@ -3347,6 +3350,8 @@ async def generate_key_fn( # if we get max_budget passed to /key/generate, then use it as key_max_budget. Since generate_key_helper_fn is used to make new users if "max_budget" in data_json: data_json["key_max_budget"] = data_json.pop("max_budget", None) + if "soft_budget" in data_json: + data_json["key_soft_budget"] = data_json.pop("soft_budget", None) if "budget_duration" in data_json: data_json["key_budget_duration"] = data_json.pop("budget_duration", None) From 8d22ed762efe1219d84ee57e50d6389b2d117942 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 14:38:42 -0800 Subject: [PATCH 038/304] fix(proxy_server.py): enable admin to create new budget if none set for org --- litellm/proxy/_types.py | 34 ++++----- litellm/proxy/proxy_server.py | 137 +++++++++++++++++++++++++++++----- schema.prisma | 2 +- 3 files changed, 134 insertions(+), 39 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 6a73162ec..a962b6aa6 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -324,15 +324,6 @@ class TeamRequest(LiteLLMBase): teams: List[str] -class NewOrganizationRequest(LiteLLMBase): - organization_alias: Optional[str] = None - models: List = [] - budget_id: Optional[str] = None - tpm_limit: Optional[int] = None - rpm_limit: Optional[int] = None - max_budget: Optional[float] = None - - class LiteLLM_BudgetTable(LiteLLMBase): """Represents user-controllable params for a LiteLLM_BudgetTable record""" @@ -340,28 +331,33 @@ class LiteLLM_BudgetTable(LiteLLMBase): max_parallel_requests: Optional[int] = None tpm_limit: Optional[int] = None rpm_limit: Optional[int] = None - model_max_budget: dict + model_max_budget: Optional[dict] = None budget_duration: Optional[str] = None - budget_reset_at: Optional[datetime] = None - created_by: str - updated_by: str + + +class NewOrganizationRequest(LiteLLM_BudgetTable): + organization_alias: str + models: List = [] + budget_id: Optional[str] = None class LiteLLM_OrganizationTable(LiteLLMBase): + """Represents user-controllable params for a LiteLLM_OrganizationTable record""" - organization_id: str organization_alias: Optional[str] = None budget_id: str - metadata: dict + metadata: Optional[dict] = None models: List[str] - spend: float - model_spend: dict - created_at: datetime created_by: str - updated_at: datetime updated_by: str +class NewOrganizationResponse(LiteLLM_OrganizationTable): + organization_id: str + created_at: datetime + updated_at: datetime + + class KeyManagementSystem(enum.Enum): GOOGLE_KMS = "google_kms" AZURE_KEY_VAULT = "azure_key_vault" diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index e5af9186c..f4909a408 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -5422,46 +5422,133 @@ async def team_info( "/organization/new", tags=["organization management"], dependencies=[Depends(user_api_key_auth)], - response_model=LiteLLM_OrganizationTable, + response_model=NewOrganizationResponse, ) async def new_organization( data: NewOrganizationRequest, user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), ): + """ + Allow orgs to own teams + + Set org level budgets + model access. + + Only admins can create orgs. + + # Parameters + + - `organization_alias`: *str* = The name of the organization. + - `models`: *List* = The models the organization has access to. + - `budget_id`: *Optional[str]* = The id for a budget (tpm/rpm/max budget) for the organization. + ### IF NO BUDGET - CREATE ONE WITH THESE PARAMS ### + - `max_budget`: *Optional[float]* = Max budget for org + - `tpm_limit`: *Optional[int]* = Max tpm limit for org + - `rpm_limit`: *Optional[int]* = Max rpm limit for org + - `model_max_budget`: *Optional[dict]* = Max budget for a specific model + - `budget_duration`: *Optional[str]* = Frequency of reseting org budget + + Case 1: Create new org **without** a budget_id + + ```bash + curl --location 'http://0.0.0.0:4000/organization/new' \ + + --header 'Authorization: Bearer sk-1234' \ + + --header 'Content-Type: application/json' \ + + --data '{ + "organization_alias": "my-secret-org", + "models": ["model1", "model2"], + "max_budget": 100 + }' + + + ``` + + Case 2: Create new org **with** a budget_id + + ```bash + curl --location 'http://0.0.0.0:4000/organization/new' \ + + --header 'Authorization: Bearer sk-1234' \ + + --header 'Content-Type: application/json' \ + + --data '{ + "organization_alias": "my-secret-org", + "models": ["model1", "model2"], + "budget_id": "428eeaa8-f3ac-4e85-a8fb-7dc8d7aa8689" + }' + ``` + """ global prisma_client if prisma_client is None: raise HTTPException(status_code=500, detail={"error": "No db connected"}) + if ( + user_api_key_dict.user_role is None + or user_api_key_dict.user_role != "proxy_admin" + ): + raise HTTPException( + status_code=401, + detail={ + "error": f"Only admins can create orgs. Your role is = {user_api_key_dict.user_role}" + }, + ) + if data.budget_id is None: """ Every organization needs a budget attached. - If none provided, create one based on user max + If none provided, create one based on provided values """ - budget_row = LiteLLM_BudgetTable( - max_budget=user_api_key_dict.max_budget, - max_parallel_requests=user_api_key_dict.max_parallel_requests, - model_max_budget=user_api_key_dict.model_max_budget, - tpm_limit=user_api_key_dict.tpm_limit, - rpm_limit=user_api_key_dict.rpm_limit, - budget_duration=user_api_key_dict.budget_duration, - budget_reset_at=user_api_key_dict.budget_reset_at, - created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, - updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, - ) + budget_row = LiteLLM_BudgetTable(**data.json(exclude_none=True)) new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) - _budget = await prisma_client.db.litellm_budgettable.create(data={**new_budget}) # type: ignore + _budget = await prisma_client.db.litellm_budgettable.create( + data={ + **new_budget, # type: ignore + "created_by": user_api_key_dict.user_id or litellm_proxy_admin_name, + "updated_by": user_api_key_dict.user_id or litellm_proxy_admin_name, + } + ) # type: ignore data.budget_id = _budget.budget_id + """ + Ensure only models that user has access to, are given to org + """ + if len(user_api_key_dict.models) == 0: # user has access to all models + pass + else: + if len(data.models) == 0: + raise HTTPException( + status_code=400, + detail={ + "error": f"User not allowed to give access to all models. Select models you want org to have access to." + }, + ) + for m in data.models: + if m not in user_api_key_dict.models: + raise HTTPException( + status_code=400, + detail={ + "error": f"User not allowed to give access to model={m}. Models you have access to = {user_api_key_dict.models}" + }, + ) + organization_row = LiteLLM_OrganizationTable( + **data.json(exclude_none=True), + created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + ) + new_organization_row = prisma_client.jsonify_object( + organization_row.json(exclude_none=True) + ) response = await prisma_client.db.litellm_organizationtable.create( data={ - **data.json(exclude_none=True), # type: ignore - "created_by": user_api_key_dict.user_id, - "updated_by": user_api_key_dict.user_id, + **new_organization_row, # type: ignore } ) @@ -5472,9 +5559,9 @@ async def new_organization( "/organization/update", tags=["organization management"], dependencies=[Depends(user_api_key_auth)], - response_model=LiteLLM_TeamTable, ) async def update_organization(): + """[TODO] Not Implemented yet. Let us know if you need this - https://github.com/BerriAI/litellm/issues""" pass @@ -5482,9 +5569,21 @@ async def update_organization(): "/organization/delete", tags=["organization management"], dependencies=[Depends(user_api_key_auth)], - response_model=LiteLLM_TeamTable, ) async def delete_organization(): + """[TODO] Not Implemented yet. Let us know if you need this - https://github.com/BerriAI/litellm/issues""" + pass + + +@router.post( + "/organization/info", + tags=["organization management"], + dependencies=[Depends(user_api_key_auth)], +) +async def info_organization(): + """ + Get the org specific information + """ pass diff --git a/schema.prisma b/schema.prisma index 2607cf2b0..e7932d634 100644 --- a/schema.prisma +++ b/schema.prisma @@ -14,7 +14,7 @@ model LiteLLM_BudgetTable { max_parallel_requests Int? tpm_limit BigInt? rpm_limit BigInt? - model_max_budget Json @default("{}") + model_max_budget Json? budget_duration String? budget_reset_at DateTime? created_at DateTime @default(now()) @map("created_at") From 1bb8263c922bdb133c13db2ece74b2d783900fbe Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 14:43:01 -0800 Subject: [PATCH 039/304] (feat) set soft_budget with /key/generate --- litellm/proxy/_types.py | 1 + litellm/proxy/proxy_server.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index e4b28001d..6196f18a2 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -151,6 +151,7 @@ class GenerateRequestBase(LiteLLMBase): rpm_limit: Optional[int] = None budget_duration: Optional[str] = None allowed_cache_controls: Optional[list] = [] + soft_budget: Optional[float] = None class GenerateKeyRequest(GenerateRequestBase): diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index dcd4283ba..482397b86 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1995,6 +1995,9 @@ async def generate_key_helper_fn( except Exception as e: traceback.print_exc() raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) + + # Add budget related info in key_data - this ensures it's returned + key_data["soft_budget"] = key_soft_budget return key_data From 163c8f1c5a137e9167c511ef228261cef6b14cc7 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 14:58:02 -0800 Subject: [PATCH 040/304] (feat) set soft budget limits on ui --- ui/litellm-dashboard/src/components/create_key_button.tsx | 3 +++ ui/litellm-dashboard/src/components/view_key_spend_report.tsx | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/src/components/create_key_button.tsx b/ui/litellm-dashboard/src/components/create_key_button.tsx index 3dddaf8b7..b6cec81e4 100644 --- a/ui/litellm-dashboard/src/components/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/create_key_button.tsx @@ -108,6 +108,9 @@ const CreateKey: React.FC = ({ ))} + + + diff --git a/ui/litellm-dashboard/src/components/view_key_spend_report.tsx b/ui/litellm-dashboard/src/components/view_key_spend_report.tsx index 0788af209..f0916ec01 100644 --- a/ui/litellm-dashboard/src/components/view_key_spend_report.tsx +++ b/ui/litellm-dashboard/src/components/view_key_spend_report.tsx @@ -105,7 +105,7 @@ const ViewKeySpendReport: React.FC = ({ return (
- Date: Sat, 2 Mar 2024 15:07:33 -0800 Subject: [PATCH 041/304] feat(proxy_server.py): exposes `/organization/info` and `/budget/info` endpoints --- litellm/proxy/_types.py | 8 ++++++ litellm/proxy/proxy_server.py | 52 +++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index a962b6aa6..5cd289b66 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -358,6 +358,14 @@ class NewOrganizationResponse(LiteLLM_OrganizationTable): updated_at: datetime +class OrganizationRequest(LiteLLMBase): + organizations: List[str] + + +class BudgetRequest(LiteLLMBase): + budgets: List[str] + + class KeyManagementSystem(enum.Enum): GOOGLE_KMS = "google_kms" AZURE_KEY_VAULT = "azure_key_vault" diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index f4909a408..bd3d111a7 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -5580,11 +5580,59 @@ async def delete_organization(): tags=["organization management"], dependencies=[Depends(user_api_key_auth)], ) -async def info_organization(): +async def info_organization(data: OrganizationRequest): """ Get the org specific information """ - pass + global prisma_client + + if prisma_client is None: + raise HTTPException(status_code=500, detail={"error": "No db connected"}) + + if len(data.organizations) == 0: + raise HTTPException( + status_code=400, + detail={ + "error": f"Specify list of organization id's to query. Passed in={data.organizations}" + }, + ) + response = await prisma_client.db.litellm_organizationtable.find_many( + where={"organization_id": {"in": data.organizations}}, + include={"litellm_budget_table": True}, + ) + + return response + + +#### BUDGET TABLE MANAGEMENT #### + + +@router.post( + "/budget/info", + tags=["organization management"], + dependencies=[Depends(user_api_key_auth)], +) +async def info_budget(data: BudgetRequest): + """ + Get the budget id specific information + """ + global prisma_client + + if prisma_client is None: + raise HTTPException(status_code=500, detail={"error": "No db connected"}) + + if len(data.budgets) == 0: + raise HTTPException( + status_code=400, + detail={ + "error": f"Specify list of budget id's to query. Passed in={data.budgets}" + }, + ) + response = await prisma_client.db.litellm_budgettable.find_many( + where={"budget_id": {"in": data.budgets}}, + ) + + return response #### MODEL MANAGEMENT #### From 709c2518e7eb81c488e382fc2cb4fa1134724946 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 15:31:59 -0800 Subject: [PATCH 042/304] (feat) set soft limits per key --- .../src/components/create_key_button.tsx | 50 ++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/ui/litellm-dashboard/src/components/create_key_button.tsx b/ui/litellm-dashboard/src/components/create_key_button.tsx index b6cec81e4..e76e2d0c2 100644 --- a/ui/litellm-dashboard/src/components/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/create_key_button.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef } from "react"; import { Button, TextInput, Grid, Col } from "@tremor/react"; -import { Card, Metric, Text } from "@tremor/react"; +import { Card, Metric, Text, Title, Subtitle } from "@tremor/react"; import { Button as Button2, Modal, @@ -38,6 +38,7 @@ const CreateKey: React.FC = ({ const [form] = Form.useForm(); const [isModalVisible, setIsModalVisible] = useState(false); const [apiKey, setApiKey] = useState(null); + const [softBudget, setSoftBudget] = useState(null); const handleOk = () => { setIsModalVisible(false); form.resetFields(); @@ -54,8 +55,11 @@ const CreateKey: React.FC = ({ message.info("Making API Call"); setIsModalVisible(true); const response = await keyCreateCall(accessToken, userID, formValues); + + console.log("key create Response:", response); setData((prevData) => (prevData ? [...prevData, response] : [response])); // Check if prevData is null setApiKey(response["key"]); + setSoftBudget(response["soft_budget"]); message.success("API Key Created"); form.resetFields(); localStorage.removeItem("userData" + userID); @@ -108,7 +112,7 @@ const CreateKey: React.FC = ({ ))} - + @@ -157,28 +161,38 @@ const CreateKey: React.FC = ({ {apiKey && ( -
-

- Please save this secret key somewhere safe and accessible. For - security reasons, you will not be able to view it again{" "} - through your LiteLLM account. If you lose this secret key, you - will need to generate a new one. -

- - - {apiKey != null ? ( - API Key: {apiKey} - ) : ( - Key being created, this might take 30s - )} - + + Save your Key + +

+ Please save this secret key somewhere safe and accessible. For + security reasons, you will not be able to view it again{" "} + through your LiteLLM account. If you lose this secret key, you + will need to generate a new one. +

+ + + {apiKey != null ? ( +
+ API Key: {apiKey} + Budgets + Soft Limit Budget: ${softBudget} + + +
+ ) : ( + Key being created, this might take 30s + )} + + )} From 96f11157c90a40286282a962bb4ded358996b17c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 15:32:43 -0800 Subject: [PATCH 043/304] fix(_types.py): have org id in newteamrequest pydantic object --- litellm/proxy/_types.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 5cd289b66..e981aef6d 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -250,6 +250,7 @@ class Member(LiteLLMBase): class NewTeamRequest(LiteLLMBase): team_alias: Optional[str] = None team_id: Optional[str] = None + organization_id: Optional[str] = None admins: list = [] members: list = [] members_with_roles: List[Member] = [] From 1ef19fbc9c690363de689203a8513a98f8cdff00 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 15:54:37 -0800 Subject: [PATCH 044/304] feat: enable user to test slack budget alerting when creating a key --- litellm/proxy/proxy_server.py | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 482397b86..99bdb579c 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -787,6 +787,7 @@ async def user_api_key_auth( "/global/spend/keys", "/global/spend/models", "/global/predict/spend/logs", + "/health/services", ] # check if the current route startswith any of the allowed routes if ( @@ -6479,6 +6480,42 @@ async def test_endpoint(request: Request): return {"route": request.url.path} +@router.get( + "/health/services", + tags=["health"], + dependencies=[Depends(user_api_key_auth)], + include_in_schema=False, +) +async def health_services_endpoint( + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), + service: Literal["slack_budget_alerts"] = fastapi.Query( + description="Specify the service being hit." + ), +): + """ + Hidden endpoint. + + Used by the UI to let user check if slack alerting is working as expected. + """ + global general_settings, proxy_logging_obj + + if service is None: + raise HTTPException( + status_code=400, detail={"error": "Service must be specified."} + ) + + if service not in ["slack_budget_alerts"]: + raise HTTPException( + status_code=400, + detail={ + "error": f"Service must be in list. Service={service}. List={['slack_budget_alerts']}" + }, + ) + + if "slack" in general_settings.get("alerting", []): + await proxy_logging_obj.alerting_handler(message="This is a test", level="Low") + + @router.get("/health", tags=["health"], dependencies=[Depends(user_api_key_auth)]) async def health_endpoint( user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), From cbd085125700c4ba3b83985c1fe505c48639d01f Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 15:56:42 -0800 Subject: [PATCH 045/304] fix(proxy_server.py): raise 422 error if no slack connection setup when calling `/health/services` --- litellm/proxy/proxy_server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 99bdb579c..ffae102a0 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6514,6 +6514,11 @@ async def health_services_endpoint( if "slack" in general_settings.get("alerting", []): await proxy_logging_obj.alerting_handler(message="This is a test", level="Low") + else: + raise HTTPException( + status_code=422, + detail={"error": "No slack connection setup. Unable to test this."}, + ) @router.get("/health", tags=["health"], dependencies=[Depends(user_api_key_auth)]) From b30cbd0d55d489d91bc5a54513b40e0488fd7bc4 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 16:04:36 -0800 Subject: [PATCH 046/304] refactor(proxy_server.py): format the message for slack budget alerts --- litellm/proxy/proxy_server.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index ffae102a0..eca5fb30a 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6512,8 +6512,11 @@ async def health_services_endpoint( }, ) + test_message = f"""\n🚨 `ProjectedLimitExceededError` 💸\n\n`Key Alias:` my-secret-project \n`Expected Day of Error`: 28th March \n`Current Spend`: 100 \n`Projected Spend at end of month`: 1000 \n + """ + if "slack" in general_settings.get("alerting", []): - await proxy_logging_obj.alerting_handler(message="This is a test", level="Low") + await proxy_logging_obj.alerting_handler(message=test_message, level="Low") else: raise HTTPException( status_code=422, From 768c3d8491b345b5293177bc29054b4ae8fdc992 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:13:22 -0800 Subject: [PATCH 047/304] (feat) test slack alerts --- .../src/components/create_key_button.tsx | 18 ++++++++-- .../src/components/networking.tsx | 35 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/ui/litellm-dashboard/src/components/create_key_button.tsx b/ui/litellm-dashboard/src/components/create_key_button.tsx index e76e2d0c2..6c88fc568 100644 --- a/ui/litellm-dashboard/src/components/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/create_key_button.tsx @@ -12,7 +12,7 @@ import { Select, message, } from "antd"; -import { keyCreateCall } from "./networking"; +import { keyCreateCall, slackBudgetAlertsHealthCheck } from "./networking"; const { Option } = Select; @@ -68,6 +68,20 @@ const CreateKey: React.FC = ({ } }; + const sendSlackAlert = async () => { + try { + console.log("Sending Slack alert..."); + message.info("Sending Test Slack alert..."); + const response = await slackBudgetAlertsHealthCheck(accessToken); + console.log("slackBudgetAlertsHealthCheck Response:", response); + message.success("Test Slack Alert worked - check your Slack!"); + console.log("Testing Slack alert successful"); + } catch (error) { + console.error("Error sending Slack alert:", error); + } + }; + + return (
diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index fff9cce64..9e85a5ca4 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -810,3 +810,38 @@ export const PredictedSpendLogsCall = async ( throw error; } }; + +export const slackBudgetAlertsHealthCheck = async (accessToken: String) => { + try { + let url = proxyBaseUrl + ? `${proxyBaseUrl}/health/services?service=slack_budget_alerts` + : `health/services?service=slack_budget_alerts`; + + console.log("Checking Slack Budget Alerts service health"); + + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + const errorData = await response.text(); + console.error("Health Check failed:", errorData); + throw new Error("Health Check failed"); + } + + const data = await response.json(); + console.log("Service Health Response:", data); + + // You can add additional logic here based on the response if needed + + return data; + } catch (error) { + console.error("Failed to perform health check:", error); + throw error; + } +}; + From 0b8506108647e9720285306823b0747466c637b4 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:32:33 -0800 Subject: [PATCH 048/304] (docs) --- docs/my-website/sidebars.js | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index f1c69f53a..764e9e721 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -40,7 +40,6 @@ const sidebars = { "proxy/virtual_keys", "proxy/users", "proxy/ui", - "proxy/metrics", "proxy/model_management", "proxy/health", "proxy/debugging", From ebaf2eef1f3d4cdbb3cc6cf7187b940056762671 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:46:20 -0800 Subject: [PATCH 049/304] (feat) improve error for testing slack --- litellm/proxy/proxy_server.py | 57 ++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index ffae102a0..b6796a81b 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6497,27 +6497,48 @@ async def health_services_endpoint( Used by the UI to let user check if slack alerting is working as expected. """ - global general_settings, proxy_logging_obj + try: + global general_settings, proxy_logging_obj - if service is None: - raise HTTPException( - status_code=400, detail={"error": "Service must be specified."} - ) + if service is None: + raise HTTPException( + status_code=400, detail={"error": "Service must be specified."} + ) - if service not in ["slack_budget_alerts"]: - raise HTTPException( - status_code=400, - detail={ - "error": f"Service must be in list. Service={service}. List={['slack_budget_alerts']}" - }, - ) + if service not in ["slack_budget_alerts"]: + raise HTTPException( + status_code=400, + detail={ + "error": f"Service must be in list. Service={service}. List={['slack_budget_alerts']}" + }, + ) - if "slack" in general_settings.get("alerting", []): - await proxy_logging_obj.alerting_handler(message="This is a test", level="Low") - else: - raise HTTPException( - status_code=422, - detail={"error": "No slack connection setup. Unable to test this."}, + if "slack" in general_settings.get("alerting", []): + await proxy_logging_obj.alerting_handler( + message="This is a test", level="Low" + ) + else: + raise HTTPException( + status_code=422, + detail={ + "error": '"slack" not in proxy config: general_settings. Unable to test this.' + }, + ) + except Exception as e: + if isinstance(e, HTTPException): + raise ProxyException( + message=getattr(e, "detail", f"Authentication Error({str(e)})"), + type="auth_error", + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", status.HTTP_401_UNAUTHORIZED), + ) + elif isinstance(e, ProxyException): + raise e + raise ProxyException( + message="Authentication Error, " + str(e), + type="auth_error", + param=getattr(e, "param", "None"), + code=status.HTTP_401_UNAUTHORIZED, ) From 169b085e9c3d57c57a66ae9d324223cd16652945 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:47:00 -0800 Subject: [PATCH 050/304] (ui) link to slack docs to test soft limit budget alerts --- .../src/components/create_key_button.tsx | 11 +++++++---- ui/litellm-dashboard/src/components/networking.tsx | 9 ++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ui/litellm-dashboard/src/components/create_key_button.tsx b/ui/litellm-dashboard/src/components/create_key_button.tsx index 6c88fc568..fa80556b5 100644 --- a/ui/litellm-dashboard/src/components/create_key_button.tsx +++ b/ui/litellm-dashboard/src/components/create_key_button.tsx @@ -71,10 +71,8 @@ const CreateKey: React.FC = ({ const sendSlackAlert = async () => { try { console.log("Sending Slack alert..."); - message.info("Sending Test Slack alert..."); const response = await slackBudgetAlertsHealthCheck(accessToken); console.log("slackBudgetAlertsHealthCheck Response:", response); - message.success("Test Slack Alert worked - check your Slack!"); console.log("Testing Slack alert successful"); } catch (error) { console.error("Error sending Slack alert:", error); @@ -198,9 +196,14 @@ const CreateKey: React.FC = ({ Budgets Soft Limit Budget: ${softBudget} - + + (LiteLLM Docs - + + Set Up Slack Alerting) + +
) : ( Key being created, this might take 30s diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 9e85a5ca4..a8ff29c00 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -818,6 +818,7 @@ export const slackBudgetAlertsHealthCheck = async (accessToken: String) => { : `health/services?service=slack_budget_alerts`; console.log("Checking Slack Budget Alerts service health"); + message.info("Sending Test Slack alert..."); const response = await fetch(url, { method: "GET", @@ -829,11 +830,13 @@ export const slackBudgetAlertsHealthCheck = async (accessToken: String) => { if (!response.ok) { const errorData = await response.text(); - console.error("Health Check failed:", errorData); - throw new Error("Health Check failed"); + message.error("Failed Slack Alert test: " + errorData); + // throw error with message + throw new Error(errorData); } - + const data = await response.json(); + message.success("Test Slack Alert worked - check your Slack!"); console.log("Service Health Response:", data); // You can add additional logic here based on the response if needed From 94301437665dc91319d8c626a28a23a967d1ea42 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:50:10 -0800 Subject: [PATCH 051/304] (feat) new ui build --- litellm/proxy/_experimental/out/404.html | 2 +- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 ...layout-f9be08c86364b0fc.js => layout-a001706742fcd3bc.js} | 2 +- .../out/_next/static/chunks/app/page-1b778934c9b8fd3d.js | 1 + .../out/_next/static/chunks/app/page-a458360dd75bd774.js | 1 - ...-app-096338c8e1915716.js => main-app-9b4fb13a7db53edf.js} | 2 +- litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 4 ++-- ui/litellm-dashboard/out/404.html | 2 +- .../out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js | 1 + .../out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js | 1 + .../out/_next/static/chunks/app/layout-a001706742fcd3bc.js | 1 + .../out/_next/static/chunks/app/page-1b778934c9b8fd3d.js | 1 + .../out/_next/static/chunks/main-app-9b4fb13a7db53edf.js | 1 + .../out/_next/static/chunks/webpack-59d9232c3e7a8be6.js | 1 + .../out/_next/static/css/32e93a3d13512de5.css | 5 +++++ ui/litellm-dashboard/out/index.html | 2 +- ui/litellm-dashboard/out/index.txt | 4 ++-- 19 files changed, 22 insertions(+), 11 deletions(-) rename litellm/proxy/_experimental/out/_next/static/{HnLepq2YNME88Nzo5qHls => 8Qf_s48H0nBodS2RVsrIl}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{HnLepq2YNME88Nzo5qHls => 8Qf_s48H0nBodS2RVsrIl}/_ssgManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/chunks/app/{layout-f9be08c86364b0fc.js => layout-a001706742fcd3bc.js} (60%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js rename litellm/proxy/_experimental/out/_next/static/chunks/{main-app-096338c8e1915716.js => main-app-9b4fb13a7db53edf.js} (54%) create mode 100644 ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js create mode 100644 ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/layout-a001706742fcd3bc.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js create mode 100644 ui/litellm-dashboard/out/_next/static/css/32e93a3d13512de5.css diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html index 9b28cde0b..1f1e14ae0 100644 --- a/litellm/proxy/_experimental/out/404.html +++ b/litellm/proxy/_experimental/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/HnLepq2YNME88Nzo5qHls/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f9be08c86364b0fc.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-a001706742fcd3bc.js similarity index 60% rename from litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f9be08c86364b0fc.js rename to litellm/proxy/_experimental/out/_next/static/chunks/app/layout-a001706742fcd3bc.js index fe5260feb..e261adc05 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f9be08c86364b0fc.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/layout-a001706742fcd3bc.js @@ -1 +1 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{11837:function(n,e,t){Promise.resolve().then(t.t.bind(t,99646,23)),Promise.resolve().then(t.t.bind(t,63385,23))},63385:function(){},99646:function(n){n.exports={style:{fontFamily:"'__Inter_c23dc8', '__Inter_Fallback_c23dc8'",fontStyle:"normal"},className:"__className_c23dc8"}}},function(n){n.O(0,[971,69,744],function(){return n(n.s=11837)}),_N_E=n.O()}]); \ No newline at end of file +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{87421:function(n,e,t){Promise.resolve().then(t.t.bind(t,99646,23)),Promise.resolve().then(t.t.bind(t,63385,23))},63385:function(){},99646:function(n){n.exports={style:{fontFamily:"'__Inter_c23dc8', '__Inter_Fallback_c23dc8'",fontStyle:"normal"},className:"__className_c23dc8"}}},function(n){n.O(0,[971,69,744],function(){return n(n.s=87421)}),_N_E=n.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js new file mode 100644 index 000000000..efda0f860 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js deleted file mode 100644 index e0372da4f..000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-a458360dd75bd774.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{79615:function(e,s,t){Promise.resolve().then(t.bind(t,74961))},74961:function(e,s,t){"use strict";t.r(s),t.d(s,{default:function(){return eE}});var l=t(3827),n=t(64090),r=t(47907),a=t(8792),o=t(2179),i=e=>{let{userID:s,userRole:t,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",s),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",t]}),(0,l.jsxs)("p",{children:["ID: ",s]})]})]})]})},c=t(80588);let d=async(e,s,t)=>{try{if(console.log("Form Values in keyCreateCall:",t),t.description&&(t.metadata||(t.metadata={}),t.metadata.description=t.description,delete t.description,t.metadata=JSON.stringify(t.metadata)),t.metadata){console.log("formValues.metadata:",t.metadata);try{t.metadata=JSON.parse(t.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",t);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:s,...t})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,s,t)=>{try{if(console.log("Form Values in keyCreateCall:",t),t.description&&(t.metadata||(t.metadata={}),t.metadata.description=t.description,delete t.description,t.metadata=JSON.stringify(t.metadata)),t.metadata){console.log("formValues.metadata:",t.metadata);try{t.metadata=JSON.parse(t.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",t);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:s,...t})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,s)=>{try{console.log("in keyDeleteCall:",s),c.ZP.info("Making key delete request");let t=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[s]})});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await t.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,s,t){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==t&&s&&(n="".concat(n,"/?user_id=").concat(s)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,s,t)=>{try{c.ZP.info("Requesting model data");let s=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return c.ZP.info("Received model data"),t}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,s,t)=>{try{c.ZP.info("Requesting model data");let s=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return c.ZP.info("Received model data"),t}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,s)=>{try{let t="/global/spend/logs";console.log("in keySpendLogsCall:",t);let l=await fetch("".concat(t,"/?api_key=").concat(s),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,s,t,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(t));let s="/spend/logs";s="App Owner"==t?"".concat(s,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(s,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let s=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return console.log(t),c.ZP.success("Spend Logs received"),t}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let s=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return console.log(t),c.ZP.success("Spend Logs received"),t}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,s)=>{try{s&&JSON.stringify({api_key:s}),c.ZP.info("Making top end users request");let t={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};s&&(t.body=JSON.stringify({api_key:s}));let l=await fetch("/global/spend/end_users",t);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let s=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let t=await s.json();return console.log(t),c.ZP.success("Top Models received"),t}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,s)=>{try{let t=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:s})});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await t.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,s)=>{try{let t="/spend/users";console.log("in spendUsersCall:",t);let l=await fetch("".concat(t,"/?user_id=").concat(s),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,s,t,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[s],user_id:t,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let s="/user/get_requests";console.log("in userGetRequesedtModelsCall:",s);let t=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await t.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,s)=>{try{let t="/user/get_users?role=".concat(s);console.log("in userGetAllUsersCall:",t);let l=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,s)=>{try{console.log("Form Values in teamCreateCall:",s);let t=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...s})});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await t.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,s,t)=>{try{console.log("Form Values in teamMemberAddCall:",t);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:s,member:t})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,s)=>{try{console.log("Form Values in userUpdateUserCall:",s);let t=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...s})});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await t.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,s)=>{try{let t=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:s})});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await t.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}};var P=t(10384),T=t(46453),E=t(71801),F=t(17189),M=t(12143),O=t(77171),R=t(42539),D=t(88707),U=t(1861);let{Option:L}=F.default;var z=e=>{let{userID:s,teamID:t,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=M.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),Z=()=>{p(!1),u.resetFields()},y=()=>{p(!1),g(null),u.resetFields()},f=async e=>{try{c.ZP.info("Making API Call"),p(!0);let t=await d(a,s,e);m(e=>e?[...e,t]:[t]),g(t.key),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+s)}catch(e){console.error("Error creating the key:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(O.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:Z,onCancel:y,children:(0,l.jsxs)(M.Z,{form:u,onFinish:f,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(R.Z,{placeholder:"ai_team",defaultValue:t||""})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(L,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(F.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(F.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(F.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(R.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(R.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(R.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(O.Z,{title:"Save your key",visible:x,onOk:Z,onCancel:y,footer:null,children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)(E.Z,{children:["API Key: ",j]}):(0,l.jsx)(E.Z,{children:"Key being created, this might take 30s"})})]})})]})},q=t(33393),B=t(13810),K=t(61244),V=t(10827),J=t(3851),G=t(2044),W=t(64167),$=t(74480),Y=t(7178),H=t(9853),X=t(56863),Q=t(42440),ee=e=>{let{token:s,accessToken:t,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==t||null==s)return;console.log("accessToken: ".concat(t,"; token: ").concat(s));let e=await j(t,s);console.log("Response:",e),m(e);let l=await I(t,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return s?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},children:"View Spend Report"}),(0,l.jsxs)(O.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(Q.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(X.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(Q.Z,{children:u}),(0,l.jsx)(B.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(H.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:s,accessToken:t,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+s),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(t,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Key Alias"}),(0,l.jsx)($.Z,{children:"Secret Key"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Key Budget (USD)"}),(0,l.jsx)($.Z,{children:"Spend Report"}),(0,l.jsx)($.Z,{children:"Team ID"}),(0,l.jsx)($.Z,{children:"Metadata"}),(0,l.jsx)($.Z,{children:"Models"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)($.Z,{children:"Expires"})]})}),(0,l.jsx)(J.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:null!=e.key_alias?(0,l.jsx)(E.Z,{children:e.key_alias}):(0,l.jsx)(E.Z,{children:"Not Set"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.spend})}),(0,l.jsx)(G.Z,{children:null!=e.max_budget?(0,l.jsx)(E.Z,{children:e.max_budget}):(0,l.jsx)(E.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(ee,{token:e.token,accessToken:t,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:e.team_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(E.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:null!=e.expires?(0,l.jsx)(E.Z,{children:e.expires}):(0,l.jsx)(E.Z,{children:"Never expires"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{onClick:()=>p(e.token),icon:q.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},et=e=>{let{userID:s,userSpendData:t,userRole:r,accessToken:a}=e;console.log("User SpendData:",t);let[o,i]=(0,n.useState)(null==t?void 0:t.spend),[c,d]=(0,n.useState)((null==t?void 0:t.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let s=e[0];i(null==s?void 0:s.spend),d((null==s?void 0:s.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,s]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(B.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(X.Z,{children:["$",o]}),(0,l.jsxs)(Q.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},el=t(36083),en=t(68967),er=t(27166),ea=e=>{let{teams:s,setSelectedTeam:t}=e,{Title:r,Paragraph:a}=el.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),s&&s.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:s.map((e,s)=>(0,l.jsx)(er.Z,{value:String(s),onClick:()=>t(e),children:e.team_alias},s))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},eo=t(37963);console.log("isLocal:",!1);var ei=e=>{let{userID:s,userRole:t,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,eo.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let s=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",s),i(s)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(s&&y&&t&&!o&&!x){let e=sessionStorage.getItem("userModels"+s);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,s,t);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+s,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+s,JSON.stringify(e.user_info));let l=(await p(y,s,t)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+s,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[s,Z,y,o,t]),null==s||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==t&&i("App Owner"),t&&"Admin Viewer"==t){let{Title:e,Paragraph:s}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(s,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(T.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(et,{userID:s,userSpendData:x,userRole:t,accessToken:y}),(0,l.jsx)(es,{userID:s,accessToken:y,data:o,setData:m}),(0,l.jsx)(z,{userID:s,teamID:_?_.team_id:null,userRole:t,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(ea,{teams:a,setSelectedTeam:b})]})})})},ec=t(5);let{Option:ed}=F.default;var eh=e=>{let{userModels:s,accessToken:t,userID:r}=e,[a]=M.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:s,accessReason:l}=e;await b(t,s,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(O.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(F.default,{placeholder:"Select model",style:{width:"100%"},children:s.map(e=>(0,l.jsx)(ed,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(R.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},em=e=>{let{accessToken:s,token:t,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!s||!t||!r||!a)return;let e=async()=>{try{let e=await x(s,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&s){let e=await v(s);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&r&&a&&e()},[s,t,r,a]),!i||!s||!t||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:e.model_name})}),(0,l.jsx)(G.Z,{children:e.provider}),(0,l.jsx)(G.Z,{children:e.user_access?(0,l.jsx)(ec.Z,{color:"green",children:"Yes"}):(0,l.jsx)(eh,{userModels:m,accessToken:s,userID:a})}),(0,l.jsx)(G.Z,{children:e.input_cost}),(0,l.jsx)(G.Z,{children:e.output_cost}),(0,l.jsx)(G.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(B.Z,{children:(0,l.jsxs)(V.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Q.Z,{children:"Pending Requests"}),(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"User ID"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Requested Models"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Justification"})})]})]}),(0,l.jsx)(J.Z,{children:d.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},eu=t(92836),ex=t(26734),ep=t(41608),ej=t(32126),eg=t(23682);let{Option:eZ}=F.default;var ey=e=>{let{userID:s,accessToken:t}=e,[r]=M.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(t,s,"any"),l=[];for(let s=0;s{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(t,s,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+s)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(O.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(M.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(R.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(M.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(R.Z,{placeholder:"ai_team"})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(eZ,{value:e,children:e},e))})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(R.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(O.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ef=e=>{let{accessToken:s,token:t,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!s||!t||!a||!o)return;let e=async()=>{try{let e=await u(s,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};s&&t&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(s,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[s,t,a,o]),!c||!s||!t||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let t=await f(s,e);console.log("user data response:",t),m(t)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ey,{userID:o,accessToken:s}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(eu.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(eu.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(V.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"User ID"}),(0,l.jsx)($.Z,{children:"User Role"}),(0,l.jsx)($.Z,{children:"User Models"}),(0,l.jsx)($.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)($.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)(J.Z,{children:c.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_id}),(0,l.jsx)(G.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(G.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(G.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(E.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(en.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,s)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(er.Z,{value:String(s),onClick:()=>j(e.token),children:e.key_name},s)})})]})]}),(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"End User"}),(0,l.jsx)($.Z,{children:"Spend"}),(0,l.jsx)($.Z,{children:"Total Events"})]})}),(0,l.jsx)(J.Z,{children:null==h?void 0:h.map((e,s)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.end_user}),(0,l.jsx)(G.Z,{children:e.total_spend}),(0,l.jsx)(G.Z,{children:e.total_events})]},s))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),s=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",s," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ew=t(8510),ek=e=>{let{teams:s,searchParams:t,accessToken:r,setTeams:a}=e,[i]=M.Z.useForm(),[d]=M.Z.useForm(),{Title:h,Paragraph:m}=el.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(s?s[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let t=await N(r,e);null!==s?a([...s,t]):a([t]),console.log("response for team create call: ".concat(t)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=s){c.ZP.info("Making API Call");let t={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,t);console.log("response for team create call: ".concat(l.data));let n=s.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...s];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(s)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Team Name"}),(0,l.jsx)($.Z,{children:"Spend (USD)"}),(0,l.jsx)($.Z,{children:"Budget (USD)"}),(0,l.jsx)($.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)(J.Z,{children:s&&s.length>0?s.map(e=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.team_alias}),(0,l.jsx)(G.Z,{children:e.spend}),(0,l.jsx)(G.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(G.Z,{children:(0,l.jsxs)(E.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(O.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(R.Z,{})}),(0,l.jsx)(M.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(F.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(M.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(D.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(M.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})}),(0,l.jsx)(M.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(D.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),s&&s.length>0?(0,l.jsx)(en.Z,{defaultValue:"0",children:s.map((e,s)=>(0,l.jsx)(er.Z,{value:String(s),onClick:()=>{j(e)},children:e.team_alias},s))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:p?p.members_with_roles.map((e,s)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},s)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(O.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(M.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},e_=e=>{let{searchParams:s,accessToken:t}=e,[r]=M.Z.useForm(),[a]=M.Z.useForm(),{Title:i,Paragraph:d}=el.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=t){let e=[],s=await S(t,"proxy_admin_viewer");s.forEach(s=>{e.push({user_role:s.user_role,user_id:s.user_id,user_email:s.user_email})}),console.log("proxy viewers: ".concat(s));let l=await S(t,"proxy_admin");l.forEach(s=>{e.push({user_role:s.user_role,user_id:s.user_id,user_email:s.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[t]);let g=async e=>{try{if(null!=t&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let s=await C(t,e);console.log("response for team create call: ".concat(s));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(s.user_id)),e.user_id===s.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(s),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(T.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsx)(B.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(V.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)($.Z,{children:"Member Name"}),(0,l.jsx)($.Z,{children:"Role"}),(0,l.jsx)($.Z,{children:"Action"})]})}),(0,l.jsx)(J.Z,{children:u?u.map((e,s)=>(0,l.jsxs)(Y.Z,{children:[(0,l.jsx)(G.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(G.Z,{children:e.user_role}),(0,l.jsx)(G.Z,{children:(0,l.jsx)(K.Z,{icon:ew.Z,size:"sm"})})]},s)):null})]})})}),(0,l.jsxs)(P.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(O.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(M.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(M.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(M.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(R.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(U.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},eb=t(12968),ev=t(67951);async function eS(e,s,t,l){console.log("isLocal:",!1);let n=window.location.origin,r=new eb.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:t,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&s(l.choices[0].delta.content)}var eN=e=>{let{accessToken:s,token:t,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{s&&t&&r&&a&&(async()=>{let e=await p(s,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[s,a,r]);let j=(e,s)=>{d(t=>{let l=t[t.length-1];return l&&l.role===e?[...t.slice(0,t.length-1),{role:e,content:l.content+s}]:[...t,{role:e,content:s}]})},g=async()=>{if(""!==o.trim()&&s&&t&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eS(o,e=>j("assistant",e),h,s)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:s}=el.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(s,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(T.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(B.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{className:"mt-4",children:[(0,l.jsx)(eu.Z,{children:"Chat"}),(0,l.jsx)(eu.Z,{children:"API Reference"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(V.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:(0,l.jsx)(Q.Z,{children:"Chat"})})})}),(0,l.jsx)(J.Z,{children:c.map((e,s)=>(0,l.jsx)(Y.Z,{children:(0,l.jsx)(G.Z,{children:"".concat(e.role,": ").concat(e.content)})},s))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(ej.Z,{children:(0,l.jsxs)(ex.Z,{children:[(0,l.jsxs)(ep.Z,{children:[(0,l.jsx)(eu.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(eu.Z,{children:"LlamaIndex"}),(0,l.jsx)(eu.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(ej.Z,{children:(0,l.jsx)(ev.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eA=t(33509),eC=t(30569);let{Sider:eI}=eA.default;var eP=e=>{let{setPage:s,userRole:t,defaultSelectedKey:n}=e;return"Admin Viewer"==t?(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>s("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eA.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eI,{width:120,children:(0,l.jsxs)(eC.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eC.Z.Item,{onClick:()=>s("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("models"),children:"Models"},"2"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eC.Z.Item,{onClick:()=>s("usage"),children:"Usage"},"4"),"Admin"==t?(0,l.jsx)(eC.Z.Item,{onClick:()=>s("users"),children:"Users"},"5"):null,"Admin"==t?(0,l.jsx)(eC.Z.Item,{onClick:()=>s("teams"),children:"Teams"},"6"):null,"Admin"==t?(0,l.jsx)(eC.Z.Item,{onClick:()=>s("admin-panel"),children:"Admin"},"7"):null]})})})},eT=e=>{let{accessToken:s,token:t,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let s=e.getFullYear(),t=e.getMonth()+1,l=e.getDate();return"".concat(s,"-").concat(t<10?"0"+t:t,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{s&&t&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(s);c(e);let t=(await y(s)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(t);let l=(await w(s)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(s,t,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let s=e.daily_spend;console.log("daily spend",s),c(s);let t=e.top_api_keys;h(t)}else{let t=(await k(s,function(e){let s=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[t,l]=e;"spend"!==t&&"startTime"!==t&&"models"!==t&&"users"!==t&&s.push({key:t,spend:l})})}),s.sort((e,s)=>Number(s.spend)-Number(e.spend));let t=s.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(t[0]))),t}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(t),p(function(e){let s={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[t,l]=e;""!==t&&null!=t&&"None"!=t&&(s[t]||(s[t]=0),s[t]+=l)})});let t=Object.entries(s).map(e=>{let[s,t]=e;return{user_id:s,spend:t}});t.sort((e,s)=>s.spend-e.spend);let l=t.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[s,t,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(T.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(P.Z,{numColSpan:2,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Monthly Spend"}),(0,l.jsx)(H.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top API Keys"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Users"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(P.Z,{numColSpan:1,children:(0,l.jsxs)(B.Z,{children:[(0,l.jsx)(Q.Z,{children:"Top Models"}),(0,l.jsx)(H.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eE=()=>{let{Title:e,Paragraph:s}=el.default,[t,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,eo.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let s=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",s),a(s),"Admin Viewer"==s&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:t,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eP,{setPage:f,userRole:t,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ei,{userID:g,userRole:t,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(em,{userID:g,userRole:t,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eN,{userID:g,userRole:t,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ef,{userID:g,userRole:t,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(ek,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(e_,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eT,{userID:g,userRole:t,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=79615)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js b/litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js similarity index 54% rename from litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js rename to litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js index 421ae3e2c..440df3cb3 100644 --- a/litellm/proxy/_experimental/out/_next/static/chunks/main-app-096338c8e1915716.js +++ b/litellm/proxy/_experimental/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js @@ -1 +1 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{70377:function(e,n,t){Promise.resolve().then(t.t.bind(t,47690,23)),Promise.resolve().then(t.t.bind(t,48955,23)),Promise.resolve().then(t.t.bind(t,5613,23)),Promise.resolve().then(t.t.bind(t,11902,23)),Promise.resolve().then(t.t.bind(t,31778,23)),Promise.resolve().then(t.t.bind(t,77831,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,69],function(){return n(35317),n(70377)}),_N_E=e.O()}]); \ No newline at end of file +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{32028:function(e,n,t){Promise.resolve().then(t.t.bind(t,47690,23)),Promise.resolve().then(t.t.bind(t,48955,23)),Promise.resolve().then(t.t.bind(t,5613,23)),Promise.resolve().then(t.t.bind(t,11902,23)),Promise.resolve().then(t.t.bind(t,31778,23)),Promise.resolve().then(t.t.bind(t,77831,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,69],function(){return n(35317),n(32028)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.html b/litellm/proxy/_experimental/out/index.html index 99ac50ef5..0c7a9b87f 100644 --- a/litellm/proxy/_experimental/out/index.html +++ b/litellm/proxy/_experimental/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.txt b/litellm/proxy/_experimental/out/index.txt index a259886a9..5afb31dc0 100644 --- a/litellm/proxy/_experimental/out/index.txt +++ b/litellm/proxy/_experimental/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[74961,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-a458360dd75bd774.js"],""] +3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-1b778934c9b8fd3d.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["HnLepq2YNME88Nzo5qHls",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["8Qf_s48H0nBodS2RVsrIl",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null diff --git a/ui/litellm-dashboard/out/404.html b/ui/litellm-dashboard/out/404.html index 9b28cde0b..1f1e14ae0 100644 --- a/ui/litellm-dashboard/out/404.html +++ b/ui/litellm-dashboard/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js b/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js new file mode 100644 index 000000000..f779caa02 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js @@ -0,0 +1 @@ +self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-d6107f1aac0c574c.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB(); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js b/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js new file mode 100644 index 000000000..5b3ff592f --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js @@ -0,0 +1 @@ +self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/layout-a001706742fcd3bc.js b/ui/litellm-dashboard/out/_next/static/chunks/app/layout-a001706742fcd3bc.js new file mode 100644 index 000000000..e261adc05 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/chunks/app/layout-a001706742fcd3bc.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{87421:function(n,e,t){Promise.resolve().then(t.t.bind(t,99646,23)),Promise.resolve().then(t.t.bind(t,63385,23))},63385:function(){},99646:function(n){n.exports={style:{fontFamily:"'__Inter_c23dc8', '__Inter_Fallback_c23dc8'",fontStyle:"normal"},className:"__className_c23dc8"}}},function(n){n.O(0,[971,69,744],function(){return n(n.s=87421)}),_N_E=n.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js new file mode 100644 index 000000000..efda0f860 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js b/ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js new file mode 100644 index 000000000..440df3cb3 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/chunks/main-app-9b4fb13a7db53edf.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{32028:function(e,n,t){Promise.resolve().then(t.t.bind(t,47690,23)),Promise.resolve().then(t.t.bind(t,48955,23)),Promise.resolve().then(t.t.bind(t,5613,23)),Promise.resolve().then(t.t.bind(t,11902,23)),Promise.resolve().then(t.t.bind(t,31778,23)),Promise.resolve().then(t.t.bind(t,77831,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,69],function(){return n(35317),n(32028)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js b/ui/litellm-dashboard/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js new file mode 100644 index 000000000..7f7915bb5 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/chunks/webpack-59d9232c3e7a8be6.js @@ -0,0 +1 @@ +!function(){"use strict";var e,t,n,r,o,u,i,c,f,a={},l={};function d(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={id:e,loaded:!1,exports:{}},r=!0;try{a[e](n,n.exports,d),r=!1}finally{r&&delete l[e]}return n.loaded=!0,n.exports}d.m=a,e=[],d.O=function(t,n,r,o){if(n){o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o];return}for(var i=1/0,u=0;u=o&&Object.keys(d.O).every(function(e){return d.O[e](n[f])})?n.splice(f--,1):(c=!1,o: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)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem * var(--tw-space-x-reverse));margin-left:calc(.125rem * calc(1 - var(--tw-space-x-reverse)))}.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-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem * var(--tw-space-x-reverse));margin-left:calc(2.5rem * 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-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)))}.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-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-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))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-tremor-border>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-clip{overflow-x:clip}.overflow-x-scroll{overflow-x:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-\[1px\]{border-radius:1px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-tremor-default{border-radius:.5rem}.rounded-tremor-full{border-radius:9999px}.rounded-tremor-small{border-radius:.375rem}.rounded-b-tremor-default{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-tremor-default{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-tremor-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-tremor-small{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-tremor-default{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-tremor-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-tremor-small{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-t-tremor-default{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-4{border-right-width:4px}.border-t-4{border-top-width:4px}.border-t-\[1px\]{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.border-dark-tremor-background{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-dark-tremor-border{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-dark-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-dark-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-dark-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-dark-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-tremor-background{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-tremor-brand-emphasis{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.border-tremor-brand-inverted{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-tremor-brand-subtle{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.bg-dark-tremor-background{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-dark-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-dark-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-dark-tremor-brand-emphasis{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-dark-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}.bg-dark-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-dark-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.bg-slate-950\/30{background-color:rgba(2,6,23,.3)}.bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-tremor-background-emphasis{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-tremor-background-subtle{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-tremor-border{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-tremor-brand{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-tremor-brand-faint{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.bg-tremor-brand-muted{--tw-bg-opacity:1;background-color:rgb(134 136 239/var(--tw-bg-opacity))}.bg-tremor-brand-muted\/50{background-color:rgba(134,136,239,.5)}.bg-tremor-brand-subtle{--tw-bg-opacity:1;background-color:rgb(142 145 235/var(--tw-bg-opacity))}.bg-tremor-content-subtle{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.bg-opacity-10{--tw-bg-opacity:0.1}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-opacity-30{--tw-bg-opacity:0.3}.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:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-tremor-background{--tw-gradient-from:#fff var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-tremor-background{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.fill-amber-100{fill:#fef3c7}.fill-amber-200{fill:#fde68a}.fill-amber-300{fill:#fcd34d}.fill-amber-400{fill:#fbbf24}.fill-amber-50{fill:#fffbeb}.fill-amber-500{fill:#f59e0b}.fill-amber-600{fill:#d97706}.fill-amber-700{fill:#b45309}.fill-amber-800{fill:#92400e}.fill-amber-900{fill:#78350f}.fill-amber-950{fill:#451a03}.fill-blue-100{fill:#dbeafe}.fill-blue-200{fill:#bfdbfe}.fill-blue-300{fill:#93c5fd}.fill-blue-400{fill:#60a5fa}.fill-blue-50{fill:#eff6ff}.fill-blue-500{fill:#3b82f6}.fill-blue-600{fill:#2563eb}.fill-blue-700{fill:#1d4ed8}.fill-blue-800{fill:#1e40af}.fill-blue-900{fill:#1e3a8a}.fill-blue-950{fill:#172554}.fill-cyan-100{fill:#cffafe}.fill-cyan-200{fill:#a5f3fc}.fill-cyan-300{fill:#67e8f9}.fill-cyan-400{fill:#22d3ee}.fill-cyan-50{fill:#ecfeff}.fill-cyan-500{fill:#06b6d4}.fill-cyan-600{fill:#0891b2}.fill-cyan-700{fill:#0e7490}.fill-cyan-800{fill:#155e75}.fill-cyan-900{fill:#164e63}.fill-cyan-950{fill:#083344}.fill-emerald-100{fill:#d1fae5}.fill-emerald-200{fill:#a7f3d0}.fill-emerald-300{fill:#6ee7b7}.fill-emerald-400{fill:#34d399}.fill-emerald-50{fill:#ecfdf5}.fill-emerald-500{fill:#10b981}.fill-emerald-600{fill:#059669}.fill-emerald-700{fill:#047857}.fill-emerald-800{fill:#065f46}.fill-emerald-900{fill:#064e3b}.fill-emerald-950{fill:#022c22}.fill-fuchsia-100{fill:#fae8ff}.fill-fuchsia-200{fill:#f5d0fe}.fill-fuchsia-300{fill:#f0abfc}.fill-fuchsia-400{fill:#e879f9}.fill-fuchsia-50{fill:#fdf4ff}.fill-fuchsia-500{fill:#d946ef}.fill-fuchsia-600{fill:#c026d3}.fill-fuchsia-700{fill:#a21caf}.fill-fuchsia-800{fill:#86198f}.fill-fuchsia-900{fill:#701a75}.fill-fuchsia-950{fill:#4a044e}.fill-gray-100{fill:#f3f4f6}.fill-gray-200{fill:#e5e7eb}.fill-gray-300{fill:#d1d5db}.fill-gray-400{fill:#9ca3af}.fill-gray-50{fill:#f9fafb}.fill-gray-500{fill:#6b7280}.fill-gray-600{fill:#4b5563}.fill-gray-700{fill:#374151}.fill-gray-800{fill:#1f2937}.fill-gray-900{fill:#111827}.fill-gray-950{fill:#030712}.fill-green-100{fill:#dcfce7}.fill-green-200{fill:#bbf7d0}.fill-green-300{fill:#86efac}.fill-green-400{fill:#4ade80}.fill-green-50{fill:#f0fdf4}.fill-green-500{fill:#22c55e}.fill-green-600{fill:#16a34a}.fill-green-700{fill:#15803d}.fill-green-800{fill:#166534}.fill-green-900{fill:#14532d}.fill-green-950{fill:#052e16}.fill-indigo-100{fill:#e0e7ff}.fill-indigo-200{fill:#c7d2fe}.fill-indigo-300{fill:#a5b4fc}.fill-indigo-400{fill:#818cf8}.fill-indigo-50{fill:#eef2ff}.fill-indigo-500{fill:#6366f1}.fill-indigo-600{fill:#4f46e5}.fill-indigo-700{fill:#4338ca}.fill-indigo-800{fill:#3730a3}.fill-indigo-900{fill:#312e81}.fill-indigo-950{fill:#1e1b4b}.fill-lime-100{fill:#ecfccb}.fill-lime-200{fill:#d9f99d}.fill-lime-300{fill:#bef264}.fill-lime-400{fill:#a3e635}.fill-lime-50{fill:#f7fee7}.fill-lime-500{fill:#84cc16}.fill-lime-600{fill:#65a30d}.fill-lime-700{fill:#4d7c0f}.fill-lime-800{fill:#3f6212}.fill-lime-900{fill:#365314}.fill-lime-950{fill:#1a2e05}.fill-neutral-100{fill:#f5f5f5}.fill-neutral-200{fill:#e5e5e5}.fill-neutral-300{fill:#d4d4d4}.fill-neutral-400{fill:#a3a3a3}.fill-neutral-50{fill:#fafafa}.fill-neutral-500{fill:#737373}.fill-neutral-600{fill:#525252}.fill-neutral-700{fill:#404040}.fill-neutral-800{fill:#262626}.fill-neutral-900{fill:#171717}.fill-neutral-950{fill:#0a0a0a}.fill-orange-100{fill:#ffedd5}.fill-orange-200{fill:#fed7aa}.fill-orange-300{fill:#fdba74}.fill-orange-400{fill:#fb923c}.fill-orange-50{fill:#fff7ed}.fill-orange-500{fill:#f97316}.fill-orange-600{fill:#ea580c}.fill-orange-700{fill:#c2410c}.fill-orange-800{fill:#9a3412}.fill-orange-900{fill:#7c2d12}.fill-orange-950{fill:#431407}.fill-pink-100{fill:#fce7f3}.fill-pink-200{fill:#fbcfe8}.fill-pink-300{fill:#f9a8d4}.fill-pink-400{fill:#f472b6}.fill-pink-50{fill:#fdf2f8}.fill-pink-500{fill:#ec4899}.fill-pink-600{fill:#db2777}.fill-pink-700{fill:#be185d}.fill-pink-800{fill:#9d174d}.fill-pink-900{fill:#831843}.fill-pink-950{fill:#500724}.fill-purple-100{fill:#f3e8ff}.fill-purple-200{fill:#e9d5ff}.fill-purple-300{fill:#d8b4fe}.fill-purple-400{fill:#c084fc}.fill-purple-50{fill:#faf5ff}.fill-purple-500{fill:#a855f7}.fill-purple-600{fill:#9333ea}.fill-purple-700{fill:#7e22ce}.fill-purple-800{fill:#6b21a8}.fill-purple-900{fill:#581c87}.fill-purple-950{fill:#3b0764}.fill-red-100{fill:#fee2e2}.fill-red-200{fill:#fecaca}.fill-red-300{fill:#fca5a5}.fill-red-400{fill:#f87171}.fill-red-50{fill:#fef2f2}.fill-red-500{fill:#ef4444}.fill-red-600{fill:#dc2626}.fill-red-700{fill:#b91c1c}.fill-red-800{fill:#991b1b}.fill-red-900{fill:#7f1d1d}.fill-red-950{fill:#450a0a}.fill-rose-100{fill:#ffe4e6}.fill-rose-200{fill:#fecdd3}.fill-rose-300{fill:#fda4af}.fill-rose-400{fill:#fb7185}.fill-rose-50{fill:#fff1f2}.fill-rose-500{fill:#f43f5e}.fill-rose-600{fill:#e11d48}.fill-rose-700{fill:#be123c}.fill-rose-800{fill:#9f1239}.fill-rose-900{fill:#881337}.fill-rose-950{fill:#4c0519}.fill-sky-100{fill:#e0f2fe}.fill-sky-200{fill:#bae6fd}.fill-sky-300{fill:#7dd3fc}.fill-sky-400{fill:#38bdf8}.fill-sky-50{fill:#f0f9ff}.fill-sky-500{fill:#0ea5e9}.fill-sky-600{fill:#0284c7}.fill-sky-700{fill:#0369a1}.fill-sky-800{fill:#075985}.fill-sky-900{fill:#0c4a6e}.fill-sky-950{fill:#082f49}.fill-slate-100{fill:#f1f5f9}.fill-slate-200{fill:#e2e8f0}.fill-slate-300{fill:#cbd5e1}.fill-slate-400{fill:#94a3b8}.fill-slate-50{fill:#f8fafc}.fill-slate-500{fill:#64748b}.fill-slate-600{fill:#475569}.fill-slate-700{fill:#334155}.fill-slate-800{fill:#1e293b}.fill-slate-900{fill:#0f172a}.fill-slate-950{fill:#020617}.fill-stone-100{fill:#f5f5f4}.fill-stone-200{fill:#e7e5e4}.fill-stone-300{fill:#d6d3d1}.fill-stone-400{fill:#a8a29e}.fill-stone-50{fill:#fafaf9}.fill-stone-500{fill:#78716c}.fill-stone-600{fill:#57534e}.fill-stone-700{fill:#44403c}.fill-stone-800{fill:#292524}.fill-stone-900{fill:#1c1917}.fill-stone-950{fill:#0c0a09}.fill-teal-100{fill:#ccfbf1}.fill-teal-200{fill:#99f6e4}.fill-teal-300{fill:#5eead4}.fill-teal-400{fill:#2dd4bf}.fill-teal-50{fill:#f0fdfa}.fill-teal-500{fill:#14b8a6}.fill-teal-600{fill:#0d9488}.fill-teal-700{fill:#0f766e}.fill-teal-800{fill:#115e59}.fill-teal-900{fill:#134e4a}.fill-teal-950{fill:#042f2e}.fill-tremor-content{fill:#6b7280}.fill-tremor-content-emphasis{fill:#374151}.fill-violet-100{fill:#ede9fe}.fill-violet-200{fill:#ddd6fe}.fill-violet-300{fill:#c4b5fd}.fill-violet-400{fill:#a78bfa}.fill-violet-50{fill:#f5f3ff}.fill-violet-500{fill:#8b5cf6}.fill-violet-600{fill:#7c3aed}.fill-violet-700{fill:#6d28d9}.fill-violet-800{fill:#5b21b6}.fill-violet-900{fill:#4c1d95}.fill-violet-950{fill:#2e1065}.fill-yellow-100{fill:#fef9c3}.fill-yellow-200{fill:#fef08a}.fill-yellow-300{fill:#fde047}.fill-yellow-400{fill:#facc15}.fill-yellow-50{fill:#fefce8}.fill-yellow-500{fill:#eab308}.fill-yellow-600{fill:#ca8a04}.fill-yellow-700{fill:#a16207}.fill-yellow-800{fill:#854d0e}.fill-yellow-900{fill:#713f12}.fill-yellow-950{fill:#422006}.fill-zinc-100{fill:#f4f4f5}.fill-zinc-200{fill:#e4e4e7}.fill-zinc-300{fill:#d4d4d8}.fill-zinc-400{fill:#a1a1aa}.fill-zinc-50{fill:#fafafa}.fill-zinc-500{fill:#71717a}.fill-zinc-600{fill:#52525b}.fill-zinc-700{fill:#3f3f46}.fill-zinc-800{fill:#27272a}.fill-zinc-900{fill:#18181b}.fill-zinc-950{fill:#09090b}.stroke-amber-100{stroke:#fef3c7}.stroke-amber-200{stroke:#fde68a}.stroke-amber-300{stroke:#fcd34d}.stroke-amber-400{stroke:#fbbf24}.stroke-amber-50{stroke:#fffbeb}.stroke-amber-500{stroke:#f59e0b}.stroke-amber-600{stroke:#d97706}.stroke-amber-700{stroke:#b45309}.stroke-amber-800{stroke:#92400e}.stroke-amber-900{stroke:#78350f}.stroke-amber-950{stroke:#451a03}.stroke-blue-100{stroke:#dbeafe}.stroke-blue-200{stroke:#bfdbfe}.stroke-blue-300{stroke:#93c5fd}.stroke-blue-400{stroke:#60a5fa}.stroke-blue-50{stroke:#eff6ff}.stroke-blue-500{stroke:#3b82f6}.stroke-blue-600{stroke:#2563eb}.stroke-blue-700{stroke:#1d4ed8}.stroke-blue-800{stroke:#1e40af}.stroke-blue-900{stroke:#1e3a8a}.stroke-blue-950{stroke:#172554}.stroke-cyan-100{stroke:#cffafe}.stroke-cyan-200{stroke:#a5f3fc}.stroke-cyan-300{stroke:#67e8f9}.stroke-cyan-400{stroke:#22d3ee}.stroke-cyan-50{stroke:#ecfeff}.stroke-cyan-500{stroke:#06b6d4}.stroke-cyan-600{stroke:#0891b2}.stroke-cyan-700{stroke:#0e7490}.stroke-cyan-800{stroke:#155e75}.stroke-cyan-900{stroke:#164e63}.stroke-cyan-950{stroke:#083344}.stroke-dark-tremor-background{stroke:#111827}.stroke-dark-tremor-border{stroke:#374151}.stroke-emerald-100{stroke:#d1fae5}.stroke-emerald-200{stroke:#a7f3d0}.stroke-emerald-300{stroke:#6ee7b7}.stroke-emerald-400{stroke:#34d399}.stroke-emerald-50{stroke:#ecfdf5}.stroke-emerald-500{stroke:#10b981}.stroke-emerald-600{stroke:#059669}.stroke-emerald-700{stroke:#047857}.stroke-emerald-800{stroke:#065f46}.stroke-emerald-900{stroke:#064e3b}.stroke-emerald-950{stroke:#022c22}.stroke-fuchsia-100{stroke:#fae8ff}.stroke-fuchsia-200{stroke:#f5d0fe}.stroke-fuchsia-300{stroke:#f0abfc}.stroke-fuchsia-400{stroke:#e879f9}.stroke-fuchsia-50{stroke:#fdf4ff}.stroke-fuchsia-500{stroke:#d946ef}.stroke-fuchsia-600{stroke:#c026d3}.stroke-fuchsia-700{stroke:#a21caf}.stroke-fuchsia-800{stroke:#86198f}.stroke-fuchsia-900{stroke:#701a75}.stroke-fuchsia-950{stroke:#4a044e}.stroke-gray-100{stroke:#f3f4f6}.stroke-gray-200{stroke:#e5e7eb}.stroke-gray-300{stroke:#d1d5db}.stroke-gray-400{stroke:#9ca3af}.stroke-gray-50{stroke:#f9fafb}.stroke-gray-500{stroke:#6b7280}.stroke-gray-600{stroke:#4b5563}.stroke-gray-700{stroke:#374151}.stroke-gray-800{stroke:#1f2937}.stroke-gray-900{stroke:#111827}.stroke-gray-950{stroke:#030712}.stroke-green-100{stroke:#dcfce7}.stroke-green-200{stroke:#bbf7d0}.stroke-green-300{stroke:#86efac}.stroke-green-400{stroke:#4ade80}.stroke-green-50{stroke:#f0fdf4}.stroke-green-500{stroke:#22c55e}.stroke-green-600{stroke:#16a34a}.stroke-green-700{stroke:#15803d}.stroke-green-800{stroke:#166534}.stroke-green-900{stroke:#14532d}.stroke-green-950{stroke:#052e16}.stroke-indigo-100{stroke:#e0e7ff}.stroke-indigo-200{stroke:#c7d2fe}.stroke-indigo-300{stroke:#a5b4fc}.stroke-indigo-400{stroke:#818cf8}.stroke-indigo-50{stroke:#eef2ff}.stroke-indigo-500{stroke:#6366f1}.stroke-indigo-600{stroke:#4f46e5}.stroke-indigo-700{stroke:#4338ca}.stroke-indigo-800{stroke:#3730a3}.stroke-indigo-900{stroke:#312e81}.stroke-indigo-950{stroke:#1e1b4b}.stroke-lime-100{stroke:#ecfccb}.stroke-lime-200{stroke:#d9f99d}.stroke-lime-300{stroke:#bef264}.stroke-lime-400{stroke:#a3e635}.stroke-lime-50{stroke:#f7fee7}.stroke-lime-500{stroke:#84cc16}.stroke-lime-600{stroke:#65a30d}.stroke-lime-700{stroke:#4d7c0f}.stroke-lime-800{stroke:#3f6212}.stroke-lime-900{stroke:#365314}.stroke-lime-950{stroke:#1a2e05}.stroke-neutral-100{stroke:#f5f5f5}.stroke-neutral-200{stroke:#e5e5e5}.stroke-neutral-300{stroke:#d4d4d4}.stroke-neutral-400{stroke:#a3a3a3}.stroke-neutral-50{stroke:#fafafa}.stroke-neutral-500{stroke:#737373}.stroke-neutral-600{stroke:#525252}.stroke-neutral-700{stroke:#404040}.stroke-neutral-800{stroke:#262626}.stroke-neutral-900{stroke:#171717}.stroke-neutral-950{stroke:#0a0a0a}.stroke-orange-100{stroke:#ffedd5}.stroke-orange-200{stroke:#fed7aa}.stroke-orange-300{stroke:#fdba74}.stroke-orange-400{stroke:#fb923c}.stroke-orange-50{stroke:#fff7ed}.stroke-orange-500{stroke:#f97316}.stroke-orange-600{stroke:#ea580c}.stroke-orange-700{stroke:#c2410c}.stroke-orange-800{stroke:#9a3412}.stroke-orange-900{stroke:#7c2d12}.stroke-orange-950{stroke:#431407}.stroke-pink-100{stroke:#fce7f3}.stroke-pink-200{stroke:#fbcfe8}.stroke-pink-300{stroke:#f9a8d4}.stroke-pink-400{stroke:#f472b6}.stroke-pink-50{stroke:#fdf2f8}.stroke-pink-500{stroke:#ec4899}.stroke-pink-600{stroke:#db2777}.stroke-pink-700{stroke:#be185d}.stroke-pink-800{stroke:#9d174d}.stroke-pink-900{stroke:#831843}.stroke-pink-950{stroke:#500724}.stroke-purple-100{stroke:#f3e8ff}.stroke-purple-200{stroke:#e9d5ff}.stroke-purple-300{stroke:#d8b4fe}.stroke-purple-400{stroke:#c084fc}.stroke-purple-50{stroke:#faf5ff}.stroke-purple-500{stroke:#a855f7}.stroke-purple-600{stroke:#9333ea}.stroke-purple-700{stroke:#7e22ce}.stroke-purple-800{stroke:#6b21a8}.stroke-purple-900{stroke:#581c87}.stroke-purple-950{stroke:#3b0764}.stroke-red-100{stroke:#fee2e2}.stroke-red-200{stroke:#fecaca}.stroke-red-300{stroke:#fca5a5}.stroke-red-400{stroke:#f87171}.stroke-red-50{stroke:#fef2f2}.stroke-red-500{stroke:#ef4444}.stroke-red-600{stroke:#dc2626}.stroke-red-700{stroke:#b91c1c}.stroke-red-800{stroke:#991b1b}.stroke-red-900{stroke:#7f1d1d}.stroke-red-950{stroke:#450a0a}.stroke-rose-100{stroke:#ffe4e6}.stroke-rose-200{stroke:#fecdd3}.stroke-rose-300{stroke:#fda4af}.stroke-rose-400{stroke:#fb7185}.stroke-rose-50{stroke:#fff1f2}.stroke-rose-500{stroke:#f43f5e}.stroke-rose-600{stroke:#e11d48}.stroke-rose-700{stroke:#be123c}.stroke-rose-800{stroke:#9f1239}.stroke-rose-900{stroke:#881337}.stroke-rose-950{stroke:#4c0519}.stroke-sky-100{stroke:#e0f2fe}.stroke-sky-200{stroke:#bae6fd}.stroke-sky-300{stroke:#7dd3fc}.stroke-sky-400{stroke:#38bdf8}.stroke-sky-50{stroke:#f0f9ff}.stroke-sky-500{stroke:#0ea5e9}.stroke-sky-600{stroke:#0284c7}.stroke-sky-700{stroke:#0369a1}.stroke-sky-800{stroke:#075985}.stroke-sky-900{stroke:#0c4a6e}.stroke-sky-950{stroke:#082f49}.stroke-slate-100{stroke:#f1f5f9}.stroke-slate-200{stroke:#e2e8f0}.stroke-slate-300{stroke:#cbd5e1}.stroke-slate-400{stroke:#94a3b8}.stroke-slate-50{stroke:#f8fafc}.stroke-slate-500{stroke:#64748b}.stroke-slate-600{stroke:#475569}.stroke-slate-700{stroke:#334155}.stroke-slate-800{stroke:#1e293b}.stroke-slate-900{stroke:#0f172a}.stroke-slate-950{stroke:#020617}.stroke-stone-100{stroke:#f5f5f4}.stroke-stone-200{stroke:#e7e5e4}.stroke-stone-300{stroke:#d6d3d1}.stroke-stone-400{stroke:#a8a29e}.stroke-stone-50{stroke:#fafaf9}.stroke-stone-500{stroke:#78716c}.stroke-stone-600{stroke:#57534e}.stroke-stone-700{stroke:#44403c}.stroke-stone-800{stroke:#292524}.stroke-stone-900{stroke:#1c1917}.stroke-stone-950{stroke:#0c0a09}.stroke-teal-100{stroke:#ccfbf1}.stroke-teal-200{stroke:#99f6e4}.stroke-teal-300{stroke:#5eead4}.stroke-teal-400{stroke:#2dd4bf}.stroke-teal-50{stroke:#f0fdfa}.stroke-teal-500{stroke:#14b8a6}.stroke-teal-600{stroke:#0d9488}.stroke-teal-700{stroke:#0f766e}.stroke-teal-800{stroke:#115e59}.stroke-teal-900{stroke:#134e4a}.stroke-teal-950{stroke:#042f2e}.stroke-tremor-background{stroke:#fff}.stroke-tremor-border{stroke:#e5e7eb}.stroke-tremor-brand{stroke:#6366f1}.stroke-tremor-brand-muted\/50{stroke:rgba(134,136,239,.5)}.stroke-violet-100{stroke:#ede9fe}.stroke-violet-200{stroke:#ddd6fe}.stroke-violet-300{stroke:#c4b5fd}.stroke-violet-400{stroke:#a78bfa}.stroke-violet-50{stroke:#f5f3ff}.stroke-violet-500{stroke:#8b5cf6}.stroke-violet-600{stroke:#7c3aed}.stroke-violet-700{stroke:#6d28d9}.stroke-violet-800{stroke:#5b21b6}.stroke-violet-900{stroke:#4c1d95}.stroke-violet-950{stroke:#2e1065}.stroke-yellow-100{stroke:#fef9c3}.stroke-yellow-200{stroke:#fef08a}.stroke-yellow-300{stroke:#fde047}.stroke-yellow-400{stroke:#facc15}.stroke-yellow-50{stroke:#fefce8}.stroke-yellow-500{stroke:#eab308}.stroke-yellow-600{stroke:#ca8a04}.stroke-yellow-700{stroke:#a16207}.stroke-yellow-800{stroke:#854d0e}.stroke-yellow-900{stroke:#713f12}.stroke-yellow-950{stroke:#422006}.stroke-zinc-100{stroke:#f4f4f5}.stroke-zinc-200{stroke:#e4e4e7}.stroke-zinc-300{stroke:#d4d4d8}.stroke-zinc-400{stroke:#a1a1aa}.stroke-zinc-50{stroke:#fafafa}.stroke-zinc-500{stroke:#71717a}.stroke-zinc-600{stroke:#52525b}.stroke-zinc-700{stroke:#3f3f46}.stroke-zinc-800{stroke:#27272a}.stroke-zinc-900{stroke:#18181b}.stroke-zinc-950{stroke:#09090b}.stroke-1{stroke-width:1}.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-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.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-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.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-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm,.text-tremor-default{font-size:.875rem;line-height:1.25rem}.text-tremor-label{font-size:.75rem;line-height:.4rem}.text-tremor-metric{font-size:1.875rem;line-height:2.25rem}.text-tremor-title{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.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-6{line-height:1.5rem}.text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-dark-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-dark-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-dark-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-dark-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-dark-tremor-content-subtle{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.text-inherit{color:inherit}.text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-tremor-brand-emphasis{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.text-tremor-brand-inverted{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-tremor-content{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-tremor-content-subtle{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.accent-dark-tremor-brand,.accent-tremor-brand{accent-color:#6366f1}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow,.shadow-dark-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-dark-tremor-card,.shadow-dark-tremor-input{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-dark-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-card{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-tremor-card,.shadow-tremor-dropdown{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-tremor-dropdown{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-tremor-input,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.outline-tremor-brand{outline-color:#6366f1}.ring{--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(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--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)}.ring-2{--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)}.ring-amber-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 243 199/var(--tw-ring-opacity))}.ring-amber-200{--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity))}.ring-amber-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 211 77/var(--tw-ring-opacity))}.ring-amber-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity))}.ring-amber-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 251 235/var(--tw-ring-opacity))}.ring-amber-500{--tw-ring-opacity:1;--tw-ring-color:rgb(245 158 11/var(--tw-ring-opacity))}.ring-amber-600{--tw-ring-opacity:1;--tw-ring-color:rgb(217 119 6/var(--tw-ring-opacity))}.ring-amber-700{--tw-ring-opacity:1;--tw-ring-color:rgb(180 83 9/var(--tw-ring-opacity))}.ring-amber-800{--tw-ring-opacity:1;--tw-ring-color:rgb(146 64 14/var(--tw-ring-opacity))}.ring-amber-900{--tw-ring-opacity:1;--tw-ring-color:rgb(120 53 15/var(--tw-ring-opacity))}.ring-amber-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 26 3/var(--tw-ring-opacity))}.ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgb(219 234 254/var(--tw-ring-opacity))}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgb(191 219 254/var(--tw-ring-opacity))}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgb(96 165 250/var(--tw-ring-opacity))}.ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgb(239 246 255/var(--tw-ring-opacity))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity))}.ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgb(29 78 216/var(--tw-ring-opacity))}.ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 64 175/var(--tw-ring-opacity))}.ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgb(30 58 138/var(--tw-ring-opacity))}.ring-blue-950{--tw-ring-opacity:1;--tw-ring-color:rgb(23 37 84/var(--tw-ring-opacity))}.ring-cyan-100{--tw-ring-opacity:1;--tw-ring-color:rgb(207 250 254/var(--tw-ring-opacity))}.ring-cyan-200{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity))}.ring-cyan-300{--tw-ring-opacity:1;--tw-ring-color:rgb(103 232 249/var(--tw-ring-opacity))}.ring-cyan-400{--tw-ring-opacity:1;--tw-ring-color:rgb(34 211 238/var(--tw-ring-opacity))}.ring-cyan-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 254 255/var(--tw-ring-opacity))}.ring-cyan-500{--tw-ring-opacity:1;--tw-ring-color:rgb(6 182 212/var(--tw-ring-opacity))}.ring-cyan-600{--tw-ring-opacity:1;--tw-ring-color:rgb(8 145 178/var(--tw-ring-opacity))}.ring-cyan-700{--tw-ring-opacity:1;--tw-ring-color:rgb(14 116 144/var(--tw-ring-opacity))}.ring-cyan-800{--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity))}.ring-cyan-900{--tw-ring-opacity:1;--tw-ring-color:rgb(22 78 99/var(--tw-ring-opacity))}.ring-cyan-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 51 68/var(--tw-ring-opacity))}.ring-dark-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-emerald-100{--tw-ring-opacity:1;--tw-ring-color:rgb(209 250 229/var(--tw-ring-opacity))}.ring-emerald-200{--tw-ring-opacity:1;--tw-ring-color:rgb(167 243 208/var(--tw-ring-opacity))}.ring-emerald-300{--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity))}.ring-emerald-400{--tw-ring-opacity:1;--tw-ring-color:rgb(52 211 153/var(--tw-ring-opacity))}.ring-emerald-50{--tw-ring-opacity:1;--tw-ring-color:rgb(236 253 245/var(--tw-ring-opacity))}.ring-emerald-500{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity))}.ring-emerald-600{--tw-ring-opacity:1;--tw-ring-color:rgb(5 150 105/var(--tw-ring-opacity))}.ring-emerald-700{--tw-ring-opacity:1;--tw-ring-color:rgb(4 120 87/var(--tw-ring-opacity))}.ring-emerald-800{--tw-ring-opacity:1;--tw-ring-color:rgb(6 95 70/var(--tw-ring-opacity))}.ring-emerald-900{--tw-ring-opacity:1;--tw-ring-color:rgb(6 78 59/var(--tw-ring-opacity))}.ring-emerald-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 44 34/var(--tw-ring-opacity))}.ring-fuchsia-100{--tw-ring-opacity:1;--tw-ring-color:rgb(250 232 255/var(--tw-ring-opacity))}.ring-fuchsia-200{--tw-ring-opacity:1;--tw-ring-color:rgb(245 208 254/var(--tw-ring-opacity))}.ring-fuchsia-300{--tw-ring-opacity:1;--tw-ring-color:rgb(240 171 252/var(--tw-ring-opacity))}.ring-fuchsia-400{--tw-ring-opacity:1;--tw-ring-color:rgb(232 121 249/var(--tw-ring-opacity))}.ring-fuchsia-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 244 255/var(--tw-ring-opacity))}.ring-fuchsia-500{--tw-ring-opacity:1;--tw-ring-color:rgb(217 70 239/var(--tw-ring-opacity))}.ring-fuchsia-600{--tw-ring-opacity:1;--tw-ring-color:rgb(192 38 211/var(--tw-ring-opacity))}.ring-fuchsia-700{--tw-ring-opacity:1;--tw-ring-color:rgb(162 28 175/var(--tw-ring-opacity))}.ring-fuchsia-800{--tw-ring-opacity:1;--tw-ring-color:rgb(134 25 143/var(--tw-ring-opacity))}.ring-fuchsia-900{--tw-ring-opacity:1;--tw-ring-color:rgb(112 26 117/var(--tw-ring-opacity))}.ring-fuchsia-950{--tw-ring-opacity:1;--tw-ring-color:rgb(74 4 78/var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 244 246/var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgb(249 250 251/var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81/var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgb(17 24 39/var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgb(3 7 18/var(--tw-ring-opacity))}.ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgb(220 252 231/var(--tw-ring-opacity))}.ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgb(187 247 208/var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(134 239 172/var(--tw-ring-opacity))}.ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgb(74 222 128/var(--tw-ring-opacity))}.ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 244/var(--tw-ring-opacity))}.ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgb(22 163 74/var(--tw-ring-opacity))}.ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgb(21 128 61/var(--tw-ring-opacity))}.ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgb(22 101 52/var(--tw-ring-opacity))}.ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgb(20 83 45/var(--tw-ring-opacity))}.ring-green-950{--tw-ring-opacity:1;--tw-ring-color:rgb(5 46 22/var(--tw-ring-opacity))}.ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 231 255/var(--tw-ring-opacity))}.ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgb(199 210 254/var(--tw-ring-opacity))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgb(165 180 252/var(--tw-ring-opacity))}.ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgb(129 140 248/var(--tw-ring-opacity))}.ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgb(238 242 255/var(--tw-ring-opacity))}.ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgb(79 70 229/var(--tw-ring-opacity))}.ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgb(67 56 202/var(--tw-ring-opacity))}.ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgb(55 48 163/var(--tw-ring-opacity))}.ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgb(49 46 129/var(--tw-ring-opacity))}.ring-indigo-950{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}.ring-lime-100{--tw-ring-opacity:1;--tw-ring-color:rgb(236 252 203/var(--tw-ring-opacity))}.ring-lime-200{--tw-ring-opacity:1;--tw-ring-color:rgb(217 249 157/var(--tw-ring-opacity))}.ring-lime-300{--tw-ring-opacity:1;--tw-ring-color:rgb(190 242 100/var(--tw-ring-opacity))}.ring-lime-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 230 53/var(--tw-ring-opacity))}.ring-lime-50{--tw-ring-opacity:1;--tw-ring-color:rgb(247 254 231/var(--tw-ring-opacity))}.ring-lime-500{--tw-ring-opacity:1;--tw-ring-color:rgb(132 204 22/var(--tw-ring-opacity))}.ring-lime-600{--tw-ring-opacity:1;--tw-ring-color:rgb(101 163 13/var(--tw-ring-opacity))}.ring-lime-700{--tw-ring-opacity:1;--tw-ring-color:rgb(77 124 15/var(--tw-ring-opacity))}.ring-lime-800{--tw-ring-opacity:1;--tw-ring-color:rgb(63 98 18/var(--tw-ring-opacity))}.ring-lime-900{--tw-ring-opacity:1;--tw-ring-color:rgb(54 83 20/var(--tw-ring-opacity))}.ring-lime-950{--tw-ring-opacity:1;--tw-ring-color:rgb(26 46 5/var(--tw-ring-opacity))}.ring-neutral-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 245/var(--tw-ring-opacity))}.ring-neutral-200{--tw-ring-opacity:1;--tw-ring-color:rgb(229 229 229/var(--tw-ring-opacity))}.ring-neutral-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 212/var(--tw-ring-opacity))}.ring-neutral-400{--tw-ring-opacity:1;--tw-ring-color:rgb(163 163 163/var(--tw-ring-opacity))}.ring-neutral-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-neutral-500{--tw-ring-opacity:1;--tw-ring-color:rgb(115 115 115/var(--tw-ring-opacity))}.ring-neutral-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 82/var(--tw-ring-opacity))}.ring-neutral-700{--tw-ring-opacity:1;--tw-ring-color:rgb(64 64 64/var(--tw-ring-opacity))}.ring-neutral-800{--tw-ring-opacity:1;--tw-ring-color:rgb(38 38 38/var(--tw-ring-opacity))}.ring-neutral-900{--tw-ring-opacity:1;--tw-ring-color:rgb(23 23 23/var(--tw-ring-opacity))}.ring-neutral-950{--tw-ring-opacity:1;--tw-ring-color:rgb(10 10 10/var(--tw-ring-opacity))}.ring-orange-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 237 213/var(--tw-ring-opacity))}.ring-orange-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 215 170/var(--tw-ring-opacity))}.ring-orange-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 186 116/var(--tw-ring-opacity))}.ring-orange-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 146 60/var(--tw-ring-opacity))}.ring-orange-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 247 237/var(--tw-ring-opacity))}.ring-orange-500{--tw-ring-opacity:1;--tw-ring-color:rgb(249 115 22/var(--tw-ring-opacity))}.ring-orange-600{--tw-ring-opacity:1;--tw-ring-color:rgb(234 88 12/var(--tw-ring-opacity))}.ring-orange-700{--tw-ring-opacity:1;--tw-ring-color:rgb(194 65 12/var(--tw-ring-opacity))}.ring-orange-800{--tw-ring-opacity:1;--tw-ring-color:rgb(154 52 18/var(--tw-ring-opacity))}.ring-orange-900{--tw-ring-opacity:1;--tw-ring-color:rgb(124 45 18/var(--tw-ring-opacity))}.ring-orange-950{--tw-ring-opacity:1;--tw-ring-color:rgb(67 20 7/var(--tw-ring-opacity))}.ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgb(252 231 243/var(--tw-ring-opacity))}.ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgb(251 207 232/var(--tw-ring-opacity))}.ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgb(249 168 212/var(--tw-ring-opacity))}.ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgb(244 114 182/var(--tw-ring-opacity))}.ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgb(253 242 248/var(--tw-ring-opacity))}.ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgb(236 72 153/var(--tw-ring-opacity))}.ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgb(219 39 119/var(--tw-ring-opacity))}.ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 24 93/var(--tw-ring-opacity))}.ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgb(157 23 77/var(--tw-ring-opacity))}.ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgb(131 24 67/var(--tw-ring-opacity))}.ring-pink-950{--tw-ring-opacity:1;--tw-ring-color:rgb(80 7 36/var(--tw-ring-opacity))}.ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgb(243 232 255/var(--tw-ring-opacity))}.ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgb(233 213 255/var(--tw-ring-opacity))}.ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgb(216 180 254/var(--tw-ring-opacity))}.ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgb(192 132 252/var(--tw-ring-opacity))}.ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 245 255/var(--tw-ring-opacity))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgb(168 85 247/var(--tw-ring-opacity))}.ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgb(147 51 234/var(--tw-ring-opacity))}.ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgb(126 34 206/var(--tw-ring-opacity))}.ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgb(107 33 168/var(--tw-ring-opacity))}.ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgb(88 28 135/var(--tw-ring-opacity))}.ring-purple-950{--tw-ring-opacity:1;--tw-ring-color:rgb(59 7 100/var(--tw-ring-opacity))}.ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 226 226/var(--tw-ring-opacity))}.ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 202 202/var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(252 165 165/var(--tw-ring-opacity))}.ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgb(248 113 113/var(--tw-ring-opacity))}.ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 242 242/var(--tw-ring-opacity))}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgb(220 38 38/var(--tw-ring-opacity))}.ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgb(185 28 28/var(--tw-ring-opacity))}.ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgb(153 27 27/var(--tw-ring-opacity))}.ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgb(127 29 29/var(--tw-ring-opacity))}.ring-red-950{--tw-ring-opacity:1;--tw-ring-color:rgb(69 10 10/var(--tw-ring-opacity))}.ring-rose-100{--tw-ring-opacity:1;--tw-ring-color:rgb(255 228 230/var(--tw-ring-opacity))}.ring-rose-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 205 211/var(--tw-ring-opacity))}.ring-rose-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 164 175/var(--tw-ring-opacity))}.ring-rose-400{--tw-ring-opacity:1;--tw-ring-color:rgb(251 113 133/var(--tw-ring-opacity))}.ring-rose-50{--tw-ring-opacity:1;--tw-ring-color:rgb(255 241 242/var(--tw-ring-opacity))}.ring-rose-500{--tw-ring-opacity:1;--tw-ring-color:rgb(244 63 94/var(--tw-ring-opacity))}.ring-rose-600{--tw-ring-opacity:1;--tw-ring-color:rgb(225 29 72/var(--tw-ring-opacity))}.ring-rose-700{--tw-ring-opacity:1;--tw-ring-color:rgb(190 18 60/var(--tw-ring-opacity))}.ring-rose-800{--tw-ring-opacity:1;--tw-ring-color:rgb(159 18 57/var(--tw-ring-opacity))}.ring-rose-900{--tw-ring-opacity:1;--tw-ring-color:rgb(136 19 55/var(--tw-ring-opacity))}.ring-rose-950{--tw-ring-opacity:1;--tw-ring-color:rgb(76 5 25/var(--tw-ring-opacity))}.ring-sky-100{--tw-ring-opacity:1;--tw-ring-color:rgb(224 242 254/var(--tw-ring-opacity))}.ring-sky-200{--tw-ring-opacity:1;--tw-ring-color:rgb(186 230 253/var(--tw-ring-opacity))}.ring-sky-300{--tw-ring-opacity:1;--tw-ring-color:rgb(125 211 252/var(--tw-ring-opacity))}.ring-sky-400{--tw-ring-opacity:1;--tw-ring-color:rgb(56 189 248/var(--tw-ring-opacity))}.ring-sky-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 249 255/var(--tw-ring-opacity))}.ring-sky-500{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.ring-sky-600{--tw-ring-opacity:1;--tw-ring-color:rgb(2 132 199/var(--tw-ring-opacity))}.ring-sky-700{--tw-ring-opacity:1;--tw-ring-color:rgb(3 105 161/var(--tw-ring-opacity))}.ring-sky-800{--tw-ring-opacity:1;--tw-ring-color:rgb(7 89 133/var(--tw-ring-opacity))}.ring-sky-900{--tw-ring-opacity:1;--tw-ring-color:rgb(12 74 110/var(--tw-ring-opacity))}.ring-sky-950{--tw-ring-opacity:1;--tw-ring-color:rgb(8 47 73/var(--tw-ring-opacity))}.ring-slate-100{--tw-ring-opacity:1;--tw-ring-color:rgb(241 245 249/var(--tw-ring-opacity))}.ring-slate-200{--tw-ring-opacity:1;--tw-ring-color:rgb(226 232 240/var(--tw-ring-opacity))}.ring-slate-300{--tw-ring-opacity:1;--tw-ring-color:rgb(203 213 225/var(--tw-ring-opacity))}.ring-slate-400{--tw-ring-opacity:1;--tw-ring-color:rgb(148 163 184/var(--tw-ring-opacity))}.ring-slate-50{--tw-ring-opacity:1;--tw-ring-color:rgb(248 250 252/var(--tw-ring-opacity))}.ring-slate-500{--tw-ring-opacity:1;--tw-ring-color:rgb(100 116 139/var(--tw-ring-opacity))}.ring-slate-600{--tw-ring-opacity:1;--tw-ring-color:rgb(71 85 105/var(--tw-ring-opacity))}.ring-slate-700{--tw-ring-opacity:1;--tw-ring-color:rgb(51 65 85/var(--tw-ring-opacity))}.ring-slate-800{--tw-ring-opacity:1;--tw-ring-color:rgb(30 41 59/var(--tw-ring-opacity))}.ring-slate-900{--tw-ring-opacity:1;--tw-ring-color:rgb(15 23 42/var(--tw-ring-opacity))}.ring-slate-950{--tw-ring-opacity:1;--tw-ring-color:rgb(2 6 23/var(--tw-ring-opacity))}.ring-stone-100{--tw-ring-opacity:1;--tw-ring-color:rgb(245 245 244/var(--tw-ring-opacity))}.ring-stone-200{--tw-ring-opacity:1;--tw-ring-color:rgb(231 229 228/var(--tw-ring-opacity))}.ring-stone-300{--tw-ring-opacity:1;--tw-ring-color:rgb(214 211 209/var(--tw-ring-opacity))}.ring-stone-400{--tw-ring-opacity:1;--tw-ring-color:rgb(168 162 158/var(--tw-ring-opacity))}.ring-stone-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 249/var(--tw-ring-opacity))}.ring-stone-500{--tw-ring-opacity:1;--tw-ring-color:rgb(120 113 108/var(--tw-ring-opacity))}.ring-stone-600{--tw-ring-opacity:1;--tw-ring-color:rgb(87 83 78/var(--tw-ring-opacity))}.ring-stone-700{--tw-ring-opacity:1;--tw-ring-color:rgb(68 64 60/var(--tw-ring-opacity))}.ring-stone-800{--tw-ring-opacity:1;--tw-ring-color:rgb(41 37 36/var(--tw-ring-opacity))}.ring-stone-900{--tw-ring-opacity:1;--tw-ring-color:rgb(28 25 23/var(--tw-ring-opacity))}.ring-stone-950{--tw-ring-opacity:1;--tw-ring-color:rgb(12 10 9/var(--tw-ring-opacity))}.ring-teal-100{--tw-ring-opacity:1;--tw-ring-color:rgb(204 251 241/var(--tw-ring-opacity))}.ring-teal-200{--tw-ring-opacity:1;--tw-ring-color:rgb(153 246 228/var(--tw-ring-opacity))}.ring-teal-300{--tw-ring-opacity:1;--tw-ring-color:rgb(94 234 212/var(--tw-ring-opacity))}.ring-teal-400{--tw-ring-opacity:1;--tw-ring-color:rgb(45 212 191/var(--tw-ring-opacity))}.ring-teal-50{--tw-ring-opacity:1;--tw-ring-color:rgb(240 253 250/var(--tw-ring-opacity))}.ring-teal-500{--tw-ring-opacity:1;--tw-ring-color:rgb(20 184 166/var(--tw-ring-opacity))}.ring-teal-600{--tw-ring-opacity:1;--tw-ring-color:rgb(13 148 136/var(--tw-ring-opacity))}.ring-teal-700{--tw-ring-opacity:1;--tw-ring-color:rgb(15 118 110/var(--tw-ring-opacity))}.ring-teal-800{--tw-ring-opacity:1;--tw-ring-color:rgb(17 94 89/var(--tw-ring-opacity))}.ring-teal-900{--tw-ring-opacity:1;--tw-ring-color:rgb(19 78 74/var(--tw-ring-opacity))}.ring-teal-950{--tw-ring-opacity:1;--tw-ring-color:rgb(4 47 46/var(--tw-ring-opacity))}.ring-tremor-brand-inverted{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-tremor-brand-muted{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.ring-tremor-ring{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.ring-violet-100{--tw-ring-opacity:1;--tw-ring-color:rgb(237 233 254/var(--tw-ring-opacity))}.ring-violet-200{--tw-ring-opacity:1;--tw-ring-color:rgb(221 214 254/var(--tw-ring-opacity))}.ring-violet-300{--tw-ring-opacity:1;--tw-ring-color:rgb(196 181 253/var(--tw-ring-opacity))}.ring-violet-400{--tw-ring-opacity:1;--tw-ring-color:rgb(167 139 250/var(--tw-ring-opacity))}.ring-violet-50{--tw-ring-opacity:1;--tw-ring-color:rgb(245 243 255/var(--tw-ring-opacity))}.ring-violet-500{--tw-ring-opacity:1;--tw-ring-color:rgb(139 92 246/var(--tw-ring-opacity))}.ring-violet-600{--tw-ring-opacity:1;--tw-ring-color:rgb(124 58 237/var(--tw-ring-opacity))}.ring-violet-700{--tw-ring-opacity:1;--tw-ring-color:rgb(109 40 217/var(--tw-ring-opacity))}.ring-violet-800{--tw-ring-opacity:1;--tw-ring-color:rgb(91 33 182/var(--tw-ring-opacity))}.ring-violet-900{--tw-ring-opacity:1;--tw-ring-color:rgb(76 29 149/var(--tw-ring-opacity))}.ring-violet-950{--tw-ring-opacity:1;--tw-ring-color:rgb(46 16 101/var(--tw-ring-opacity))}.ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgb(254 249 195/var(--tw-ring-opacity))}.ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgb(254 240 138/var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 224 71/var(--tw-ring-opacity))}.ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgb(250 204 21/var(--tw-ring-opacity))}.ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgb(254 252 232/var(--tw-ring-opacity))}.ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgb(234 179 8/var(--tw-ring-opacity))}.ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgb(202 138 4/var(--tw-ring-opacity))}.ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgb(161 98 7/var(--tw-ring-opacity))}.ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgb(133 77 14/var(--tw-ring-opacity))}.ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgb(113 63 18/var(--tw-ring-opacity))}.ring-yellow-950{--tw-ring-opacity:1;--tw-ring-color:rgb(66 32 6/var(--tw-ring-opacity))}.ring-zinc-100{--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity))}.ring-zinc-200{--tw-ring-opacity:1;--tw-ring-color:rgb(228 228 231/var(--tw-ring-opacity))}.ring-zinc-300{--tw-ring-opacity:1;--tw-ring-color:rgb(212 212 216/var(--tw-ring-opacity))}.ring-zinc-400{--tw-ring-opacity:1;--tw-ring-color:rgb(161 161 170/var(--tw-ring-opacity))}.ring-zinc-50{--tw-ring-opacity:1;--tw-ring-color:rgb(250 250 250/var(--tw-ring-opacity))}.ring-zinc-500{--tw-ring-opacity:1;--tw-ring-color:rgb(113 113 122/var(--tw-ring-opacity))}.ring-zinc-600{--tw-ring-opacity:1;--tw-ring-color:rgb(82 82 91/var(--tw-ring-opacity))}.ring-zinc-700{--tw-ring-opacity:1;--tw-ring-color:rgb(63 63 70/var(--tw-ring-opacity))}.ring-zinc-800{--tw-ring-opacity:1;--tw-ring-color:rgb(39 39 42/var(--tw-ring-opacity))}.ring-zinc-900{--tw-ring-opacity:1;--tw-ring-color:rgb(24 24 27/var(--tw-ring-opacity))}.ring-zinc-950{--tw-ring-opacity:1;--tw-ring-color:rgb(9 9 11/var(--tw-ring-opacity))}.ring-opacity-40{--tw-ring-opacity:0.4}.blur{--tw-blur:blur(8px)}.blur,.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[appearance\:textfield\]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.\[scrollbar-width\:none\]{scrollbar-width:none}:root{--foreground-rgb:0,0,0;--background-start-rgb:255,255,255;--background-end-rgb:255,255,255}body{color:rgb(var(--foreground-rgb));background:linear-gradient(to bottom,transparent,rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb))}.placeholder\:text-tremor-content::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.placeholder\:text-tremor-content-subtle::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.first\:rounded-l-\[4px\]:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.last\:rounded-r-\[4px\]:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}.focus-within\:relative:focus-within{position:relative}.hover\:border-b-2:hover{border-bottom-width:2px}.hover\:border-amber-100:hover{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.hover\:border-amber-200:hover{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.hover\:border-amber-300:hover{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.hover\:border-amber-400:hover{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.hover\:border-amber-50:hover{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.hover\:border-amber-500:hover{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.hover\:border-amber-600:hover{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.hover\:border-amber-700:hover{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.hover\:border-amber-800:hover{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.hover\:border-amber-900:hover{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.hover\:border-amber-950:hover{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.hover\:border-blue-950:hover{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.hover\:border-cyan-100:hover{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.hover\:border-cyan-200:hover{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.hover\:border-cyan-300:hover{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.hover\:border-cyan-400:hover{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.hover\:border-cyan-50:hover{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.hover\:border-cyan-500:hover{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.hover\:border-cyan-600:hover{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.hover\:border-cyan-700:hover{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.hover\:border-cyan-800:hover{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.hover\:border-cyan-900:hover{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.hover\:border-cyan-950:hover{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.hover\:border-emerald-100:hover{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.hover\:border-emerald-200:hover{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.hover\:border-emerald-300:hover{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.hover\:border-emerald-400:hover{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.hover\:border-emerald-50:hover{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.hover\:border-emerald-500:hover{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.hover\:border-emerald-600:hover{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.hover\:border-emerald-700:hover{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.hover\:border-emerald-800:hover{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.hover\:border-emerald-900:hover{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.hover\:border-emerald-950:hover{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.hover\:border-fuchsia-100:hover{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.hover\:border-fuchsia-200:hover{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.hover\:border-fuchsia-300:hover{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.hover\:border-fuchsia-400:hover{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.hover\:border-fuchsia-50:hover{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.hover\:border-fuchsia-500:hover{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.hover\:border-fuchsia-600:hover{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.hover\:border-fuchsia-700:hover{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.hover\:border-fuchsia-800:hover{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.hover\:border-fuchsia-900:hover{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.hover\:border-fuchsia-950:hover{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.hover\:border-gray-950:hover{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.hover\:border-green-950:hover{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.hover\:border-indigo-950:hover{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.hover\:border-lime-100:hover{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.hover\:border-lime-200:hover{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.hover\:border-lime-300:hover{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.hover\:border-lime-400:hover{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.hover\:border-lime-50:hover{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.hover\:border-lime-500:hover{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.hover\:border-lime-600:hover{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.hover\:border-lime-700:hover{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.hover\:border-lime-800:hover{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.hover\:border-lime-900:hover{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.hover\:border-lime-950:hover{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.hover\:border-neutral-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.hover\:border-neutral-200:hover{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.hover\:border-neutral-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.hover\:border-neutral-400:hover{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.hover\:border-neutral-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-neutral-500:hover{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.hover\:border-neutral-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.hover\:border-neutral-700:hover{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.hover\:border-neutral-800:hover{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.hover\:border-neutral-900:hover{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.hover\:border-neutral-950:hover{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.hover\:border-orange-100:hover{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.hover\:border-orange-200:hover{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.hover\:border-orange-300:hover{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.hover\:border-orange-400:hover{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.hover\:border-orange-50:hover{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.hover\:border-orange-500:hover{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.hover\:border-orange-600:hover{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.hover\:border-orange-700:hover{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.hover\:border-orange-800:hover{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.hover\:border-orange-900:hover{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.hover\:border-orange-950:hover{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.hover\:border-pink-950:hover{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.hover\:border-purple-950:hover{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.hover\:border-red-950:hover{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.hover\:border-rose-100:hover{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.hover\:border-rose-200:hover{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.hover\:border-rose-300:hover{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.hover\:border-rose-400:hover{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.hover\:border-rose-50:hover{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.hover\:border-rose-500:hover{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.hover\:border-rose-600:hover{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.hover\:border-rose-700:hover{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.hover\:border-rose-800:hover{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.hover\:border-rose-900:hover{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.hover\:border-rose-950:hover{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.hover\:border-sky-100:hover{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.hover\:border-sky-200:hover{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.hover\:border-sky-300:hover{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.hover\:border-sky-400:hover{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.hover\:border-sky-50:hover{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.hover\:border-sky-500:hover{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.hover\:border-sky-600:hover{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.hover\:border-sky-700:hover{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.hover\:border-sky-800:hover{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.hover\:border-sky-900:hover{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.hover\:border-sky-950:hover{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.hover\:border-slate-100:hover{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.hover\:border-slate-200:hover{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.hover\:border-slate-300:hover{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.hover\:border-slate-400:hover{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.hover\:border-slate-50:hover{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.hover\:border-slate-500:hover{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.hover\:border-slate-600:hover{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.hover\:border-slate-700:hover{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.hover\:border-slate-800:hover{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.hover\:border-slate-900:hover{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.hover\:border-slate-950:hover{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.hover\:border-stone-100:hover{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.hover\:border-stone-200:hover{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.hover\:border-stone-300:hover{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.hover\:border-stone-400:hover{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.hover\:border-stone-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.hover\:border-stone-500:hover{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.hover\:border-stone-600:hover{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.hover\:border-stone-700:hover{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.hover\:border-stone-800:hover{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.hover\:border-stone-900:hover{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.hover\:border-stone-950:hover{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.hover\:border-teal-100:hover{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.hover\:border-teal-200:hover{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.hover\:border-teal-300:hover{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.hover\:border-teal-400:hover{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.hover\:border-teal-50:hover{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.hover\:border-teal-500:hover{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.hover\:border-teal-600:hover{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.hover\:border-teal-700:hover{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.hover\:border-teal-800:hover{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.hover\:border-teal-900:hover{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.hover\:border-teal-950:hover{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.hover\:border-tremor-brand-emphasis:hover{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.hover\:border-tremor-content:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:border-violet-100:hover{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.hover\:border-violet-200:hover{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.hover\:border-violet-300:hover{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.hover\:border-violet-400:hover{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.hover\:border-violet-50:hover{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.hover\:border-violet-500:hover{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.hover\:border-violet-600:hover{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.hover\:border-violet-700:hover{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.hover\:border-violet-800:hover{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.hover\:border-violet-900:hover{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.hover\:border-violet-950:hover{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.hover\:border-yellow-950:hover{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.hover\:border-zinc-100:hover{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.hover\:border-zinc-200:hover{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.hover\:border-zinc-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.hover\:border-zinc-400:hover{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.hover\:border-zinc-50:hover{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.hover\:border-zinc-500:hover{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.hover\:border-zinc-600:hover{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.hover\:border-zinc-700:hover{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.hover\:border-zinc-800:hover{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.hover\:border-zinc-900:hover{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.hover\:border-zinc-950:hover{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.hover\:bg-amber-100:hover{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.hover\:bg-amber-200:hover{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.hover\:bg-amber-300:hover{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.hover\:bg-amber-400:hover{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.hover\:bg-amber-50:hover{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.hover\:bg-amber-500:hover{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.hover\:bg-amber-600:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.hover\:bg-amber-700:hover{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.hover\:bg-amber-800:hover{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.hover\:bg-amber-900:hover{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.hover\:bg-amber-950:hover{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.hover\:bg-blue-950:hover{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.hover\:bg-cyan-100:hover{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.hover\:bg-cyan-200:hover{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.hover\:bg-cyan-300:hover{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.hover\:bg-cyan-400:hover{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.hover\:bg-cyan-50:hover{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.hover\:bg-cyan-500:hover{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.hover\:bg-cyan-600:hover{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.hover\:bg-cyan-700:hover{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.hover\:bg-cyan-800:hover{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.hover\:bg-cyan-900:hover{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.hover\:bg-cyan-950:hover{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.hover\:bg-emerald-100:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.hover\:bg-emerald-200:hover{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.hover\:bg-emerald-300:hover{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.hover\:bg-emerald-400:hover{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.hover\:bg-emerald-50:hover{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.hover\:bg-emerald-500:hover{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.hover\:bg-emerald-800:hover{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.hover\:bg-emerald-900:hover{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.hover\:bg-emerald-950:hover{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.hover\:bg-fuchsia-100:hover{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-200:hover{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.hover\:bg-fuchsia-300:hover{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.hover\:bg-fuchsia-400:hover{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.hover\:bg-fuchsia-50:hover{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.hover\:bg-fuchsia-500:hover{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.hover\:bg-fuchsia-600:hover{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.hover\:bg-fuchsia-700:hover{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.hover\:bg-fuchsia-800:hover{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.hover\:bg-fuchsia-900:hover{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.hover\:bg-fuchsia-950:hover{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.hover\:bg-gray-950:hover{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.hover\:bg-green-950:hover{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.hover\:bg-indigo-950:hover{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.hover\:bg-lime-100:hover{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.hover\:bg-lime-200:hover{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.hover\:bg-lime-300:hover{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.hover\:bg-lime-400:hover{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.hover\:bg-lime-50:hover{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.hover\:bg-lime-500:hover{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.hover\:bg-lime-600:hover{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.hover\:bg-lime-700:hover{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.hover\:bg-lime-800:hover{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.hover\:bg-lime-900:hover{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.hover\:bg-lime-950:hover{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.hover\:bg-neutral-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.hover\:bg-neutral-200:hover{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.hover\:bg-neutral-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.hover\:bg-neutral-400:hover{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.hover\:bg-neutral-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-neutral-500:hover{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.hover\:bg-neutral-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.hover\:bg-neutral-700:hover{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.hover\:bg-neutral-800:hover{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.hover\:bg-neutral-900:hover{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.hover\:bg-neutral-950:hover{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.hover\:bg-orange-100:hover{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.hover\:bg-orange-200:hover{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.hover\:bg-orange-300:hover{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.hover\:bg-orange-400:hover{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.hover\:bg-orange-50:hover{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.hover\:bg-orange-500:hover{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.hover\:bg-orange-800:hover{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.hover\:bg-orange-900:hover{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.hover\:bg-orange-950:hover{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.hover\:bg-pink-950:hover{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.hover\:bg-purple-950:hover{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.hover\:bg-red-950:hover{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.hover\:bg-rose-100:hover{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.hover\:bg-rose-200:hover{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.hover\:bg-rose-300:hover{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.hover\:bg-rose-400:hover{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.hover\:bg-rose-50:hover{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.hover\:bg-rose-500:hover{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.hover\:bg-rose-600:hover{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.hover\:bg-rose-700:hover{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.hover\:bg-rose-800:hover{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.hover\:bg-rose-900:hover{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.hover\:bg-rose-950:hover{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.hover\:bg-sky-100:hover{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.hover\:bg-sky-200:hover{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.hover\:bg-sky-300:hover{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.hover\:bg-sky-400:hover{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.hover\:bg-sky-50:hover{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.hover\:bg-sky-500:hover{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.hover\:bg-sky-600:hover{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.hover\:bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.hover\:bg-sky-800:hover{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.hover\:bg-sky-900:hover{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.hover\:bg-sky-950:hover{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.hover\:bg-slate-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-slate-300:hover{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.hover\:bg-slate-400:hover{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.hover\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\:bg-slate-500:hover{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.hover\:bg-slate-600:hover{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.hover\:bg-slate-700:hover{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.hover\:bg-slate-800:hover{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.hover\:bg-slate-900:hover{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.hover\:bg-slate-950:hover{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.hover\:bg-stone-100:hover{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.hover\:bg-stone-200:hover{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.hover\:bg-stone-300:hover{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.hover\:bg-stone-400:hover{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.hover\:bg-stone-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.hover\:bg-stone-500:hover{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.hover\:bg-stone-600:hover{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.hover\:bg-stone-700:hover{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.hover\:bg-stone-800:hover{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.hover\:bg-stone-900:hover{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.hover\:bg-stone-950:hover{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.hover\:bg-teal-100:hover{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.hover\:bg-teal-200:hover{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.hover\:bg-teal-300:hover{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.hover\:bg-teal-400:hover{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.hover\:bg-teal-500:hover{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.hover\:bg-teal-700:hover{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.hover\:bg-teal-800:hover{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.hover\:bg-teal-900:hover{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.hover\:bg-teal-950:hover{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.hover\:bg-tremor-background-muted:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-tremor-background-subtle:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-emphasis:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.hover\:bg-tremor-brand-faint:hover{--tw-bg-opacity:1;background-color:rgb(108 111 237/var(--tw-bg-opacity))}.hover\:bg-violet-100:hover{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.hover\:bg-violet-200:hover{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.hover\:bg-violet-300:hover{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.hover\:bg-violet-400:hover{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.hover\:bg-violet-50:hover{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.hover\:bg-violet-500:hover{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.hover\:bg-violet-600:hover{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.hover\:bg-violet-700:hover{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.hover\:bg-violet-800:hover{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.hover\:bg-violet-900:hover{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.hover\:bg-violet-950:hover{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.hover\:bg-yellow-950:hover{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.hover\:bg-zinc-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.hover\:bg-zinc-200:hover{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.hover\:bg-zinc-300:hover{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.hover\:bg-zinc-400:hover{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.hover\:bg-zinc-500:hover{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.hover\:bg-zinc-600:hover{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.hover\:bg-zinc-700:hover{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.hover\:bg-zinc-800:hover{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.hover\:bg-zinc-900:hover{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.hover\:bg-zinc-950:hover{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.hover\:text-amber-100:hover{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.hover\:text-amber-200:hover{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.hover\:text-amber-300:hover{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.hover\:text-amber-400:hover{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.hover\:text-amber-50:hover{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.hover\:text-amber-500:hover{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.hover\:text-amber-600:hover{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.hover\:text-amber-700:hover{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.hover\:text-amber-800:hover{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.hover\:text-amber-900:hover{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.hover\:text-amber-950:hover{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.hover\:text-blue-950:hover{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.hover\:text-cyan-100:hover{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.hover\:text-cyan-200:hover{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.hover\:text-cyan-300:hover{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.hover\:text-cyan-400:hover{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.hover\:text-cyan-50:hover{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.hover\:text-cyan-500:hover{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.hover\:text-cyan-600:hover{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.hover\:text-cyan-700:hover{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.hover\:text-cyan-800:hover{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.hover\:text-cyan-900:hover{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.hover\:text-cyan-950:hover{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.hover\:text-emerald-100:hover{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.hover\:text-emerald-200:hover{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.hover\:text-emerald-300:hover{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.hover\:text-emerald-400:hover{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.hover\:text-emerald-50:hover{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.hover\:text-emerald-500:hover{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.hover\:text-emerald-800:hover{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.hover\:text-emerald-900:hover{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.hover\:text-emerald-950:hover{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.hover\:text-fuchsia-100:hover{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.hover\:text-fuchsia-200:hover{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.hover\:text-fuchsia-300:hover{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.hover\:text-fuchsia-400:hover{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.hover\:text-fuchsia-50:hover{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.hover\:text-fuchsia-500:hover{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.hover\:text-fuchsia-600:hover{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.hover\:text-fuchsia-700:hover{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.hover\:text-fuchsia-800:hover{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.hover\:text-fuchsia-900:hover{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.hover\:text-fuchsia-950:hover{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-gray-950:hover{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.hover\:text-green-100:hover{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.hover\:text-green-200:hover{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.hover\:text-green-300:hover{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.hover\:text-green-400:hover{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.hover\:text-green-50:hover{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.hover\:text-green-500:hover{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.hover\:text-green-700:hover{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.hover\:text-green-800:hover{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.hover\:text-green-950:hover{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.hover\:text-indigo-950:hover{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.hover\:text-lime-100:hover{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.hover\:text-lime-200:hover{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.hover\:text-lime-300:hover{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.hover\:text-lime-400:hover{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.hover\:text-lime-50:hover{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.hover\:text-lime-500:hover{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.hover\:text-lime-600:hover{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.hover\:text-lime-700:hover{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.hover\:text-lime-800:hover{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.hover\:text-lime-900:hover{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.hover\:text-lime-950:hover{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.hover\:text-neutral-100:hover{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.hover\:text-neutral-200:hover{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.hover\:text-neutral-300:hover{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.hover\:text-neutral-400:hover{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.hover\:text-neutral-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-neutral-500:hover{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.hover\:text-neutral-600:hover{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.hover\:text-neutral-700:hover{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.hover\:text-neutral-900:hover{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.hover\:text-neutral-950:hover{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.hover\:text-orange-100:hover{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.hover\:text-orange-200:hover{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.hover\:text-orange-300:hover{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.hover\:text-orange-400:hover{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.hover\:text-orange-50:hover{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.hover\:text-orange-500:hover{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.hover\:text-orange-600:hover{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.hover\:text-orange-700:hover{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.hover\:text-orange-800:hover{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.hover\:text-orange-900:hover{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.hover\:text-orange-950:hover{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.hover\:text-pink-950:hover{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.hover\:text-purple-950:hover{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.hover\:text-red-100:hover{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.hover\:text-red-200:hover{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.hover\:text-red-50:hover{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.hover\:text-red-950:hover{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.hover\:text-rose-100:hover{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.hover\:text-rose-200:hover{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.hover\:text-rose-300:hover{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.hover\:text-rose-400:hover{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.hover\:text-rose-50:hover{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.hover\:text-rose-500:hover{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.hover\:text-rose-600:hover{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.hover\:text-rose-700:hover{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.hover\:text-rose-800:hover{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.hover\:text-rose-900:hover{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.hover\:text-rose-950:hover{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.hover\:text-sky-100:hover{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.hover\:text-sky-200:hover{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.hover\:text-sky-300:hover{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.hover\:text-sky-400:hover{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.hover\:text-sky-50:hover{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.hover\:text-sky-500:hover{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.hover\:text-sky-600:hover{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.hover\:text-sky-700:hover{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.hover\:text-sky-800:hover{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.hover\:text-sky-900:hover{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.hover\:text-sky-950:hover{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.hover\:text-slate-100:hover{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.hover\:text-slate-200:hover{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.hover\:text-slate-300:hover{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.hover\:text-slate-400:hover{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.hover\:text-slate-50:hover{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.hover\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\:text-slate-800:hover{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:text-slate-950:hover{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.hover\:text-stone-100:hover{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.hover\:text-stone-200:hover{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.hover\:text-stone-300:hover{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.hover\:text-stone-400:hover{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.hover\:text-stone-50:hover{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.hover\:text-stone-500:hover{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.hover\:text-stone-600:hover{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.hover\:text-stone-700:hover{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.hover\:text-stone-800:hover{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.hover\:text-stone-900:hover{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.hover\:text-stone-950:hover{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.hover\:text-teal-100:hover{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.hover\:text-teal-200:hover{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.hover\:text-teal-300:hover{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.hover\:text-teal-400:hover{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.hover\:text-teal-50:hover{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.hover\:text-teal-500:hover{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.hover\:text-teal-600:hover{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.hover\:text-teal-700:hover{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.hover\:text-teal-800:hover{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.hover\:text-teal-900:hover{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.hover\:text-teal-950:hover{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.hover\:text-tremor-brand-emphasis:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.hover\:text-tremor-content:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-tremor-content-emphasis:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-violet-100:hover{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.hover\:text-violet-200:hover{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.hover\:text-violet-300:hover{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.hover\:text-violet-400:hover{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.hover\:text-violet-50:hover{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.hover\:text-violet-500:hover{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.hover\:text-violet-600:hover{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.hover\:text-violet-700:hover{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.hover\:text-violet-800:hover{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.hover\:text-violet-900:hover{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.hover\:text-violet-950:hover{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.hover\:text-yellow-950:hover{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.hover\:text-zinc-100:hover{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.hover\:text-zinc-200:hover{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.hover\:text-zinc-300:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.hover\:text-zinc-400:hover{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.hover\:text-zinc-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\:text-zinc-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.hover\:text-zinc-800:hover{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.hover\:text-zinc-950:hover{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-tremor-brand-subtle:focus{--tw-border-opacity:1;border-color:rgb(142 145 235/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0: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(0px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.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)}.focus\:ring-tremor-brand-muted:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(134 136 239/var(--tw-ring-opacity))}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.group:active .group-active\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.aria-selected\:\!bg-tremor-background-subtle[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(243 244 246/var(--tw-bg-opacity))!important}.aria-selected\:bg-tremor-background-emphasis[aria-selected=true]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.aria-selected\:\!text-tremor-content[aria-selected=true]{--tw-text-opacity:1!important;color:rgb(107 114 128/var(--tw-text-opacity))!important}.aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.aria-selected\:text-tremor-brand-inverted[aria-selected=true],.aria-selected\:text-tremor-content-inverted[aria-selected=true]{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.ui-selected\:border-b-2[data-headlessui-state~=selected]{border-bottom-width:2px}.ui-selected\:border-amber-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}.ui-selected\:border-amber-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}.ui-selected\:border-amber-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}.ui-selected\:border-amber-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}.ui-selected\:border-amber-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}.ui-selected\:border-amber-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}.ui-selected\:border-amber-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}.ui-selected\:border-amber-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}.ui-selected\:border-amber-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}.ui-selected\:border-amber-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}.ui-selected\:border-amber-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}.ui-selected\:border-blue-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}.ui-selected\:border-blue-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}.ui-selected\:border-blue-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}.ui-selected\:border-blue-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}.ui-selected\:border-blue-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}.ui-selected\:border-blue-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.ui-selected\:border-blue-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}.ui-selected\:border-blue-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}.ui-selected\:border-blue-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}.ui-selected\:border-blue-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}.ui-selected\:border-blue-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}.ui-selected\:border-cyan-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}.ui-selected\:border-cyan-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}.ui-selected\:border-cyan-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}.ui-selected\:border-cyan-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}.ui-selected\:border-cyan-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}.ui-selected\:border-cyan-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}.ui-selected\:border-cyan-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}.ui-selected\:border-cyan-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}.ui-selected\:border-cyan-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}.ui-selected\:border-cyan-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}.ui-selected\:border-cyan-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}.ui-selected\:border-emerald-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}.ui-selected\:border-emerald-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.ui-selected\:border-emerald-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}.ui-selected\:border-emerald-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}.ui-selected\:border-emerald-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}.ui-selected\:border-emerald-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.ui-selected\:border-emerald-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}.ui-selected\:border-emerald-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}.ui-selected\:border-emerald-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}.ui-selected\:border-emerald-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}.ui-selected\:border-emerald-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}.ui-selected\:border-fuchsia-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}.ui-selected\:border-gray-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.ui-selected\:border-gray-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-gray-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.ui-selected\:border-gray-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.ui-selected\:border-gray-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}.ui-selected\:border-gray-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.ui-selected\:border-gray-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.ui-selected\:border-gray-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.ui-selected\:border-gray-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.ui-selected\:border-gray-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.ui-selected\:border-gray-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}.ui-selected\:border-green-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}.ui-selected\:border-green-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}.ui-selected\:border-green-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}.ui-selected\:border-green-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}.ui-selected\:border-green-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}.ui-selected\:border-green-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}.ui-selected\:border-green-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.ui-selected\:border-green-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}.ui-selected\:border-green-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}.ui-selected\:border-green-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}.ui-selected\:border-green-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}.ui-selected\:border-indigo-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}.ui-selected\:border-indigo-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}.ui-selected\:border-indigo-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}.ui-selected\:border-indigo-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}.ui-selected\:border-indigo-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-indigo-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}.ui-selected\:border-indigo-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}.ui-selected\:border-indigo-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}.ui-selected\:border-indigo-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}.ui-selected\:border-indigo-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}.ui-selected\:border-lime-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}.ui-selected\:border-lime-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}.ui-selected\:border-lime-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}.ui-selected\:border-lime-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}.ui-selected\:border-lime-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}.ui-selected\:border-lime-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}.ui-selected\:border-lime-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}.ui-selected\:border-lime-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}.ui-selected\:border-lime-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}.ui-selected\:border-lime-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}.ui-selected\:border-lime-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}.ui-selected\:border-neutral-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}.ui-selected\:border-neutral-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}.ui-selected\:border-neutral-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}.ui-selected\:border-neutral-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}.ui-selected\:border-neutral-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-neutral-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}.ui-selected\:border-neutral-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}.ui-selected\:border-neutral-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}.ui-selected\:border-neutral-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}.ui-selected\:border-neutral-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}.ui-selected\:border-neutral-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}.ui-selected\:border-orange-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}.ui-selected\:border-orange-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}.ui-selected\:border-orange-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}.ui-selected\:border-orange-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}.ui-selected\:border-orange-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}.ui-selected\:border-orange-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}.ui-selected\:border-orange-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.ui-selected\:border-orange-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}.ui-selected\:border-orange-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}.ui-selected\:border-orange-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}.ui-selected\:border-orange-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}.ui-selected\:border-pink-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}.ui-selected\:border-pink-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}.ui-selected\:border-pink-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}.ui-selected\:border-pink-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}.ui-selected\:border-pink-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}.ui-selected\:border-pink-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}.ui-selected\:border-pink-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}.ui-selected\:border-pink-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}.ui-selected\:border-pink-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}.ui-selected\:border-pink-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}.ui-selected\:border-pink-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}.ui-selected\:border-purple-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}.ui-selected\:border-purple-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}.ui-selected\:border-purple-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}.ui-selected\:border-purple-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}.ui-selected\:border-purple-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}.ui-selected\:border-purple-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}.ui-selected\:border-purple-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}.ui-selected\:border-purple-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}.ui-selected\:border-purple-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}.ui-selected\:border-purple-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}.ui-selected\:border-purple-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}.ui-selected\:border-red-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}.ui-selected\:border-red-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.ui-selected\:border-red-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}.ui-selected\:border-red-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}.ui-selected\:border-red-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}.ui-selected\:border-red-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}.ui-selected\:border-red-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.ui-selected\:border-red-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}.ui-selected\:border-red-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}.ui-selected\:border-red-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}.ui-selected\:border-red-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}.ui-selected\:border-rose-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}.ui-selected\:border-rose-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}.ui-selected\:border-rose-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}.ui-selected\:border-rose-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}.ui-selected\:border-rose-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}.ui-selected\:border-rose-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}.ui-selected\:border-rose-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}.ui-selected\:border-rose-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}.ui-selected\:border-rose-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}.ui-selected\:border-rose-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}.ui-selected\:border-rose-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}.ui-selected\:border-sky-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}.ui-selected\:border-sky-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}.ui-selected\:border-sky-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}.ui-selected\:border-sky-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}.ui-selected\:border-sky-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}.ui-selected\:border-sky-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}.ui-selected\:border-sky-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}.ui-selected\:border-sky-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}.ui-selected\:border-sky-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}.ui-selected\:border-sky-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}.ui-selected\:border-sky-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}.ui-selected\:border-slate-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.ui-selected\:border-slate-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.ui-selected\:border-slate-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.ui-selected\:border-slate-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}.ui-selected\:border-slate-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}.ui-selected\:border-slate-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}.ui-selected\:border-slate-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}.ui-selected\:border-slate-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}.ui-selected\:border-slate-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.ui-selected\:border-slate-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}.ui-selected\:border-slate-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}.ui-selected\:border-stone-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}.ui-selected\:border-stone-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}.ui-selected\:border-stone-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}.ui-selected\:border-stone-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}.ui-selected\:border-stone-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}.ui-selected\:border-stone-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}.ui-selected\:border-stone-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}.ui-selected\:border-stone-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}.ui-selected\:border-stone-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}.ui-selected\:border-stone-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}.ui-selected\:border-stone-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}.ui-selected\:border-teal-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}.ui-selected\:border-teal-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}.ui-selected\:border-teal-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}.ui-selected\:border-teal-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}.ui-selected\:border-teal-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}.ui-selected\:border-teal-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}.ui-selected\:border-teal-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}.ui-selected\:border-teal-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}.ui-selected\:border-teal-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}.ui-selected\:border-teal-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}.ui-selected\:border-teal-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}.ui-selected\:border-tremor-border[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.ui-selected\:border-tremor-brand[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.ui-selected\:border-violet-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}.ui-selected\:border-violet-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}.ui-selected\:border-violet-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}.ui-selected\:border-violet-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}.ui-selected\:border-violet-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}.ui-selected\:border-violet-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}.ui-selected\:border-violet-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}.ui-selected\:border-violet-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}.ui-selected\:border-violet-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}.ui-selected\:border-violet-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}.ui-selected\:border-violet-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}.ui-selected\:border-yellow-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}.ui-selected\:border-yellow-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}.ui-selected\:border-yellow-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}.ui-selected\:border-yellow-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}.ui-selected\:border-yellow-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}.ui-selected\:border-yellow-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}.ui-selected\:border-yellow-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}.ui-selected\:border-yellow-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}.ui-selected\:border-yellow-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}.ui-selected\:border-yellow-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}.ui-selected\:border-yellow-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}.ui-selected\:border-zinc-100[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}.ui-selected\:border-zinc-200[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}.ui-selected\:border-zinc-300[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}.ui-selected\:border-zinc-400[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}.ui-selected\:border-zinc-50[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}.ui-selected\:border-zinc-500[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}.ui-selected\:border-zinc-600[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}.ui-selected\:border-zinc-700[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}.ui-selected\:border-zinc-800[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.ui-selected\:border-zinc-900[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}.ui-selected\:border-zinc-950[data-headlessui-state~=selected]{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}.ui-selected\:bg-amber-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.ui-selected\:bg-amber-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}.ui-selected\:bg-amber-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}.ui-selected\:bg-amber-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}.ui-selected\:bg-amber-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}.ui-selected\:bg-amber-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.ui-selected\:bg-amber-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}.ui-selected\:bg-amber-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}.ui-selected\:bg-amber-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}.ui-selected\:bg-amber-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}.ui-selected\:bg-amber-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}.ui-selected\:bg-blue-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.ui-selected\:bg-blue-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}.ui-selected\:bg-blue-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}.ui-selected\:bg-blue-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}.ui-selected\:bg-blue-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.ui-selected\:bg-blue-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}.ui-selected\:bg-blue-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.ui-selected\:bg-blue-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}.ui-selected\:bg-blue-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.ui-selected\:bg-blue-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}.ui-selected\:bg-cyan-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}.ui-selected\:bg-emerald-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}.ui-selected\:bg-fuchsia-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}.ui-selected\:bg-gray-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.ui-selected\:bg-gray-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.ui-selected\:bg-gray-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.ui-selected\:bg-gray-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.ui-selected\:bg-gray-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-gray-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.ui-selected\:bg-gray-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.ui-selected\:bg-gray-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.ui-selected\:bg-gray-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.ui-selected\:bg-gray-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.ui-selected\:bg-gray-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.ui-selected\:bg-green-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.ui-selected\:bg-green-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.ui-selected\:bg-green-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.ui-selected\:bg-green-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.ui-selected\:bg-green-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}.ui-selected\:bg-green-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.ui-selected\:bg-green-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.ui-selected\:bg-green-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.ui-selected\:bg-green-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}.ui-selected\:bg-green-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.ui-selected\:bg-green-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}.ui-selected\:bg-indigo-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}.ui-selected\:bg-lime-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}.ui-selected\:bg-lime-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}.ui-selected\:bg-lime-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}.ui-selected\:bg-lime-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}.ui-selected\:bg-lime-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}.ui-selected\:bg-lime-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}.ui-selected\:bg-lime-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}.ui-selected\:bg-lime-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}.ui-selected\:bg-lime-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}.ui-selected\:bg-lime-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}.ui-selected\:bg-lime-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}.ui-selected\:bg-neutral-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-orange-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}.ui-selected\:bg-orange-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}.ui-selected\:bg-orange-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}.ui-selected\:bg-orange-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.ui-selected\:bg-orange-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}.ui-selected\:bg-orange-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.ui-selected\:bg-orange-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.ui-selected\:bg-orange-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}.ui-selected\:bg-orange-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}.ui-selected\:bg-pink-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}.ui-selected\:bg-pink-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}.ui-selected\:bg-pink-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}.ui-selected\:bg-pink-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}.ui-selected\:bg-pink-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.ui-selected\:bg-pink-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}.ui-selected\:bg-pink-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}.ui-selected\:bg-pink-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}.ui-selected\:bg-pink-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}.ui-selected\:bg-pink-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}.ui-selected\:bg-pink-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}.ui-selected\:bg-purple-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}.ui-selected\:bg-purple-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.ui-selected\:bg-purple-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}.ui-selected\:bg-purple-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}.ui-selected\:bg-purple-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}.ui-selected\:bg-purple-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.ui-selected\:bg-purple-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}.ui-selected\:bg-purple-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}.ui-selected\:bg-purple-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}.ui-selected\:bg-red-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.ui-selected\:bg-red-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.ui-selected\:bg-red-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.ui-selected\:bg-red-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.ui-selected\:bg-red-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.ui-selected\:bg-red-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.ui-selected\:bg-red-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.ui-selected\:bg-red-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.ui-selected\:bg-red-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.ui-selected\:bg-red-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}.ui-selected\:bg-red-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}.ui-selected\:bg-rose-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.ui-selected\:bg-rose-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.ui-selected\:bg-rose-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}.ui-selected\:bg-rose-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}.ui-selected\:bg-rose-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}.ui-selected\:bg-rose-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.ui-selected\:bg-rose-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}.ui-selected\:bg-rose-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}.ui-selected\:bg-rose-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}.ui-selected\:bg-rose-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.ui-selected\:bg-rose-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}.ui-selected\:bg-sky-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}.ui-selected\:bg-sky-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}.ui-selected\:bg-sky-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}.ui-selected\:bg-sky-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}.ui-selected\:bg-sky-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}.ui-selected\:bg-sky-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}.ui-selected\:bg-sky-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.ui-selected\:bg-sky-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.ui-selected\:bg-sky-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}.ui-selected\:bg-sky-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}.ui-selected\:bg-sky-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}.ui-selected\:bg-slate-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.ui-selected\:bg-slate-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.ui-selected\:bg-slate-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.ui-selected\:bg-slate-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.ui-selected\:bg-slate-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.ui-selected\:bg-slate-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.ui-selected\:bg-slate-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.ui-selected\:bg-slate-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}.ui-selected\:bg-slate-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}.ui-selected\:bg-slate-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.ui-selected\:bg-slate-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}.ui-selected\:bg-stone-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}.ui-selected\:bg-stone-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}.ui-selected\:bg-stone-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}.ui-selected\:bg-stone-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}.ui-selected\:bg-stone-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}.ui-selected\:bg-stone-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}.ui-selected\:bg-stone-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}.ui-selected\:bg-stone-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}.ui-selected\:bg-stone-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}.ui-selected\:bg-stone-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}.ui-selected\:bg-teal-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}.ui-selected\:bg-teal-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}.ui-selected\:bg-teal-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}.ui-selected\:bg-teal-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}.ui-selected\:bg-teal-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}.ui-selected\:bg-teal-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}.ui-selected\:bg-teal-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}.ui-selected\:bg-teal-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}.ui-selected\:bg-teal-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}.ui-selected\:bg-teal-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}.ui-selected\:bg-teal-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.ui-selected\:bg-tremor-background-muted[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-selected\:bg-violet-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}.ui-selected\:bg-violet-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}.ui-selected\:bg-violet-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}.ui-selected\:bg-violet-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}.ui-selected\:bg-violet-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}.ui-selected\:bg-violet-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}.ui-selected\:bg-violet-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.ui-selected\:bg-violet-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}.ui-selected\:bg-violet-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}.ui-selected\:bg-violet-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}.ui-selected\:bg-yellow-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-100[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-200[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-300[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-400[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-50[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-500[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-600[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-700[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-800[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-900[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.ui-selected\:bg-zinc-950[data-headlessui-state~=selected]{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}.ui-selected\:text-amber-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}.ui-selected\:text-amber-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}.ui-selected\:text-amber-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}.ui-selected\:text-amber-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}.ui-selected\:text-amber-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}.ui-selected\:text-amber-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}.ui-selected\:text-amber-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}.ui-selected\:text-amber-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}.ui-selected\:text-amber-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.ui-selected\:text-amber-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}.ui-selected\:text-amber-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}.ui-selected\:text-blue-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}.ui-selected\:text-blue-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}.ui-selected\:text-blue-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}.ui-selected\:text-blue-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}.ui-selected\:text-blue-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}.ui-selected\:text-blue-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}.ui-selected\:text-blue-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.ui-selected\:text-blue-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}.ui-selected\:text-blue-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}.ui-selected\:text-blue-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}.ui-selected\:text-blue-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}.ui-selected\:text-cyan-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}.ui-selected\:text-cyan-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}.ui-selected\:text-cyan-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}.ui-selected\:text-cyan-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}.ui-selected\:text-cyan-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}.ui-selected\:text-cyan-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}.ui-selected\:text-cyan-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}.ui-selected\:text-cyan-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}.ui-selected\:text-cyan-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.ui-selected\:text-cyan-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}.ui-selected\:text-cyan-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}.ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-emerald-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}.ui-selected\:text-emerald-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}.ui-selected\:text-emerald-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}.ui-selected\:text-emerald-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}.ui-selected\:text-emerald-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}.ui-selected\:text-emerald-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}.ui-selected\:text-emerald-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}.ui-selected\:text-emerald-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}.ui-selected\:text-emerald-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.ui-selected\:text-emerald-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}.ui-selected\:text-emerald-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}.ui-selected\:text-fuchsia-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}.ui-selected\:text-gray-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.ui-selected\:text-gray-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.ui-selected\:text-gray-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.ui-selected\:text-gray-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.ui-selected\:text-gray-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.ui-selected\:text-gray-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.ui-selected\:text-gray-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.ui-selected\:text-gray-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-gray-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.ui-selected\:text-gray-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-gray-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.ui-selected\:text-green-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}.ui-selected\:text-green-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.ui-selected\:text-green-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}.ui-selected\:text-green-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.ui-selected\:text-green-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}.ui-selected\:text-green-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}.ui-selected\:text-green-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.ui-selected\:text-green-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.ui-selected\:text-green-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.ui-selected\:text-green-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}.ui-selected\:text-green-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}.ui-selected\:text-indigo-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}.ui-selected\:text-indigo-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}.ui-selected\:text-indigo-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}.ui-selected\:text-indigo-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}.ui-selected\:text-indigo-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-indigo-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.ui-selected\:text-indigo-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}.ui-selected\:text-indigo-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.ui-selected\:text-indigo-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}.ui-selected\:text-indigo-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}.ui-selected\:text-lime-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}.ui-selected\:text-lime-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}.ui-selected\:text-lime-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}.ui-selected\:text-lime-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}.ui-selected\:text-lime-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}.ui-selected\:text-lime-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}.ui-selected\:text-lime-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}.ui-selected\:text-lime-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}.ui-selected\:text-lime-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}.ui-selected\:text-lime-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}.ui-selected\:text-lime-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}.ui-selected\:text-neutral-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}.ui-selected\:text-neutral-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}.ui-selected\:text-neutral-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}.ui-selected\:text-neutral-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}.ui-selected\:text-neutral-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-neutral-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}.ui-selected\:text-neutral-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}.ui-selected\:text-neutral-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}.ui-selected\:text-neutral-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}.ui-selected\:text-neutral-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}.ui-selected\:text-neutral-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}.ui-selected\:text-orange-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}.ui-selected\:text-orange-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}.ui-selected\:text-orange-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}.ui-selected\:text-orange-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.ui-selected\:text-orange-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}.ui-selected\:text-orange-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.ui-selected\:text-orange-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.ui-selected\:text-orange-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}.ui-selected\:text-orange-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}.ui-selected\:text-orange-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}.ui-selected\:text-orange-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}.ui-selected\:text-pink-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}.ui-selected\:text-pink-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}.ui-selected\:text-pink-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}.ui-selected\:text-pink-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}.ui-selected\:text-pink-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}.ui-selected\:text-pink-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}.ui-selected\:text-pink-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}.ui-selected\:text-pink-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}.ui-selected\:text-pink-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}.ui-selected\:text-pink-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}.ui-selected\:text-pink-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}.ui-selected\:text-purple-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}.ui-selected\:text-purple-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}.ui-selected\:text-purple-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}.ui-selected\:text-purple-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.ui-selected\:text-purple-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}.ui-selected\:text-purple-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}.ui-selected\:text-purple-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}.ui-selected\:text-purple-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}.ui-selected\:text-purple-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.ui-selected\:text-purple-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}.ui-selected\:text-purple-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}.ui-selected\:text-red-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}.ui-selected\:text-red-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}.ui-selected\:text-red-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}.ui-selected\:text-red-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.ui-selected\:text-red-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}.ui-selected\:text-red-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.ui-selected\:text-red-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.ui-selected\:text-red-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.ui-selected\:text-red-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.ui-selected\:text-red-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}.ui-selected\:text-red-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}.ui-selected\:text-rose-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}.ui-selected\:text-rose-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.ui-selected\:text-rose-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}.ui-selected\:text-rose-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}.ui-selected\:text-rose-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}.ui-selected\:text-rose-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}.ui-selected\:text-rose-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}.ui-selected\:text-rose-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.ui-selected\:text-rose-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.ui-selected\:text-rose-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}.ui-selected\:text-rose-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}.ui-selected\:text-sky-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}.ui-selected\:text-sky-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}.ui-selected\:text-sky-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}.ui-selected\:text-sky-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}.ui-selected\:text-sky-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}.ui-selected\:text-sky-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.ui-selected\:text-sky-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}.ui-selected\:text-sky-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}.ui-selected\:text-sky-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}.ui-selected\:text-sky-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}.ui-selected\:text-sky-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}.ui-selected\:text-slate-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}.ui-selected\:text-slate-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}.ui-selected\:text-slate-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.ui-selected\:text-slate-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.ui-selected\:text-slate-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}.ui-selected\:text-slate-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.ui-selected\:text-slate-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.ui-selected\:text-slate-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.ui-selected\:text-slate-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.ui-selected\:text-slate-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.ui-selected\:text-slate-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}.ui-selected\:text-stone-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}.ui-selected\:text-stone-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}.ui-selected\:text-stone-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}.ui-selected\:text-stone-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}.ui-selected\:text-stone-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}.ui-selected\:text-stone-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}.ui-selected\:text-stone-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}.ui-selected\:text-stone-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}.ui-selected\:text-stone-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}.ui-selected\:text-stone-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}.ui-selected\:text-stone-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}.ui-selected\:text-teal-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}.ui-selected\:text-teal-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}.ui-selected\:text-teal-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}.ui-selected\:text-teal-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}.ui-selected\:text-teal-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}.ui-selected\:text-teal-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}.ui-selected\:text-teal-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}.ui-selected\:text-teal-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}.ui-selected\:text-teal-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}.ui-selected\:text-teal-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}.ui-selected\:text-teal-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}.ui-selected\:text-tremor-brand[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-emphasis[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.ui-selected\:text-tremor-content-strong[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.ui-selected\:text-violet-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}.ui-selected\:text-violet-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}.ui-selected\:text-violet-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}.ui-selected\:text-violet-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}.ui-selected\:text-violet-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}.ui-selected\:text-violet-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}.ui-selected\:text-violet-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}.ui-selected\:text-violet-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}.ui-selected\:text-violet-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}.ui-selected\:text-violet-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}.ui-selected\:text-violet-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}.ui-selected\:text-yellow-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}.ui-selected\:text-yellow-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}.ui-selected\:text-yellow-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}.ui-selected\:text-yellow-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.ui-selected\:text-yellow-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}.ui-selected\:text-yellow-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}.ui-selected\:text-yellow-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.ui-selected\:text-yellow-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}.ui-selected\:text-yellow-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.ui-selected\:text-yellow-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}.ui-selected\:text-yellow-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}.ui-selected\:text-zinc-100[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.ui-selected\:text-zinc-200[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.ui-selected\:text-zinc-300[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.ui-selected\:text-zinc-400[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.ui-selected\:text-zinc-50[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.ui-selected\:text-zinc-500[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.ui-selected\:text-zinc-600[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}.ui-selected\:text-zinc-700[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}.ui-selected\:text-zinc-800[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}.ui-selected\:text-zinc-900[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}.ui-selected\:text-zinc-950[data-headlessui-state~=selected]{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}.ui-selected\:shadow-tremor-input[data-headlessui-state~=selected]{--tw-shadow:0 1px 2px 0 rgba(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)}:where([data-headlessui-state~=selected]) .ui-selected\:border-b-2{border-bottom-width:2px}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-100{--tw-border-opacity:1;border-color:rgb(254 243 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-200{--tw-border-opacity:1;border-color:rgb(253 230 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-300{--tw-border-opacity:1;border-color:rgb(252 211 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-50{--tw-border-opacity:1;border-color:rgb(255 251 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-500{--tw-border-opacity:1;border-color:rgb(245 158 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-600{--tw-border-opacity:1;border-color:rgb(217 119 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-700{--tw-border-opacity:1;border-color:rgb(180 83 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-800{--tw-border-opacity:1;border-color:rgb(146 64 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-900{--tw-border-opacity:1;border-color:rgb(120 53 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-amber-950{--tw-border-opacity:1;border-color:rgb(69 26 3/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-100{--tw-border-opacity:1;border-color:rgb(219 234 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-200{--tw-border-opacity:1;border-color:rgb(191 219 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-300{--tw-border-opacity:1;border-color:rgb(147 197 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-400{--tw-border-opacity:1;border-color:rgb(96 165 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-50{--tw-border-opacity:1;border-color:rgb(239 246 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-600{--tw-border-opacity:1;border-color:rgb(37 99 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-800{--tw-border-opacity:1;border-color:rgb(30 64 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-900{--tw-border-opacity:1;border-color:rgb(30 58 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-blue-950{--tw-border-opacity:1;border-color:rgb(23 37 84/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-100{--tw-border-opacity:1;border-color:rgb(207 250 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-200{--tw-border-opacity:1;border-color:rgb(165 243 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-300{--tw-border-opacity:1;border-color:rgb(103 232 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-400{--tw-border-opacity:1;border-color:rgb(34 211 238/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-50{--tw-border-opacity:1;border-color:rgb(236 254 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-500{--tw-border-opacity:1;border-color:rgb(6 182 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-600{--tw-border-opacity:1;border-color:rgb(8 145 178/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-700{--tw-border-opacity:1;border-color:rgb(14 116 144/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-800{--tw-border-opacity:1;border-color:rgb(21 94 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-900{--tw-border-opacity:1;border-color:rgb(22 78 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-cyan-950{--tw-border-opacity:1;border-color:rgb(8 51 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-100{--tw-border-opacity:1;border-color:rgb(209 250 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-300{--tw-border-opacity:1;border-color:rgb(110 231 183/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-400{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-50{--tw-border-opacity:1;border-color:rgb(236 253 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-600{--tw-border-opacity:1;border-color:rgb(5 150 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-700{--tw-border-opacity:1;border-color:rgb(4 120 87/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-800{--tw-border-opacity:1;border-color:rgb(6 95 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-900{--tw-border-opacity:1;border-color:rgb(6 78 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-emerald-950{--tw-border-opacity:1;border-color:rgb(2 44 34/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-100{--tw-border-opacity:1;border-color:rgb(250 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-200{--tw-border-opacity:1;border-color:rgb(245 208 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-300{--tw-border-opacity:1;border-color:rgb(240 171 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-400{--tw-border-opacity:1;border-color:rgb(232 121 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-50{--tw-border-opacity:1;border-color:rgb(253 244 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-500{--tw-border-opacity:1;border-color:rgb(217 70 239/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-600{--tw-border-opacity:1;border-color:rgb(192 38 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-700{--tw-border-opacity:1;border-color:rgb(162 28 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-800{--tw-border-opacity:1;border-color:rgb(134 25 143/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-900{--tw-border-opacity:1;border-color:rgb(112 26 117/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-fuchsia-950{--tw-border-opacity:1;border-color:rgb(74 4 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-50{--tw-border-opacity:1;border-color:rgb(249 250 251/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-gray-950{--tw-border-opacity:1;border-color:rgb(3 7 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-100{--tw-border-opacity:1;border-color:rgb(220 252 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-400{--tw-border-opacity:1;border-color:rgb(74 222 128/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-50{--tw-border-opacity:1;border-color:rgb(240 253 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-500{--tw-border-opacity:1;border-color:rgb(34 197 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-800{--tw-border-opacity:1;border-color:rgb(22 101 52/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-900{--tw-border-opacity:1;border-color:rgb(20 83 45/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-green-950{--tw-border-opacity:1;border-color:rgb(5 46 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-100{--tw-border-opacity:1;border-color:rgb(224 231 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-200{--tw-border-opacity:1;border-color:rgb(199 210 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-300{--tw-border-opacity:1;border-color:rgb(165 180 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-400{--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-50{--tw-border-opacity:1;border-color:rgb(238 242 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-600{--tw-border-opacity:1;border-color:rgb(79 70 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-700{--tw-border-opacity:1;border-color:rgb(67 56 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-800{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-900{--tw-border-opacity:1;border-color:rgb(49 46 129/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-indigo-950{--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-100{--tw-border-opacity:1;border-color:rgb(236 252 203/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-200{--tw-border-opacity:1;border-color:rgb(217 249 157/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-300{--tw-border-opacity:1;border-color:rgb(190 242 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-400{--tw-border-opacity:1;border-color:rgb(163 230 53/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-50{--tw-border-opacity:1;border-color:rgb(247 254 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-500{--tw-border-opacity:1;border-color:rgb(132 204 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-600{--tw-border-opacity:1;border-color:rgb(101 163 13/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-700{--tw-border-opacity:1;border-color:rgb(77 124 15/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-800{--tw-border-opacity:1;border-color:rgb(63 98 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-900{--tw-border-opacity:1;border-color:rgb(54 83 20/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-lime-950{--tw-border-opacity:1;border-color:rgb(26 46 5/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-100{--tw-border-opacity:1;border-color:rgb(245 245 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-200{--tw-border-opacity:1;border-color:rgb(229 229 229/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-300{--tw-border-opacity:1;border-color:rgb(212 212 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-400{--tw-border-opacity:1;border-color:rgb(163 163 163/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-500{--tw-border-opacity:1;border-color:rgb(115 115 115/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-600{--tw-border-opacity:1;border-color:rgb(82 82 82/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-700{--tw-border-opacity:1;border-color:rgb(64 64 64/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-800{--tw-border-opacity:1;border-color:rgb(38 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-900{--tw-border-opacity:1;border-color:rgb(23 23 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-neutral-950{--tw-border-opacity:1;border-color:rgb(10 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-100{--tw-border-opacity:1;border-color:rgb(255 237 213/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-200{--tw-border-opacity:1;border-color:rgb(254 215 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-300{--tw-border-opacity:1;border-color:rgb(253 186 116/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-400{--tw-border-opacity:1;border-color:rgb(251 146 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-50{--tw-border-opacity:1;border-color:rgb(255 247 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-500{--tw-border-opacity:1;border-color:rgb(249 115 22/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-800{--tw-border-opacity:1;border-color:rgb(154 52 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-900{--tw-border-opacity:1;border-color:rgb(124 45 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-orange-950{--tw-border-opacity:1;border-color:rgb(67 20 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-100{--tw-border-opacity:1;border-color:rgb(252 231 243/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-200{--tw-border-opacity:1;border-color:rgb(251 207 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-300{--tw-border-opacity:1;border-color:rgb(249 168 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-400{--tw-border-opacity:1;border-color:rgb(244 114 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-50{--tw-border-opacity:1;border-color:rgb(253 242 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-500{--tw-border-opacity:1;border-color:rgb(236 72 153/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-600{--tw-border-opacity:1;border-color:rgb(219 39 119/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-700{--tw-border-opacity:1;border-color:rgb(190 24 93/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-800{--tw-border-opacity:1;border-color:rgb(157 23 77/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-900{--tw-border-opacity:1;border-color:rgb(131 24 67/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-pink-950{--tw-border-opacity:1;border-color:rgb(80 7 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-100{--tw-border-opacity:1;border-color:rgb(243 232 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-200{--tw-border-opacity:1;border-color:rgb(233 213 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-300{--tw-border-opacity:1;border-color:rgb(216 180 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-400{--tw-border-opacity:1;border-color:rgb(192 132 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-50{--tw-border-opacity:1;border-color:rgb(250 245 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-500{--tw-border-opacity:1;border-color:rgb(168 85 247/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-600{--tw-border-opacity:1;border-color:rgb(147 51 234/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-800{--tw-border-opacity:1;border-color:rgb(107 33 168/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-900{--tw-border-opacity:1;border-color:rgb(88 28 135/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-purple-950{--tw-border-opacity:1;border-color:rgb(59 7 100/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-400{--tw-border-opacity:1;border-color:rgb(248 113 113/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-50{--tw-border-opacity:1;border-color:rgb(254 242 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-800{--tw-border-opacity:1;border-color:rgb(153 27 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-900{--tw-border-opacity:1;border-color:rgb(127 29 29/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-red-950{--tw-border-opacity:1;border-color:rgb(69 10 10/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-100{--tw-border-opacity:1;border-color:rgb(255 228 230/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-200{--tw-border-opacity:1;border-color:rgb(254 205 211/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-300{--tw-border-opacity:1;border-color:rgb(253 164 175/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-400{--tw-border-opacity:1;border-color:rgb(251 113 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-50{--tw-border-opacity:1;border-color:rgb(255 241 242/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-500{--tw-border-opacity:1;border-color:rgb(244 63 94/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-600{--tw-border-opacity:1;border-color:rgb(225 29 72/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-700{--tw-border-opacity:1;border-color:rgb(190 18 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-800{--tw-border-opacity:1;border-color:rgb(159 18 57/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-900{--tw-border-opacity:1;border-color:rgb(136 19 55/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-rose-950{--tw-border-opacity:1;border-color:rgb(76 5 25/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-100{--tw-border-opacity:1;border-color:rgb(224 242 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-200{--tw-border-opacity:1;border-color:rgb(186 230 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-300{--tw-border-opacity:1;border-color:rgb(125 211 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-400{--tw-border-opacity:1;border-color:rgb(56 189 248/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-50{--tw-border-opacity:1;border-color:rgb(240 249 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-500{--tw-border-opacity:1;border-color:rgb(14 165 233/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-600{--tw-border-opacity:1;border-color:rgb(2 132 199/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-700{--tw-border-opacity:1;border-color:rgb(3 105 161/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-800{--tw-border-opacity:1;border-color:rgb(7 89 133/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-900{--tw-border-opacity:1;border-color:rgb(12 74 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-sky-950{--tw-border-opacity:1;border-color:rgb(8 47 73/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-400{--tw-border-opacity:1;border-color:rgb(148 163 184/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-50{--tw-border-opacity:1;border-color:rgb(248 250 252/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-500{--tw-border-opacity:1;border-color:rgb(100 116 139/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-600{--tw-border-opacity:1;border-color:rgb(71 85 105/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-700{--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-900{--tw-border-opacity:1;border-color:rgb(15 23 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-slate-950{--tw-border-opacity:1;border-color:rgb(2 6 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-100{--tw-border-opacity:1;border-color:rgb(245 245 244/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-200{--tw-border-opacity:1;border-color:rgb(231 229 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-300{--tw-border-opacity:1;border-color:rgb(214 211 209/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-400{--tw-border-opacity:1;border-color:rgb(168 162 158/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-50{--tw-border-opacity:1;border-color:rgb(250 250 249/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-500{--tw-border-opacity:1;border-color:rgb(120 113 108/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-600{--tw-border-opacity:1;border-color:rgb(87 83 78/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-700{--tw-border-opacity:1;border-color:rgb(68 64 60/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-800{--tw-border-opacity:1;border-color:rgb(41 37 36/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-900{--tw-border-opacity:1;border-color:rgb(28 25 23/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-stone-950{--tw-border-opacity:1;border-color:rgb(12 10 9/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-300{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-50{--tw-border-opacity:1;border-color:rgb(240 253 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-500{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-600{--tw-border-opacity:1;border-color:rgb(13 148 136/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-700{--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-800{--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-900{--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-teal-950{--tw-border-opacity:1;border-color:rgb(4 47 46/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-border{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-tremor-brand{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-100{--tw-border-opacity:1;border-color:rgb(237 233 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-200{--tw-border-opacity:1;border-color:rgb(221 214 254/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-300{--tw-border-opacity:1;border-color:rgb(196 181 253/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-400{--tw-border-opacity:1;border-color:rgb(167 139 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-50{--tw-border-opacity:1;border-color:rgb(245 243 255/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-500{--tw-border-opacity:1;border-color:rgb(139 92 246/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-600{--tw-border-opacity:1;border-color:rgb(124 58 237/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-700{--tw-border-opacity:1;border-color:rgb(109 40 217/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-800{--tw-border-opacity:1;border-color:rgb(91 33 182/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-900{--tw-border-opacity:1;border-color:rgb(76 29 149/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-violet-950{--tw-border-opacity:1;border-color:rgb(46 16 101/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-100{--tw-border-opacity:1;border-color:rgb(254 249 195/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-200{--tw-border-opacity:1;border-color:rgb(254 240 138/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-400{--tw-border-opacity:1;border-color:rgb(250 204 21/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-50{--tw-border-opacity:1;border-color:rgb(254 252 232/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-500{--tw-border-opacity:1;border-color:rgb(234 179 8/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-600{--tw-border-opacity:1;border-color:rgb(202 138 4/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-800{--tw-border-opacity:1;border-color:rgb(133 77 14/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-900{--tw-border-opacity:1;border-color:rgb(113 63 18/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-yellow-950{--tw-border-opacity:1;border-color:rgb(66 32 6/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-400{--tw-border-opacity:1;border-color:rgb(161 161 170/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-500{--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-600{--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-700{--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-900{--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:border-zinc-950{--tw-border-opacity:1;border-color:rgb(9 9 11/var(--tw-border-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-300{--tw-bg-opacity:1;background-color:rgb(252 211 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-600{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-700{--tw-bg-opacity:1;background-color:rgb(180 83 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-800{--tw-bg-opacity:1;background-color:rgb(146 64 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-900{--tw-bg-opacity:1;background-color:rgb(120 53 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-amber-950{--tw-bg-opacity:1;background-color:rgb(69 26 3/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-200{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-300{--tw-bg-opacity:1;background-color:rgb(147 197 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-50{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-700{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 64 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-100{--tw-bg-opacity:1;background-color:rgb(207 250 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-200{--tw-bg-opacity:1;background-color:rgb(165 243 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-300{--tw-bg-opacity:1;background-color:rgb(103 232 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-400{--tw-bg-opacity:1;background-color:rgb(34 211 238/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-50{--tw-bg-opacity:1;background-color:rgb(236 254 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-500{--tw-bg-opacity:1;background-color:rgb(6 182 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-600{--tw-bg-opacity:1;background-color:rgb(8 145 178/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-700{--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-800{--tw-bg-opacity:1;background-color:rgb(21 94 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-900{--tw-bg-opacity:1;background-color:rgb(22 78 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-cyan-950{--tw-bg-opacity:1;background-color:rgb(8 51 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-200{--tw-bg-opacity:1;background-color:rgb(167 243 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-300{--tw-bg-opacity:1;background-color:rgb(110 231 183/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-800{--tw-bg-opacity:1;background-color:rgb(6 95 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-900{--tw-bg-opacity:1;background-color:rgb(6 78 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-emerald-950{--tw-bg-opacity:1;background-color:rgb(2 44 34/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-100{--tw-bg-opacity:1;background-color:rgb(250 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-200{--tw-bg-opacity:1;background-color:rgb(245 208 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-300{--tw-bg-opacity:1;background-color:rgb(240 171 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-400{--tw-bg-opacity:1;background-color:rgb(232 121 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-50{--tw-bg-opacity:1;background-color:rgb(253 244 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-500{--tw-bg-opacity:1;background-color:rgb(217 70 239/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-600{--tw-bg-opacity:1;background-color:rgb(192 38 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-800{--tw-bg-opacity:1;background-color:rgb(134 25 143/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-900{--tw-bg-opacity:1;background-color:rgb(112 26 117/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-fuchsia-950{--tw-bg-opacity:1;background-color:rgb(74 4 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-300{--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-800{--tw-bg-opacity:1;background-color:rgb(22 101 52/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-900{--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(199 210 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(165 180 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(49 46 129/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-indigo-950{--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-100{--tw-bg-opacity:1;background-color:rgb(236 252 203/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-200{--tw-bg-opacity:1;background-color:rgb(217 249 157/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-300{--tw-bg-opacity:1;background-color:rgb(190 242 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-400{--tw-bg-opacity:1;background-color:rgb(163 230 53/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-50{--tw-bg-opacity:1;background-color:rgb(247 254 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-500{--tw-bg-opacity:1;background-color:rgb(132 204 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-600{--tw-bg-opacity:1;background-color:rgb(101 163 13/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-700{--tw-bg-opacity:1;background-color:rgb(77 124 15/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-800{--tw-bg-opacity:1;background-color:rgb(63 98 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-900{--tw-bg-opacity:1;background-color:rgb(54 83 20/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-lime-950{--tw-bg-opacity:1;background-color:rgb(26 46 5/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(245 245 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(229 229 229/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-300{--tw-bg-opacity:1;background-color:rgb(212 212 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-400{--tw-bg-opacity:1;background-color:rgb(163 163 163/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-500{--tw-bg-opacity:1;background-color:rgb(115 115 115/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-600{--tw-bg-opacity:1;background-color:rgb(82 82 82/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-700{--tw-bg-opacity:1;background-color:rgb(64 64 64/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-800{--tw-bg-opacity:1;background-color:rgb(38 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(23 23 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(10 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-100{--tw-bg-opacity:1;background-color:rgb(255 237 213/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-200{--tw-bg-opacity:1;background-color:rgb(254 215 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-50{--tw-bg-opacity:1;background-color:rgb(255 247 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-700{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-800{--tw-bg-opacity:1;background-color:rgb(154 52 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-900{--tw-bg-opacity:1;background-color:rgb(124 45 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 231 243/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-200{--tw-bg-opacity:1;background-color:rgb(251 207 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-300{--tw-bg-opacity:1;background-color:rgb(249 168 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-400{--tw-bg-opacity:1;background-color:rgb(244 114 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-500{--tw-bg-opacity:1;background-color:rgb(236 72 153/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-600{--tw-bg-opacity:1;background-color:rgb(219 39 119/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-700{--tw-bg-opacity:1;background-color:rgb(190 24 93/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-800{--tw-bg-opacity:1;background-color:rgb(157 23 77/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-900{--tw-bg-opacity:1;background-color:rgb(131 24 67/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-pink-950{--tw-bg-opacity:1;background-color:rgb(80 7 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-200{--tw-bg-opacity:1;background-color:rgb(233 213 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-300{--tw-bg-opacity:1;background-color:rgb(216 180 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-50{--tw-bg-opacity:1;background-color:rgb(250 245 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-500{--tw-bg-opacity:1;background-color:rgb(168 85 247/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-800{--tw-bg-opacity:1;background-color:rgb(107 33 168/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-900{--tw-bg-opacity:1;background-color:rgb(88 28 135/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-200{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-900{--tw-bg-opacity:1;background-color:rgb(127 29 29/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-400{--tw-bg-opacity:1;background-color:rgb(251 113 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-50{--tw-bg-opacity:1;background-color:rgb(255 241 242/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-600{--tw-bg-opacity:1;background-color:rgb(225 29 72/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-700{--tw-bg-opacity:1;background-color:rgb(190 18 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-800{--tw-bg-opacity:1;background-color:rgb(159 18 57/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-900{--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-rose-950{--tw-bg-opacity:1;background-color:rgb(76 5 25/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-100{--tw-bg-opacity:1;background-color:rgb(224 242 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-200{--tw-bg-opacity:1;background-color:rgb(186 230 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-300{--tw-bg-opacity:1;background-color:rgb(125 211 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-400{--tw-bg-opacity:1;background-color:rgb(56 189 248/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-50{--tw-bg-opacity:1;background-color:rgb(240 249 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-500{--tw-bg-opacity:1;background-color:rgb(14 165 233/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-700{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-800{--tw-bg-opacity:1;background-color:rgb(7 89 133/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-900{--tw-bg-opacity:1;background-color:rgb(12 74 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-sky-950{--tw-bg-opacity:1;background-color:rgb(8 47 73/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-700{--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-800{--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-slate-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-100{--tw-bg-opacity:1;background-color:rgb(245 245 244/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-200{--tw-bg-opacity:1;background-color:rgb(231 229 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-300{--tw-bg-opacity:1;background-color:rgb(214 211 209/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-400{--tw-bg-opacity:1;background-color:rgb(168 162 158/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-50{--tw-bg-opacity:1;background-color:rgb(250 250 249/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-500{--tw-bg-opacity:1;background-color:rgb(120 113 108/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-600{--tw-bg-opacity:1;background-color:rgb(87 83 78/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-700{--tw-bg-opacity:1;background-color:rgb(68 64 60/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-800{--tw-bg-opacity:1;background-color:rgb(41 37 36/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-900{--tw-bg-opacity:1;background-color:rgb(28 25 23/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-stone-950{--tw-bg-opacity:1;background-color:rgb(12 10 9/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-100{--tw-bg-opacity:1;background-color:rgb(204 251 241/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-200{--tw-bg-opacity:1;background-color:rgb(153 246 228/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-700{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-800{--tw-bg-opacity:1;background-color:rgb(17 94 89/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-900{--tw-bg-opacity:1;background-color:rgb(19 78 74/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-teal-950{--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-100{--tw-bg-opacity:1;background-color:rgb(237 233 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-200{--tw-bg-opacity:1;background-color:rgb(221 214 254/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-300{--tw-bg-opacity:1;background-color:rgb(196 181 253/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-400{--tw-bg-opacity:1;background-color:rgb(167 139 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-50{--tw-bg-opacity:1;background-color:rgb(245 243 255/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-600{--tw-bg-opacity:1;background-color:rgb(124 58 237/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-800{--tw-bg-opacity:1;background-color:rgb(91 33 182/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-900{--tw-bg-opacity:1;background-color:rgb(76 29 149/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-violet-950{--tw-bg-opacity:1;background-color:rgb(46 16 101/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(253 224 71/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(202 138 4/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(161 98 7/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(133 77 14/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(113 63 18/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-500{--tw-bg-opacity:1;background-color:rgb(113 113 122/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-100{--tw-text-opacity:1;color:rgb(254 243 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-200{--tw-text-opacity:1;color:rgb(253 230 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-300{--tw-text-opacity:1;color:rgb(252 211 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-50{--tw-text-opacity:1;color:rgb(255 251 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-700{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-900{--tw-text-opacity:1;color:rgb(120 53 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-amber-950{--tw-text-opacity:1;color:rgb(69 26 3/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-100{--tw-text-opacity:1;color:rgb(219 234 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-50{--tw-text-opacity:1;color:rgb(239 246 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-700{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-800{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-900{--tw-text-opacity:1;color:rgb(30 58 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-blue-950{--tw-text-opacity:1;color:rgb(23 37 84/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-100{--tw-text-opacity:1;color:rgb(207 250 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-200{--tw-text-opacity:1;color:rgb(165 243 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-300{--tw-text-opacity:1;color:rgb(103 232 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-400{--tw-text-opacity:1;color:rgb(34 211 238/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-50{--tw-text-opacity:1;color:rgb(236 254 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-500{--tw-text-opacity:1;color:rgb(6 182 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-600{--tw-text-opacity:1;color:rgb(8 145 178/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-700{--tw-text-opacity:1;color:rgb(14 116 144/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-900{--tw-text-opacity:1;color:rgb(22 78 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-cyan-950{--tw-text-opacity:1;color:rgb(8 51 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-dark-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-100{--tw-text-opacity:1;color:rgb(209 250 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-200{--tw-text-opacity:1;color:rgb(167 243 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-50{--tw-text-opacity:1;color:rgb(236 253 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-900{--tw-text-opacity:1;color:rgb(6 78 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-emerald-950{--tw-text-opacity:1;color:rgb(2 44 34/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-100{--tw-text-opacity:1;color:rgb(250 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-200{--tw-text-opacity:1;color:rgb(245 208 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-300{--tw-text-opacity:1;color:rgb(240 171 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-400{--tw-text-opacity:1;color:rgb(232 121 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-50{--tw-text-opacity:1;color:rgb(253 244 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-500{--tw-text-opacity:1;color:rgb(217 70 239/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-600{--tw-text-opacity:1;color:rgb(192 38 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-700{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-800{--tw-text-opacity:1;color:rgb(134 25 143/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-900{--tw-text-opacity:1;color:rgb(112 26 117/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-fuchsia-950{--tw-text-opacity:1;color:rgb(74 4 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-100{--tw-text-opacity:1;color:rgb(220 252 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-50{--tw-text-opacity:1;color:rgb(240 253 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-900{--tw-text-opacity:1;color:rgb(20 83 45/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-green-950{--tw-text-opacity:1;color:rgb(5 46 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-100{--tw-text-opacity:1;color:rgb(224 231 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-200{--tw-text-opacity:1;color:rgb(199 210 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-300{--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-400{--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-50{--tw-text-opacity:1;color:rgb(238 242 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-700{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-900{--tw-text-opacity:1;color:rgb(49 46 129/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-indigo-950{--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-100{--tw-text-opacity:1;color:rgb(236 252 203/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-200{--tw-text-opacity:1;color:rgb(217 249 157/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-300{--tw-text-opacity:1;color:rgb(190 242 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-400{--tw-text-opacity:1;color:rgb(163 230 53/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-50{--tw-text-opacity:1;color:rgb(247 254 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-500{--tw-text-opacity:1;color:rgb(132 204 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-600{--tw-text-opacity:1;color:rgb(101 163 13/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-700{--tw-text-opacity:1;color:rgb(77 124 15/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-800{--tw-text-opacity:1;color:rgb(63 98 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-900{--tw-text-opacity:1;color:rgb(54 83 20/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-lime-950{--tw-text-opacity:1;color:rgb(26 46 5/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-100{--tw-text-opacity:1;color:rgb(245 245 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-200{--tw-text-opacity:1;color:rgb(229 229 229/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-300{--tw-text-opacity:1;color:rgb(212 212 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-400{--tw-text-opacity:1;color:rgb(163 163 163/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-500{--tw-text-opacity:1;color:rgb(115 115 115/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-600{--tw-text-opacity:1;color:rgb(82 82 82/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-700{--tw-text-opacity:1;color:rgb(64 64 64/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-800{--tw-text-opacity:1;color:rgb(38 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-900{--tw-text-opacity:1;color:rgb(23 23 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-neutral-950{--tw-text-opacity:1;color:rgb(10 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-100{--tw-text-opacity:1;color:rgb(255 237 213/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-50{--tw-text-opacity:1;color:rgb(255 247 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-500{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-700{--tw-text-opacity:1;color:rgb(194 65 12/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-800{--tw-text-opacity:1;color:rgb(154 52 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-900{--tw-text-opacity:1;color:rgb(124 45 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-orange-950{--tw-text-opacity:1;color:rgb(67 20 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-100{--tw-text-opacity:1;color:rgb(252 231 243/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-200{--tw-text-opacity:1;color:rgb(251 207 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-300{--tw-text-opacity:1;color:rgb(249 168 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-400{--tw-text-opacity:1;color:rgb(244 114 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-50{--tw-text-opacity:1;color:rgb(253 242 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-500{--tw-text-opacity:1;color:rgb(236 72 153/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-600{--tw-text-opacity:1;color:rgb(219 39 119/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-700{--tw-text-opacity:1;color:rgb(190 24 93/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-800{--tw-text-opacity:1;color:rgb(157 23 77/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-900{--tw-text-opacity:1;color:rgb(131 24 67/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-pink-950{--tw-text-opacity:1;color:rgb(80 7 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-100{--tw-text-opacity:1;color:rgb(243 232 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-50{--tw-text-opacity:1;color:rgb(250 245 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-500{--tw-text-opacity:1;color:rgb(168 85 247/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-600{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-700{--tw-text-opacity:1;color:rgb(126 34 206/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-900{--tw-text-opacity:1;color:rgb(88 28 135/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-purple-950{--tw-text-opacity:1;color:rgb(59 7 100/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-100{--tw-text-opacity:1;color:rgb(254 226 226/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-50{--tw-text-opacity:1;color:rgb(254 242 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-900{--tw-text-opacity:1;color:rgb(127 29 29/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-red-950{--tw-text-opacity:1;color:rgb(69 10 10/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-100{--tw-text-opacity:1;color:rgb(255 228 230/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-200{--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-300{--tw-text-opacity:1;color:rgb(253 164 175/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-50{--tw-text-opacity:1;color:rgb(255 241 242/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-600{--tw-text-opacity:1;color:rgb(225 29 72/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-900{--tw-text-opacity:1;color:rgb(136 19 55/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-rose-950{--tw-text-opacity:1;color:rgb(76 5 25/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-100{--tw-text-opacity:1;color:rgb(224 242 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-200{--tw-text-opacity:1;color:rgb(186 230 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-300{--tw-text-opacity:1;color:rgb(125 211 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-400{--tw-text-opacity:1;color:rgb(56 189 248/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-50{--tw-text-opacity:1;color:rgb(240 249 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-700{--tw-text-opacity:1;color:rgb(3 105 161/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-800{--tw-text-opacity:1;color:rgb(7 89 133/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-900{--tw-text-opacity:1;color:rgb(12 74 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-sky-950{--tw-text-opacity:1;color:rgb(8 47 73/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-100{--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-200{--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-50{--tw-text-opacity:1;color:rgb(248 250 252/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-slate-950{--tw-text-opacity:1;color:rgb(2 6 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-100{--tw-text-opacity:1;color:rgb(245 245 244/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-200{--tw-text-opacity:1;color:rgb(231 229 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-300{--tw-text-opacity:1;color:rgb(214 211 209/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-400{--tw-text-opacity:1;color:rgb(168 162 158/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-50{--tw-text-opacity:1;color:rgb(250 250 249/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-500{--tw-text-opacity:1;color:rgb(120 113 108/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-600{--tw-text-opacity:1;color:rgb(87 83 78/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-700{--tw-text-opacity:1;color:rgb(68 64 60/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-800{--tw-text-opacity:1;color:rgb(41 37 36/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-900{--tw-text-opacity:1;color:rgb(28 25 23/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-stone-950{--tw-text-opacity:1;color:rgb(12 10 9/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-100{--tw-text-opacity:1;color:rgb(204 251 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-200{--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-400{--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-50{--tw-text-opacity:1;color:rgb(240 253 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-900{--tw-text-opacity:1;color:rgb(19 78 74/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-teal-950{--tw-text-opacity:1;color:rgb(4 47 46/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-brand{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-emphasis{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-100{--tw-text-opacity:1;color:rgb(237 233 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-200{--tw-text-opacity:1;color:rgb(221 214 254/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-300{--tw-text-opacity:1;color:rgb(196 181 253/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-400{--tw-text-opacity:1;color:rgb(167 139 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-50{--tw-text-opacity:1;color:rgb(245 243 255/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-500{--tw-text-opacity:1;color:rgb(139 92 246/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-600{--tw-text-opacity:1;color:rgb(124 58 237/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-700{--tw-text-opacity:1;color:rgb(109 40 217/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-800{--tw-text-opacity:1;color:rgb(91 33 182/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-900{--tw-text-opacity:1;color:rgb(76 29 149/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-violet-950{--tw-text-opacity:1;color:rgb(46 16 101/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-100{--tw-text-opacity:1;color:rgb(254 249 195/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-300{--tw-text-opacity:1;color:rgb(253 224 71/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-50{--tw-text-opacity:1;color:rgb(254 252 232/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-500{--tw-text-opacity:1;color:rgb(234 179 8/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-700{--tw-text-opacity:1;color:rgb(161 98 7/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-900{--tw-text-opacity:1;color:rgb(113 63 18/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-yellow-950{--tw-text-opacity:1;color:rgb(66 32 6/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-50{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:text-zinc-950{--tw-text-opacity:1;color:rgb(9 9 11/var(--tw-text-opacity))}:where([data-headlessui-state~=selected]) .ui-selected\:shadow-tremor-input{--tw-shadow:0 1px 2px 0 rgba(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)}.ui-active\:bg-tremor-background-muted[data-headlessui-state~=active]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.ui-active\:text-tremor-content-strong[data-headlessui-state~=active]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:where([data-headlessui-state~=active]) .ui-active\:bg-tremor-background-muted{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}:where([data-headlessui-state~=active]) .ui-active\:text-tremor-content-strong{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:divide-dark-tremor-border)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}:is(.dark .dark\:border-dark-tremor-background){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-emphasis){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-inverted){--tw-border-opacity:1;border-color:rgb(30 27 75/var(--tw-border-opacity))}:is(.dark .dark\:border-dark-tremor-brand-subtle){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-emphasis){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-background-subtle){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-border){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand){--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted){--tw-bg-opacity:1;background-color:rgb(30 27 75/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-brand-muted\/70){background-color:rgba(30,27,75,.7)}:is(.dark .dark\:bg-dark-tremor-brand-subtle){--tw-bg-opacity:1;background-color:rgb(55 48 163/var(--tw-bg-opacity))}:is(.dark .dark\:bg-dark-tremor-content-subtle){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:bg-slate-950\/50){background-color:rgba(2,6,23,.5)}:is(.dark .dark\:bg-opacity-10){--tw-bg-opacity:0.1}:is(.dark .dark\:bg-opacity-25){--tw-bg-opacity:0.25}:is(.dark .dark\:bg-opacity-30){--tw-bg-opacity:0.3}:is(.dark .dark\:from-dark-tremor-background){--tw-gradient-from:#111827 var(--tw-gradient-from-position);--tw-gradient-to:rgba(17,24,39,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(.dark .dark\:to-dark-tremor-background){--tw-gradient-to:#111827 var(--tw-gradient-to-position)}:is(.dark .dark\:fill-dark-tremor-content){fill:#6b7280}:is(.dark .dark\:fill-dark-tremor-content-emphasis){fill:#e5e7eb}:is(.dark .dark\:stroke-dark-tremor-background){stroke:#111827}:is(.dark .dark\:stroke-dark-tremor-border){stroke:#374151}:is(.dark .dark\:stroke-dark-tremor-brand){stroke:#6366f1}:is(.dark .dark\:stroke-dark-tremor-brand-muted){stroke:#1e1b4b}:is(.dark .dark\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-emphasis){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-brand-inverted){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-dark-tremor-content-subtle){--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:accent-dark-tremor-brand){accent-color:#6366f1}:is(.dark .dark\:opacity-25){opacity:.25}:is(.dark .dark\:shadow-dark-tremor-card){--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:shadow-dark-tremor-dropdown){--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(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)}:is(.dark .dark\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:outline-dark-tremor-brand){outline-color:#6366f1}:is(.dark .dark\:ring-dark-tremor-brand-inverted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-brand-muted){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .dark\:ring-dark-tremor-ring){--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-dark-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::-moz-placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content)::placeholder{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::-moz-placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:placeholder\:text-tremor-content-subtle)::placeholder{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-brand-emphasis:hover){--tw-border-opacity:1;border-color:rgb(129 140 248/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-dark-tremor-content-emphasis:hover){--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-muted:hover){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-background-subtle:hover){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-emphasis:hover){--tw-bg-opacity:1;background-color:rgb(129 140 248/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-dark-tremor-brand-faint:hover){--tw-bg-opacity:1;background-color:rgb(11 18 41/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-opacity-20:hover){--tw-bg-opacity:0.2}:is(.dark .dark\:hover\:text-dark-tremor-brand-emphasis:hover){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-dark-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content:hover){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-tremor-content-emphasis:hover){--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:is(.dark .hover\:dark\:text-dark-tremor-content):hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:focus\:border-dark-tremor-brand-subtle:focus){--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .focus\:dark\:border-dark-tremor-brand-subtle):focus{--tw-border-opacity:1;border-color:rgb(55 48 163/var(--tw-border-opacity))}:is(.dark .dark\:focus\:ring-dark-tremor-brand-muted:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .focus\:dark\:ring-dark-tremor-brand-muted):focus{--tw-ring-opacity:1;--tw-ring-color:rgb(30 27 75/var(--tw-ring-opacity))}:is(.dark .group:hover .dark\:group-hover\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .aria-selected\:dark\:\!bg-dark-tremor-background-subtle)[aria-selected=true]{--tw-bg-opacity:1!important;background-color:rgb(31 41 55/var(--tw-bg-opacity))!important}:is(.dark .dark\:aria-selected\:bg-dark-tremor-background-emphasis[aria-selected=true]){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-brand-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(30 27 75/var(--tw-text-opacity))}:is(.dark .dark\:aria-selected\:text-dark-tremor-content-inverted[aria-selected=true]){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-border[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:border-dark-tremor-brand[data-headlessui-state~=selected]){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:bg-dark-tremor-background-muted[data-headlessui-state~=selected]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-brand[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-emphasis[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:text-dark-tremor-content-strong[data-headlessui-state~=selected]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark .dark\:ui-selected\:shadow-dark-tremor-input[data-headlessui-state~=selected]){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-border){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:border-dark-tremor-brand){--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-brand){--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-emphasis){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=selected]) .dark\:ui-selected\:shadow-dark-tremor-input){--tw-shadow:0 1px 2px 0 rgba(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)}:is(.dark .dark\:ui-active\:bg-dark-tremor-background-muted[data-headlessui-state~=active]){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark .dark\:ui-active\:text-dark-tremor-content-strong[data-headlessui-state~=active]){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:bg-dark-tremor-background-muted){--tw-bg-opacity:1;background-color:rgb(19 26 43/var(--tw-bg-opacity))}:is(.dark :where([data-headlessui-state~=active]) .dark\:ui-active\:text-dark-tremor-content-strong){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}@media (min-width:640px){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:h-screen{height:100vh}.sm\:w-full{width:100%}.sm\:max-w-lg{max-width:32rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:items-start{align-items:flex-start}.sm\: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)))}.sm\: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))}.sm\:p-0{padding:0}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}}@media (min-width:768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}}@media (min-width:1024px){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:max-w-\[200px\]{max-width:200px}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button,.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none}.\[\&\:\:-webkit-scrollbar\]\:hidden::-webkit-scrollbar{display:none} \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.html b/ui/litellm-dashboard/out/index.html index 99ac50ef5..0c7a9b87f 100644 --- a/ui/litellm-dashboard/out/index.html +++ b/ui/litellm-dashboard/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.txt b/ui/litellm-dashboard/out/index.txt index a259886a9..5afb31dc0 100644 --- a/ui/litellm-dashboard/out/index.txt +++ b/ui/litellm-dashboard/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[74961,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-a458360dd75bd774.js"],""] +3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-1b778934c9b8fd3d.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["HnLepq2YNME88Nzo5qHls",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["8Qf_s48H0nBodS2RVsrIl",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null From d72c195bf653ca764a01814caed8cdc788a52ab6 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:51:31 -0800 Subject: [PATCH 052/304] =?UTF-8?q?bump:=20version=201.28.9=20=E2=86=92=20?= =?UTF-8?q?1.28.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 65e8645fc..2d5666935 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.9" +version = "1.28.10" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.9" +version = "1.28.10" version_files = [ "pyproject.toml:^version" ] From 9bc1f5f6642992c187bb801e3bae3c774b0a458a Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:57:35 -0800 Subject: [PATCH 053/304] (proxy) test budgets --- litellm/proxy/proxy_server.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index fc327e13a..75f3a944d 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6513,12 +6513,9 @@ async def health_services_endpoint( }, ) - if "slack" in general_settings.get("alerting", []): - test_message = f"""\n🚨 `ProjectedLimitExceededError` 💸\n\n`Key Alias:` my-secret-project \n`Expected Day of Error`: 28th March \n`Current Spend`: 100 \n`Projected Spend at end of month`: 1000 \n""" - await proxy_logging_obj.alerting_handler( - message=test_message, level="Low" - ) + test_message = f"""\n🚨 `ProjectedLimitExceededError` 💸\n\n`Key Alias:` litellm-ui-test-alert \n`Expected Day of Error`: 28th March \n`Current Spend`: $100.00 \n`Projected Spend at end of month`: $1000.00 \n""" + await proxy_logging_obj.alerting_handler(message=test_message, level="Low") else: raise HTTPException( status_code=422, @@ -6541,6 +6538,8 @@ async def health_services_endpoint( type="auth_error", param=getattr(e, "param", "None"), code=status.HTTP_401_UNAUTHORIZED, + ) + @router.get("/health", tags=["health"], dependencies=[Depends(user_api_key_auth)]) async def health_endpoint( From 2f09970c917aed7409115ff3514dd110ec207bdd Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 16:57:53 -0800 Subject: [PATCH 054/304] (feat) new ui build --- litellm/proxy/_experimental/out/404.html | 2 +- .../out/_next/static/chunks/app/page-1b778934c9b8fd3d.js | 1 - .../out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js | 1 + .../_buildManifest.js | 0 .../_ssgManifest.js | 0 litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 4 ++-- ui/litellm-dashboard/out/404.html | 2 +- .../out/_next/static/chunks/app/page-1b778934c9b8fd3d.js | 1 - .../out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js | 1 + .../_buildManifest.js | 0 .../_ssgManifest.js | 0 ui/litellm-dashboard/out/index.html | 2 +- ui/litellm-dashboard/out/index.txt | 4 ++-- ui/litellm-dashboard/src/components/networking.tsx | 2 +- 15 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js rename litellm/proxy/_experimental/out/_next/static/{8Qf_s48H0nBodS2RVsrIl => p1zjZBLDqxGf-NaFvZkeF}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{8Qf_s48H0nBodS2RVsrIl => p1zjZBLDqxGf-NaFvZkeF}/_ssgManifest.js (100%) delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js rename ui/litellm-dashboard/out/_next/static/{8Qf_s48H0nBodS2RVsrIl => p1zjZBLDqxGf-NaFvZkeF}/_buildManifest.js (100%) rename ui/litellm-dashboard/out/_next/static/{8Qf_s48H0nBodS2RVsrIl => p1zjZBLDqxGf-NaFvZkeF}/_ssgManifest.js (100%) diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html index 1f1e14ae0..064bb2163 100644 --- a/litellm/proxy/_experimental/out/404.html +++ b/litellm/proxy/_experimental/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js deleted file mode 100644 index efda0f860..000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js new file mode 100644 index 000000000..8d5377ae4 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("/health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/index.html b/litellm/proxy/_experimental/out/index.html index 0c7a9b87f..aaaaa698a 100644 --- a/litellm/proxy/_experimental/out/index.html +++ b/litellm/proxy/_experimental/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.txt b/litellm/proxy/_experimental/out/index.txt index 5afb31dc0..72b67997a 100644 --- a/litellm/proxy/_experimental/out/index.txt +++ b/litellm/proxy/_experimental/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-1b778934c9b8fd3d.js"],""] +3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-37bd7c3d0bb898a3.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["8Qf_s48H0nBodS2RVsrIl",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["p1zjZBLDqxGf-NaFvZkeF",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null diff --git a/ui/litellm-dashboard/out/404.html b/ui/litellm-dashboard/out/404.html index 1f1e14ae0..064bb2163 100644 --- a/ui/litellm-dashboard/out/404.html +++ b/ui/litellm-dashboard/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js deleted file mode 100644 index efda0f860..000000000 --- a/ui/litellm-dashboard/out/_next/static/chunks/app/page-1b778934c9b8fd3d.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js new file mode 100644 index 000000000..8d5377ae4 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("/health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js b/ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js similarity index 100% rename from ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_buildManifest.js rename to ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js diff --git a/ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js b/ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js similarity index 100% rename from ui/litellm-dashboard/out/_next/static/8Qf_s48H0nBodS2RVsrIl/_ssgManifest.js rename to ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js diff --git a/ui/litellm-dashboard/out/index.html b/ui/litellm-dashboard/out/index.html index 0c7a9b87f..aaaaa698a 100644 --- a/ui/litellm-dashboard/out/index.html +++ b/ui/litellm-dashboard/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.txt b/ui/litellm-dashboard/out/index.txt index 5afb31dc0..72b67997a 100644 --- a/ui/litellm-dashboard/out/index.txt +++ b/ui/litellm-dashboard/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-1b778934c9b8fd3d.js"],""] +3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-37bd7c3d0bb898a3.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["8Qf_s48H0nBodS2RVsrIl",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["p1zjZBLDqxGf-NaFvZkeF",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index a8ff29c00..5993df34c 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -815,7 +815,7 @@ export const slackBudgetAlertsHealthCheck = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/health/services?service=slack_budget_alerts` - : `health/services?service=slack_budget_alerts`; + : `/health/services?service=slack_budget_alerts`; console.log("Checking Slack Budget Alerts service health"); message.info("Sending Test Slack alert..."); From 7e94fcc9a8ca68672d7f42e3f6379e8a4eba34b1 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:15:27 -0800 Subject: [PATCH 055/304] (fix) prisma test --- litellm/proxy/proxy_server.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 75f3a944d..6a818666e 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1814,6 +1814,9 @@ async def generate_key_helper_fn( key_soft_budget: Optional[ float ] = None, # key_soft_budget is used to Budget Per key + soft_budget: Optional[ + float + ] = None, # soft_budget is used to set soft Budgets Per user max_budget: Optional[float] = None, # max_budget is used to Budget Per user budget_duration: Optional[str] = None, # max_budget is used to Budget Per user token: Optional[str] = None, From 9fca5c741598436555d66f081d5ae7bfb4baf8bf Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:18:48 -0800 Subject: [PATCH 056/304] (docs) litellm --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index a7ce7b5ba..3611bddf9 100644 --- a/README.md +++ b/README.md @@ -251,6 +251,19 @@ Step 4: Submit a PR with your changes! 🚀 - Our numbers 📞 +1 (770) 8783-106 / ‭+1 (412) 618-6238‬ - Our emails ✉️ ishaan@berri.ai / krrish@berri.ai +# Enterprise +For companies that need better security, user management and professional support + +[Talk to founders](https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat) + +This covers: +- ✅ **Features under the [LiteLLM Commercial License](https://docs.litellm.ai/docs/proxy/enterprise):** +- ✅ **Feature Prioritization** +- ✅ **Custom Integrations** +- ✅ **Professional Support - Dedicated discord + slack** +- ✅ **Custom SLAs** +- ✅ **Secure access with Single Sign-On** + # Why did we build this - **Need for simplicity**: Our code started to get extremely complicated managing & translating calls between Azure, OpenAI and Cohere. From a8fa4e28e9b3caec4ecddbbcd8b8b25bff4a4067 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Sat, 2 Mar 2024 17:19:11 -0800 Subject: [PATCH 057/304] Update docker-compose.yml --- docker-compose.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b2c85b94f..ac9f5adc7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,13 +8,3 @@ services: - "4000:4000" environment: - AZURE_API_KEY=sk-123 - - clickhouse: - image: clickhouse/clickhouse-server - environment: - - CLICKHOUSE_DB=litellm-test - - CLICKHOUSE_USER=admin - - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 - - CLICKHOUSE_PASSWORD=admin - ports: - - "8123:8123" From c7968aff6260bbe973c6a2c8afd07b08e1fa703b Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:20:02 -0800 Subject: [PATCH 058/304] (docs) litellm --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3611bddf9..bc8c1bae2 100644 --- a/README.md +++ b/README.md @@ -245,12 +245,6 @@ Step 4: Submit a PR with your changes! 🚀 - push your fork to your GitHub repo - submit a PR from there -# Support / talk with founders -- [Schedule Demo 👋](https://calendly.com/d/4mp-gd3-k5k/berriai-1-1-onboarding-litellm-hosted-version) -- [Community Discord 💭](https://discord.gg/wuPM9dRgDw) -- Our numbers 📞 +1 (770) 8783-106 / ‭+1 (412) 618-6238‬ -- Our emails ✉️ ishaan@berri.ai / krrish@berri.ai - # Enterprise For companies that need better security, user management and professional support @@ -264,6 +258,12 @@ This covers: - ✅ **Custom SLAs** - ✅ **Secure access with Single Sign-On** +# Support / talk with founders +- [Schedule Demo 👋](https://calendly.com/d/4mp-gd3-k5k/berriai-1-1-onboarding-litellm-hosted-version) +- [Community Discord 💭](https://discord.gg/wuPM9dRgDw) +- Our numbers 📞 +1 (770) 8783-106 / ‭+1 (412) 618-6238‬ +- Our emails ✉️ ishaan@berri.ai / krrish@berri.ai + # Why did we build this - **Need for simplicity**: Our code started to get extremely complicated managing & translating calls between Azure, OpenAI and Cohere. From b7416fc946ea746c084ecb6f1e9a8a653d55aab2 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:33:07 -0800 Subject: [PATCH 059/304] (fix) improve example test slack alert --- docs/my-website/docs/proxy/budget_alerts.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 docs/my-website/docs/proxy/budget_alerts.md diff --git a/docs/my-website/docs/proxy/budget_alerts.md b/docs/my-website/docs/proxy/budget_alerts.md new file mode 100644 index 000000000..92b055510 --- /dev/null +++ b/docs/my-website/docs/proxy/budget_alerts.md @@ -0,0 +1,20 @@ +import Image from '@theme/IdealImage'; + +# 🚨 Budget Alerting + +**Alerts when a project will exceed it’s planned limit** + + + +## Quick Start + +### 1. Setup Slack Alerting on your Proxy Config.yaml + + +### 1. Create API Key on Admin UI +- Set a key name +- Set a Soft Budget on when to get alerted + +### 2. Test Alerting + +### 3. Check Slack \ No newline at end of file From b2389a9b1dc5156f7a4009043af8572bd364aeb9 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:33:18 -0800 Subject: [PATCH 060/304] (feat) improve test slack alert --- docs/my-website/img/budget_alert.png | Bin 0 -> 70994 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/my-website/img/budget_alert.png diff --git a/docs/my-website/img/budget_alert.png b/docs/my-website/img/budget_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..467080f41a8d62be40a3133afb001c2f07f2148c GIT binary patch literal 70994 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�%)_kxYa3=nAD2|O$1V(zF-|7LU>^gSm9 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 Pfj@UtG;ikIFbn#BF@Tx7 literal 0 HcmV?d00001 From aa565dc9901c8a902bc7a65fbe5c5a5c2fc16592 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:33:31 -0800 Subject: [PATCH 061/304] (feat) improve test slack alert --- litellm/proxy/proxy_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 6a818666e..db5caa9ae 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -6517,7 +6517,7 @@ async def health_services_endpoint( ) if "slack" in general_settings.get("alerting", []): - test_message = f"""\n🚨 `ProjectedLimitExceededError` 💸\n\n`Key Alias:` litellm-ui-test-alert \n`Expected Day of Error`: 28th March \n`Current Spend`: $100.00 \n`Projected Spend at end of month`: $1000.00 \n""" + test_message = f"""\n🚨 `ProjectedLimitExceededError` 💸\n\n`Key Alias:` litellm-ui-test-alert \n`Expected Day of Error`: 28th March \n`Current Spend`: $100.00 \n`Projected Spend at end of month`: $1000.00 \n`Soft Limit`: $700""" await proxy_logging_obj.alerting_handler(message=test_message, level="Low") else: raise HTTPException( From fa2c6fdebb63674fcca57ad238755dd091c079d8 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 2 Mar 2024 17:55:49 -0800 Subject: [PATCH 062/304] (docs) alerting slack budgets --- docs/my-website/docs/proxy/alerting.md | 10 +++-- docs/my-website/docs/proxy/budget_alerts.md | 45 ++++++++++++++++++-- docs/my-website/img/budget_alert.png | Bin 70994 -> 0 bytes docs/my-website/img/budget_alerts.png | Bin 0 -> 91236 bytes docs/my-website/img/create_key.png | Bin 0 -> 143093 bytes docs/my-website/img/test_alert.png | Bin 0 -> 207731 bytes docs/my-website/sidebars.js | 1 + 7 files changed, 49 insertions(+), 7 deletions(-) delete mode 100644 docs/my-website/img/budget_alert.png create mode 100644 docs/my-website/img/budget_alerts.png create mode 100644 docs/my-website/img/create_key.png create mode 100644 docs/my-website/img/test_alert.png diff --git a/docs/my-website/docs/proxy/alerting.md b/docs/my-website/docs/proxy/alerting.md index e99f43524..feb54babd 100644 --- a/docs/my-website/docs/proxy/alerting.md +++ b/docs/my-website/docs/proxy/alerting.md @@ -33,12 +33,16 @@ general_settings: alerting: ["slack"] alerting_threshold: 300 # sends alerts if requests hang for 5min+ and responses take 5min+ -environment_variables: - SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/<>/<>/<>" +``` + +Set `SLACK_WEBHOOK_URL` in your proxy env + +```shell +SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/<>/<>/<>" ``` ### Step 3: Start proxy ```bash -$ litellm /path/to/config.yaml +$ litellm --config /path/to/config.yaml ``` \ No newline at end of file diff --git a/docs/my-website/docs/proxy/budget_alerts.md b/docs/my-website/docs/proxy/budget_alerts.md index 92b055510..580040d97 100644 --- a/docs/my-website/docs/proxy/budget_alerts.md +++ b/docs/my-website/docs/proxy/budget_alerts.md @@ -4,17 +4,54 @@ import Image from '@theme/IdealImage'; **Alerts when a project will exceed it’s planned limit** - + ## Quick Start ### 1. Setup Slack Alerting on your Proxy Config.yaml +**Update proxy config.yaml with slack alerting** +Add `general_settings:alerting` +```yaml +model_list: + model_name: "azure-model" + litellm_params: + model: "azure/gpt-35-turbo" + +general_settings: + alerting: ["slack"] +``` + +Get a slack webhook url from https://api.slack.com/messaging/webhooks + + +Set `SLACK_WEBHOOK_URL` in your proxy env + +```shell +SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/<>/<>/<>" +``` + +Start proxy +```bash +$ litellm --config /path/to/config.yaml +``` + + +### 2. Create API Key on Proxy Admin UI +The Admin UI is found on `your-litellm-proxy-endpoint/ui`, example `http://localhost:4000/ui/` -### 1. Create API Key on Admin UI - Set a key name - Set a Soft Budget on when to get alerted -### 2. Test Alerting + -### 3. Check Slack \ No newline at end of file + +### 3. Test Slack Alerting on Admin UI +After creating a key on the Admin UI, click on "Test Slack Alert" to send a test alert to your Slack channel + + +### 4. Check Slack + +When the test alert works, you should expect to see this on your alerts slack channel + + \ No newline at end of file diff --git a/docs/my-website/img/budget_alert.png b/docs/my-website/img/budget_alert.png deleted file mode 100644 index 467080f41a8d62be40a3133afb001c2f07f2148c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70994 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�%)_kxYa3=nAD2|O$1V(zF-|7LU>^gSm9 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 Pfj@UtG;ikIFbn#BF@Tx7 diff --git a/docs/my-website/img/budget_alerts.png b/docs/my-website/img/budget_alerts.png new file mode 100644 index 0000000000000000000000000000000000000000..82d80b90ede82b3a7a11c2cb158e51f181dd1ac3 GIT binary patch literal 91236 zcmafb1y~ec+cznpfQrbU78EG~1p(<2Q975U7wL{=SvnO26jVSulxCNZ?v(D>rC9+1 z>24Oj!6)A5eINaQT-WT*&dfP;=G^zW7 z5nln0B(m=4;NV=7vX+%qdm$@(N6p32!rIOp2j_Wcj1Cc4v-5U}{>S%HR=5NiuVx5t zaNuUV8o+zb8<_Lzo)r6|D}iAQx>`=$IdA;Q45`%D{K0D9`o4^vzLb{MrM~L6piKI+ zy3l*m8#8r^@#{NV>ZyWugrxtl=8lgQ=7nba|u@}ddFgT z_o>D;x`CT51k6ScT9;i6xLb2wYIPPV>3Rbz$#7Vy$mNsB{a4I8hIgx$)nv<4 zbL{T?bgi}Ml`^X=Jw10aKXNi3nfqA-iRYa9P(TdtrScm|Vs}2jH|h$(_nxS1MAAAz zb&D*dh+fJwwoBf6iT?)w_4up_sf2*?^^V}b3a+~b--%?n`jzKf_;D5PBhpmmx!l1p zu$62=T&vdB(vz3E2G&TTkH{xkG8eEbsrdu#T37jAQr^juvPj8l8v zUm17}bo4$Fe3QEuLqBI#|FA=~AaWr)6hEEnoK?6=cDGf~oOo=Ov{sV$t{~Wm3Hh%3 z!ve)ppyA@xcxPFWvndi2S?KIG7XJsd-Seoq@~_u@MCvKVrQQ!zZkWq+o;hp!y1kDU zdOapAB>C*o?a2P1s~QE7*`YfurVAc(gz-u5pL<9gkzT(7Ze$t=ASl;*NM(j6EpKef zRQvIe0FV57kZU8+0jY)6(?Fy=apa>koHLReOh3pYccb=qq$PedkeBSFi$9OrU+jKn z7La{?$zSa~Ss`n&dh@K+_IDC9f{QnO0q?Hv_693YTx=dQABeWRQi==wa7``)LFRE2 z|IPU~$jdu}S4P|GoK?lHG5VN5n`tUf2gK@6DN}BWkVF!Xk{G_4)FgO4ms(6uQJvcRRT{X(*_~xGhac_D!$hgO`FM_#KYpNX1ZauncAN(GO!giXHG)5e9h$f z6d0usSoJT&G*BRvIap3_m1*^EzW}Uq205FOI$z?OBSDcO>v!<&wkc6j$=HiEF}GW` z1g=Oz+vbU{rW#_k)hQjIQMFPlT?t(^`K?HISvW|q)1Y0X-Kd>+r(W#*+OjBZQC65m z7~wLFhwJ?_maSzw=24Sd)18BzG&swLa_1+Wl&q%?cSP1PRj>VUzN7e_JaPXaN2+vzFr-@CO;xAl&2-(s+fk6P<79s8(f~WrA z_r&*G*7(1RPzNnT1i?6A(i~u1w7){p4Le-XMu#G%$ARhJ?>)ii3GDtZQh8NJRmdIp zq)Bv(M*8|q89A#rj4$7U@3_68Y?iA1fOGF!=(C$2Zrx+J!E)0~u=qNMT-SRAGk%Tm zHCghzY#(-?v$@cDyxC(Z{GiGnoR_AT!)y~8@r;I@l1$EY@P(C#2pP9j_<*?;p)xP@xUd{Pwo zl9TA@P4+L#Gk708+}E5j>uDZ{sk9XT24T=}%}02Xm#u+O>QvLb{cdTd2& z`k3Xh%i~WrYa>qz2h(2+m5y8+_+fq9+F?*E^EfVeu*d2FZEX4b@))-SbiUk3@z6_K zbKn;1=#_z$QS^u#I$|{Cvtg!>QjH?f@YfNORkPIxqvM58*`;CPmK!}c&Tc3^8;Pvs zo2%P+ZfI;+?-07dIK5h(y7$u)*HhP%YoB(1V|D(d{6zg^cwgveDtePHS6~Qw4{p}k zfxWx=SK5{GD}z@`u9g2)N_XuqTAC{~Vb?}!Qux;RhaT++bUoIycb&=^jk8#@fAG-A ze(L2}Qh~DNP{}gYo}gz#Xuyl2&~IiXFG4ykHMxeL49g6QXC3ykTU;x7T!OO5x40-O<`S9#Yj&JXqYWFdAmB4birQ^(WY@n~L{Vx1A)A z4F;P;nU~Bg7IWLIzDzXHH}~o!FN2m*j^$UZ(#!p|AffOi&tgQ`i^?m@r`{(SD@()> z@-Rduvk(*~^t`vr9liw+zPCTXG}?sWfix}61!G26T(zd>=J!UwBk6s)TFgM)K-Yl0Nx8{f(c<>cqxaj0 zHq6xuV(MU_Xa2-)-}2s^egJ(KW{G@yBb_BZ?@P+F$j}r9AHm?;{Hzw1JvHElv4yYj zdF1>(=lpG(?auA8?M=!v%C4K$_ur;Gv}|sDihU~mQu8JUhlI8MP~$iMP}}=%Y&G|& z*)VZt0@iIAfKy?!RFx2vvnRFe3b-YsAk)NVw_3h4E30y@r4)++Eq^d`|KA@-Q17y?Mt2J?91z`^1 zkk<*#4@@St(sTK<+``tLwtgwFW*kNVZF}|M^@2YR&>;Abun`C=FucoySXdG0qUv4q0&pz2wu+Ylr z@GR|E^tReM0z`KN6C`HB?myKVh-L9Bh|WW58m!{)?| zy7YW>ez{wAQ{Mv2DmkM7uCr6nU4w-Sp(aNiXVOcuU3tg2#!tPCyXxsqWe+PDA@n(t zR?bBy*Volv;14}4`P}d*{VRgwYwoU7$1K{Se^FMRKEh7Y#-(&6?%?Y}J4btX1V#C+ z(rZcAlYffF`|dceMx$%8?u5c!b`A?pB|CBA-oTH9vivV zjSXxJ`Tm5*VklshZjTLIYDQegu`bZ1%D#CW?}DV-6~Fx+frGN}(UwB^%$pkLRg0b8 z0{vQj@rn}1hUzH4rQPY{L*he)4FrbQ53-fENRcRc;9BLz;PvyO2&>+cUK3drX)M<1 zvy)l#lVjidn19}~Ok71=-V5K0S2Fde_Vo47)}{J6Nr7{uuQhh(yK%i=*`eysOX!g)E3E8@21L^pxxJc!Y_+w9YrHCC7_ockRU=iPrSJ0qDI zpoOA2^FF5z_w<$)OOKlXQi?Eh@CyrNWgJdmpBRS#mllT**uw=j30%5=??1z3$HD(~ z91jO4#2Sa-pVz1W-+yQFk=xTH8;sJ1g#Ob*%6bI)v>*a>~LgU^R(Eq5l7T6W6tR!OUXwPF} z=J?W_$KBrPvL75VcM)LM-rUvXj=Q~`160IaoaNUQBEbITVP2Lyzb)i)5*8Nb zeaOel$Hxs^!436ra5Zt~c7WdfM<@U4=czf=)WzD#)!NbF&Sk$QFCAg7;w&teH~RPA zKgMb9Zv8)Za)AExv498Uy*$JFi02{izxxK7id`NRQL}b8x6^%UZ4b;Da1ROoCr`wF zUH@Na{^ySW(GvVWEgwC3^6)>K{>Q2R+f*BB?jq}G58TsL;(z4z&&L0G@}CXGcrPFQ zKc?az^Ze^5FwqjEV!Zzrngpry^8H>wj`Y?~RkeU`K+AspH3OgQz;^i!Y>6VeSy5v+ zI8rz-o=R)Elux*Jc+Jb}6YXjGq3))u7?yB;7c{heB9{&OH9e*6W-+h#U({ega z6@N50%b1&)SxuJP+o1ALjNw117MGK$H1~!oE(jJ_4C*po_{cLUV(j+ zg4v=p)o0bcd`oD3%|Gl4I~;8YEFe7%Lpi>Nh3&FS!ei0g#s~{b@%*D;BC4wdrv|l{ z*W3+$xo_p*9QoRma?hTz!!5J;gckDpm@hQ+YM{wE%wuJzR}R)IFz8b2VQ-<$nYx;Z zQfpH`Z=&RPseb3<<@~nrNA~@a7v6B840L8{w`-qRtgc>#gZ*gtC+?Ddb2z8_cxu13 zcdx3s;q=l}st?jXuUXTyJ%Vg&#xQl-66#o8bKp?Z05v?J>4iJ|9Qb^ismKLFs=a*q zMMFd579*nrhTo3qye7jjB(ZkW1YdLW)MM!5Ew?1&#uYLZ#hWO9B>_nLRCik;0rFD} zHNkZ$9Nho@NOQZow(gIzN_Y<&Uu4>!7+NZGo!05|~Ef)I7l5{$Uy+te$AVtd#mb7hLCejt`CJK(orDcZZihSmGUQe7X zU~Qb7H07SjarlK$7M;hZkA2eND#IT4S`lIE&pc&9rf%#K*cvkg)8azhX&T6TZSOc{ClI-V4?Tlf&#=x5J3Liag=+wv-GuE zBY3$XfV?3Exgc5F^xrpDAw<-~k%CI@WqTx%qHp)nBU_L2a@&MrPB$jLech<92t?Jr z)=l(}5e8%B#-9C7y1+3T1P-pPJ@$u(10ei=bdBn3TKSP3K!xnP-c*wsR95)~g~Yqf z3C4diCjF;gz5=~)pKp1%UiKnMvUcb%&_R#fwKk*w=AKN|U|cU!VU z@VB-Aun$t)x7ZnqEX>Vw4Qt%W)B@#yO~9BAo? zJ@q!6>b<8_ol$x=wq+Dm@*&o{h%2a?~)BoP?_7^pS2 z04zh%fh3v)+}+cZkWr-4Doa4*2#LYAhfDp# zmkM$!3-KdDIuIf{6_ptfx*s)^8z<)OLBB2LWCfzN3aVGrsE`L5yL03>ln4=#ugLy; zCI6CK+9%Q@BBXw~-C()>d{ceXdIs-UE#Rp+^X z(0#oLyMDdNZNS*ke?=_3odDS`Ooe3a*G?+E%~mi&xrn+~=zy5>;RG9ANB_<)U&Pd(5OZey2QVtFUAS9SMvfb40yg(SN$O)ddB<<0$r(ZQ5 zv{4m3&dYb=Rxyy&dq#-pZm0c?jk9X50@Rj6^Vq0v7kafXzt9`OR9v#I3bo zgYuGZJe%#ShOI^?B;<*}R>nxtKH>_^MsY!?d;^%GZtwLblb7V^y4}q0Jb!u$81+M3 z#4!guyPBtG^$I#4vDllabJ+gn;#ULaJ4H4qPJ2wfVQ+$f=F_LI7y^BbiI5xgNR#rd z$5ZO;F2TeHTE2i;5z}>TiRu7@X2u}@4MPRwuU;pd#ZJmOISE!k0 zLuwJB&w(f^(|5o3p2Q<=xIz$t)!JIIe8U=$y1Kf^&$OU}W8Nm)8u9)}pwWmH?k*7}^G(eyP5TTdjG=}!4rw%GBQ zk%PLM|ETAaggv}Xy)QYzy$66&Mt}J5`RK^K%xW<3eObAmw7V~$mT6&liw&%PXWJpg zB_%N*KfdGwE9cNMIs~u6Sd=WijCpF3gHW-FC;QC|SH>83&f#Bsbb;BvYr>yF*z==Z zS68>Ivy-ILx9!_Ec4lU2#z?k%r}Ejqo%Niz{>SE(r>23RT`%EXQ{M|zj{04?a?qkg z=`Z7#GmUp&%do;BxfiD7_R?3WsJbCf=bi5hLIjCI-Dii7G%S^x;ZX`-G%GYv733OC zE2j_YVs8|kNR1Jj1d!1Qjtx2Q#=0zCbiAH>8ECxAdzIfzA?OO3%-8TelHciez%*%` z6Y7D5JsxP+l$7cGY*&@))~%zkYk&f-(k(hy2xa14nk1=r)DJJFAGUNS9)qU8RK0ma z%*w_#dEo{$CIgeT)fX5EY~HXVN1KU0-NI#~iqR3PIVA-FN>lmZGdJX%*;TP!wkCUK zrb;$Tty7Odg8SsnZ#3n)Qe!>@HhSMopy6?UPfuyX6QNU!M@zc@m`W$YseuuK+(ioK zj~_p-G0j&tt(+r`1bjGiAp%}APXR~tj!^L(^>bC#3cvB|c`=AgNgT~ioAWP)x+NBw zs$VbF?7zZ0sj?eRE!r1l`h(TBqdW_Xi=2{@4HIG%404z2e(VtM!-o%H5fLCeJ7hkH z>^8ERd98j^d5aVj$-q)s8HhSde(z}ZeU6b30f9{l`|1BUQ+@g7J9c|}o6%1W(i%o( zGnCP3T-EB^;07$*%b3yE&v@qgZ)H)(`W=*gQiyEPHp(4 zSj@#Sc0am_6MSe#4l-`G5hMm5juKU7Z<=y4>*VX1^EzVcu_-f)jx`$<#(u*`@@?Hw zKL&q3N>Q#jSBbT4$5zGYHAw8<@inc*L3IANiAO&05?`kGVQcQ zR0um#FP`=P_%hq4`r+g7M=JC(Z*P+Va8~l0xJMy{#F5mfF}$vBZ^>M;Tj`2H@~6W3 z6NOkq&v=bt4Pdo>5nmC(U1j|0eB(DVz`^rUZj^k^?dVllM%l7L*=IqwKGcNb5zTq*?yZYp+~qzwAJivih_L+S8hmvM5FCN6L0;5K0uM z2xIGfZFLdR(^MTR5%1$ohldWsN3XRuShY8AYG-$wgh}pv_c^oHIzQ-X((~Zb`(1pe z<%laYx`I6(^tyC_jwEN(CN@P&#ClB$)rq8_*TUL)4qsM!^^^il7mHMnglh<1U8VXg^tw zdQENkmlJX?B3@|k^^&m~5C%GAP#^*&l3_FbCjghw~IUJn?3$!Q3K zTill~U-srBC2fG5s`@Of8ffIUc5x*&h@9jEL`+Uw?)-XC={ zto;0%`h4XbQETchF2!DzJrl3mK$lZ_*6rG33BQG(*lC*T9?PC z`*?73zoGjWL}Bd=@ErB@XSCkkkk)VC#t`U2V_wP$LB|<`ifP}(O_jsQO5@22$ILNsM8#zM-m`2%f{q?g>8TOc!;;4 zQ*n?fWkfzUZYpmz& zYwE{N-=)f|C+~ls2&KF~VdBqr?)62y-eFy2+V29pGG3D1_hk32f4O4=wtOaazup0m zv47a8|Ff8}Tm@h*77$*>`Kppwtt^cSokAnG=cbfu68j^XK#Cica@N2GYonQ|KX}p* zLiR#Ff<9M~x29Cd(a3X~H6Ci2;*pi&zC+^WJKOxa`ZI=%ZxdAmcZ98t4T6sPJpDdd zD5aWk`C<}wKC!T{*q!d+p?yaWhig4{?Gl&yvnJ0!ElX_&)G-uo7;-%n$sSbN97shDM@ZNhZi7>hi6 z7r&DGPg=m+}a6UF9=6&^98+9cqMQ_RK6M$HB&{5JRA`P!imbGC=3W`Gwu z-g10pXdG(6#lxfGSi2p(LGPALF21Lx?Bit@x7oeO2-6cW-g>|e>- z+jD)#APN%a{Ym503#@~^xgXT9{<_04r_rPbypZI_)*thU9fmSOE$aC-x3|sfrV}@N z{RQS5n5-s$ER%*4>-@m&)vAOg?g%-8qK6}|q!(zrrr%mP`zmc)z?7N6)u-L1Z8_nP zamZ9yive*ipb;^yZG#766E&$Neq{shKN_YAPS6BM2~xqoTiF2(a(BRu3DF6Ed6T0* zGJY~{(u-Px_$(#EA4A)e7~oURC%gTUR16IHZOXK(KcZC0;~YnN)K9i#DY*FfH0IkP zx!~-^l+`?XrO$aUmdp)3mor6q3mqm8tf%xGmJHqQZ+q7=zE=pd0ZlWrSo?aNBT}s%DMby7#E}Zm&@Fk2%G) z_Z`rs-ZI>s=!z^W0CrJOR2)7d++CkS)L%_{_l{1eYijd|GGa8Gx86!MhPo&rY89Pd zk}7Y9tY8^2y8gr5kq|lAVECB~ex|S9n~*ywE5yzx+*Ch_hD(m7M%I1F0TJabn+9oV zspZ5h&E!>5Mu1vs3bdLc=<}-~Iremu$Ik_-D=MZ{8azv1MoJpwjwWknjS?WupFjBn zlJF02v8IDdSrkk~v27d1n%tqPKqEAR+>CN^4H(FL3EI>#q^nm!`Vb5B`E6+sv0*lw-Qv|lY#J<#M= zlcJ(bLk7hc<4nVtyN!L$kCzg}tc&|reN)bl`~5y)if&qR(iJ6iO{7PNbxE`^v}~v) zSBjW#I0PRii+h#lHws99)$O4#z5uRvJ*JAa{r2WYy=@OYLNm)9ALVDbnm_P(w<}?3 zWvZ&APeSx)s=OtHLZ>d;Q}Df@5P}`DUpMX`cmQf#0eu$qbj_I~x2D}Hu-)`fsi{9x z$vreIeAO4iS$D{u>yVTn?tv)2jZN!KPu1x$u}?Ay^wSBiV00?r9_oTRXxBCAoN(%4 z9iKO@6gK@4Ww?xDiY^G6SN2e}lD@SJ zw4>J;?D9ZdC1;y{7sDs8)%|YXh8*QY!RnuL;dX?U9-{>YRT>rr=ubrDBg#V48CzRh zI|-l_cXNC+tKz4hfhp8uhle^iLVlXhc1c9 zu}DEhN*<5t?0c;@6rj$IckL5@#{JxJC_LfVH(xXpP|P7f%Jr4RNj+|k%2+HUukhLR z>rC1$<7-m|$@KFlhmAnZ@kXbZdvf0~7K&wgK8GLNY+AUv$ZmILC+ZNOr zzhkVCbtV$pZitz_58;+={+GG@x3m7w1rKQ;9b*nmJ{yVGM(HZO=VZ-{XAbm%7A5cp zkRUYEZRoDl9wnfrNYVaF`;+k^=6U(w>D`tditgoOa;F^bg?(1V8XX{ypX z5@%&OJM72_;9B3i3GLYrBu0yX$NgcwD*_@5(VAL-7xp=wuE^Zb*xoRYHOwlkKT|Me za#_?~A0GylCUk)`18ili;m!!XcgCp_K2t4J1+uJ=UfmL1+mi^jy(Xe@6MsdxXZuG? zsc#2CD@;u0-Nq(DxxY^ft-pylUZt>_=8oh%sBDRLceBht9wlZ?@~eJHA*z-rFP?qd zF;dfANo#p>{BweSnT_`1lmAata}X(2Bn%eMb$jzYDl80t^p5!U732ZRV>{A#daJBl ztB5u!^0s%zsF9a4)^V+{gl5Y(6}rb(YMt=+fUo_m?@-m+*KM~@Z_=qKkGK1B9^ zvKijG&`j1;Rcm36<%Dhsb^RsufI33Xxcp2W;+lvZiOJdi|JRKQU&Bg3vT|1aVekQ{)B$XlY z`UhQHNy75UCT_|NHz_Ic`-mnQ7icABS zJhuWc0*241wl*8WxfGI`{5g;b1a{33lvwnZoH>^IDi3?Vb9LnCvu_h)qQ5{6DbbDJ zE}(w|fdN>y>&QR>4ixzf0|1@u()wj}@(uUvJ%zBIYvO8@Two!)v9ytq5&vUVW%nmL z=O5f82E8`w+Ls^`ZLO`x&CMK|Syp{(!YikR^|+`+fMcT-w<#@mn9h^GFE*Fhf_jC> zazXWYd3Jx-zmn}SaFUXo|Vu7QIy z(=jgN%T&|P=u*A)$A_1WWwa`sn+go_>pe@u$}JI{KfI`7K4yHG^3GrLMeO!#Reqtc z&b?3RSl(OGpj+?`F0n`-p*0Ov0qI@rPEQgbb0K8kAw>UDx!=wG*d|_0E@WR7G@Vfv zND5+m{E9feMs3b#`l`r`Ej5$DhW(`Ed6P3>C1+^;*$xeYn zl?DyIb#0M!h3k_QtCfB2!pClLEwpiF@U;id>ydqm#pi zi+nalzh*(vjmmk~=c}@I7l7~N(kX~`ju(OD0hvC&Lm7ZlCi_k-mtQRUNa*f`-n@Ae zZz7IiezHc#vBqJn=yT6*=7{3pCYRqR8StG+r8~}rcJj9ZAzI$h(}+NFhKDo*D0HsWhA$hsbVBVfUL= z`AQGmf>WaYtP9gcfUFmKQ1-za+p4fJ*b0B_XIn1#_B_(1{-RTO5o>uzOi(4om%3}X zEWI#!9PHITJh8t{VRN(vK?$!(VX9y)#shu*w-K{v1ns63(zr4b zYWT*K_0ltL@p}c64oeZqVQ<57XoW|E#DBYJE%B(dirgN3KvewIpNR0>)k;K&wBXbn=jjqX=o7YV$RfKz zzx8HqggC(GM$v}tUwCLA?jG#l8s9L&S|DPfM}5n+$W!f%`jk_o!ky%gsvx+Jyre?t z3jwbraa%C24A9-O^P`_)e}~>|RS;{bHF}Uegk^Lz|u%fg6-c1Kvx}^ zKz+xE+n|x-7!=_Q_1{fo&i>^@@)6nQU$~7p`RD6baEglRb8v8= z=3W5B=(m`dcq7|2xla_?{&wyX*dM0NulFhC0hGwB8xKe|!BUkAoJ{uwTCCBeN7=wB zup2K3crE~rqB97#VMXK`2uM2tN(6*>YW$MKDWrcp$oqHz>>8y(soYq-1jtA_h#DBN zz%l87G5|3L&j?6cu=CtM5|E|QtfCD|CHMJ-V*bw9OW_1e+<%xhd>wN)q%+qHcAElP zbfPr&`%C|GNZywtz~X_TDn<5lT1|;#k-cio8{0D3?`ZVLbjKIvI9a1j8z zr4m11AEvEYW#cwYik`F0g>VN$UjLtF|MgQq8^Q!Y9@lQvdK)PV%vW8{xq$~*H*EmI z06_ky04&G-L2&ay6TI|P44&PA_K+Qk{bTS<=5eJ#-d7@5SCf`}nS51bDy z8?IljvkKWEjVf9_4F09!**Tz*x>m5aGk+sEDgQ=^JP1IFiHkERY;(qNe|5BQ$EWi9CP2MoPbGtPJf#}-Qm(cC zc}Wv900F%0Qpp&vxNezEjEd-fDQCkdrK;Fx9yXZz(!7Z6>B0KSNN$vo@4^BnhE0p7 zqo+s9-Mx~5Q%LKiwBba$vAQ7xaV|lC)E1g2{R3kSM7;+Ujs6i8qMF$v(Cpjs#hTgI zQ5=%{(YcT^C_-fE3@z73IMa&6a)Imi^RLGCb4&DdMiX3G66v5TG0Pe!d9LwL5)u-d z=`2|MZV(X#2pE@rV>NV1g#p_0$a8&vw5t?BPSj%%E6?bh!BexwHx1nsM}6-0DvJb2 znHXr{%v*n0p^FRu-;6O7hYET6s_bOib?@ikCFl_$egLjJnLsQ^G+x4l%U@JsO|PkQ zfH5tUUtOSVz@8-biL5@@UqOZYmjzPTEcGvUC15jIR@gWfc80r4d#1Ot%g+y6_}Uej zo-;VrHz(Q5<~?{V>~R8Jky+q5mG$5n(yruIywS-h$1tMQIhvFomle>WNxjyge$Xyy zb=ut8Wn2Y%9Y1+1B`&SwlXA4nv`3irCs0fUg;fpP;mkJHapI(legRvrXQKWg%)#sZ zO|O&;5&J}<}$jnz4(qXuM0Qm3_pm zfOr1x!gqLiQ-)2=e#2ncz~qs7*YTp|LcUS@RvcL1FG;X-KJ6(ye`r#>?l6^K0)=KX zhU3jVZFLhK~p zcNikRPmZ^i!r`zuI$_6SAkhz~7A^5*!rel=IaV*budxES%1#Mg6O+&9;NuY5$98F# z1qh~eLJrY1Vd!hD^b8E^lk zJW#$K$Nl?RQ*8j1a=DPLP9xSuj=l$>DxJsG))!)p(Qjt&a#9r)=vSynUhI|3t$fS1 zPb^p1aZep@z_(4h&MU|R0tRzX6rX-j`5q z9tggHnk$GU17nvUnSlZs60-_!S;e@kWLSrRsVb-dK*+2NXGhj~0q8>V@ZQh#Nc6m_ zSOKmO`M{{LpM8J4u%Tn!I>^wul}fMF>VreWx?B7f%1{Kpfpng4=its?yIxR&NzI?V z8*Dq=rtAQ1ZELd`_%2<2vVx$xp?*^XV6<)4#=d$kEa;fY7{IMPAd2tkg*B2zU_$@~ z`-@(Plsqpo$*hW{BThUhnMuw3@x#n(dCz)yAD|g*hO<5%M!bDnx;ttF$HH(wJ00#; zuL4QUXkg@RtEraxJ+!{#xJ2B+5=^rHpqs!_2;*Jy$-Cm)dP0Jr{bk1gwwnW4puKD-LZWne&Z$uZ?PHhl>}20Wt3kqsd~C~=;=qOWtS$ia73 zd_C?W^Cqu^W(qW7xQkJiYW7tZ5C;WKPl{XQJ-P6n(`LoESAFbXUt>J)UNvke9G#$h z#f~W%pgasE%8wZYU<%irPPWymrPQnLN9~M0 zN|6#LId!Qdw}2?fzC}gT$3~`WM&}Sc4Ug4&7E$Y$VdS~Y3Z%xM(Y>l?fK?wZPK{kI z8#OA4DeiCBs;xhoyIObLmdI!Fqp;yT51&FrEd>5#>ahNB23|NfKW`61c%+`}udbdk zE+KS>El##tDE0^CnL4%N5~M1<4mavol^ShQ+V=*9N zCN)H`8=V+pRCgCW5N+B0aSjYq(9BUF`8w7wp^E>pmsy$Tu8N1A>eVkhsQ#)#JfWoA zw$F<_aFaX@PmLCUeweF)fn>7Xq$dePt$jw^B}V$7Xqwp0pTDv`^Y88zC>abs(Aq_yCS`;)QabI z7b39f)GIJLMydcGGp4j6rxR4lN*LC%0g~=uqEh|cD z#^+0xdO*92z3b&3k5IYPhVCE89%t8!qppN5j(w1)=g@3D8DB~zyw+{o+`+Qcy>7fN zVl%>C_vE;>AasI zpa>L|sbJf455`y9Mp37m4V!e&o&Z@IL*%-Z?C6cV&wlQ3@l=df;v&W$Q8o2T93qvd zifWWRY{P=d88|5|{7Sd(VoFpJ9>2H*mSidVy)CoI!lrE%3b{zZiWT`bjd}p1Bp{@! zbw2UVW@qZ5TxK+b#&~TzQ|wfFU{8M78&$1vA^BL}$+S~ZKb6s}8~wQhG@Mm~=@o>4 zOJ56Qkjx(n)@K_dox0zT(Y?R*c=Sxz=fk=8j)0ekOM_yx_jzcOgZ3iW#2Z%_Oh#9&98>_OF1k|JAzW!U&X+vgo9p5leEpj#}QrMLAh9yQu{h}bL2cwV@P zemb9hRTMcUOQuxQLcS--;9B#=%hA&&p?D?*;fY`PaVeF-XEagReAw%qtIUEV6(d7B zepcje@-F5MWPcR$t0MG&3+11gYrw!Q_V^&wtzr>qzKC!x8+YyqJu>s8{?s2xgfz^U z8)^!Ha<%WtB5p%K@ylKpqOgM??>szSaX%_j@&irEVIHCuYL)`u@Hkn{PIVn$h|M*e zEN*GfDpaX}=B7Y5gx!t|p$%7gE7dSQhsk93dg*iT|9sp+K%{^07$R`Uhwbd{E0ershBD>l$Dd$Rsk%5U{7-@K^Z7XeSxy_d%C;m?8 zRx1J0Lq))DFm+O^2!?1*a;oWDZb!_Z45^m4L8P(u#dmD8(d0>KXJh~mHRsvNG@Ruc z>Zl@dL-LeF;Tv`#$Lm9_`qH*^BD^tVU?ImDyP%#JE*+beU@|^b zWjHl&xycj|aO60fI#QX-;jVs{4ibPaDgi0`b0PA|!Sz5x$=yAE&!gE8*kZipN+?@u zQ9CDP(TwDrFLp`tLcRa0=VcUxdx-4mt0xBU@>kd@V;-qk{gt^BJfE+G;j}Rg9C*8g zK}As9<~T|FWV7@04x5v}d_wF4!b!OG`uFze28;X^3^e~{1Q*>vY-zy+$b2(-e_X?! z@faCKx`KAXSqGs46QwI)3QPrW}U*4H(Dp-Mx4u{_C;$iNQ9 ztC50Lg^zEE5^PKk&s-*wT-YOvqba%Y+tzJwX%d9sDSZ6=>t$Ikdy9#V2h)~tTm%Vd zvwD|@8(h?AWO@Q=28bE0Iw1ISV;pPXhX_C?5~}Q#TMKi~@>hy^@z6jnqd30Vt26Nv zH%zh`rd^|zd0^|{VIZs+n|nSz%DMfGyxul^XQ%AofGy^*do#}u0}I<6L&G-;9kljm zjwju$PUjZ7E=+^w$Q?5)Tl7Ty9$YV&?zL7VTs6jKR5Jc2V)ehQZ-5W)b)aeys9mh{ z>Zp@tCq()bET_M|N^Ns?v@KG2>fvP;6BU)dl;Wd8$)-{YE#WzL`wHaurkmR8jR`R^ znT$(^?{nWUJcRh?=P4^F?CgK`sX6EZ_%sYn(ZR;Fez=70Ej1v*fv^f5xHTr!I3v&o z;xg()f;z+PL^@xH{PH_f9epw+Q+;GZsV_A5Pm|Vb#!nsPi*|>*u{p zO&zC1Eqg7pyWp>0Mn2Jc$5bm}RYCmsTw=icn_Gm)zQ3B>$U)ig7r9zR!6PB1k|LA} zxU1=r5_v#?*F(O2I^<_`q8PaeYUzs?l_#Qi@~_hYlo`l^5CK9IBODh`kdd40A~* zJ(5)hWx^GWhrVQ#-tzYiWW7stJzcL@omef{&%9`JSsu!CdovXfbfqhwCz;SCF0wEJm&ApQ#>M@moGhX(>%jDdQbkNU zicPhAsYg*={X}vh$hD-aaT`5j7oODfXv;$CpYA49!&94`As|u6YUU<&G$17Pnu2X zeP5j!d&&6KJ0N$Gg`MfdJ+fcw3zjOQ$-SP{-1aLBHYLjKnqux*KzmO4aUy^WAp;!z5DL6rg93} zzkFFLRDtnDg!9xsXN;7mHgF2iE3?T2*r|?J*$ACNwD{pnx>23yvBZ7K+7$QZP{GII z+utZJ3!z%Wscq4xC2ObHl2yqv0M0V>ScnmP)!WfA03?S%DkA6=iSfJeX}ETSo|-xv zV9Hm=Oe4#v5SOggWx(?69qstmVPg>ap15Yi>Z$cit%sZ6$=hY1(DUqA9ta!Z-WQ2( zJjWRLXVEz{7>rqsMno@}t<~*UPFDXZoTQe$q1Jr{{=H1RU0fwQlU2utz zj+1@V*}`epV=S~Sd*V?)38Y`b=&QXxd$CcV3kW&*X(@~AFcuT-ZlZ&_&=JDG5T22) zGNbSEphM0Y?s1!yH8*ZEWL~K-__1+YGJqTQTyHx~4}^7%a3pMX5L}i}xy|TM-U0YE-9xel zRRF%(NFUqJcoFs3V(%{j>!GLon0V_``hiBr>@WVX-K(3{lNU4lwuWx}=3ryiWbap- z-&Sxbqig1b1U$|qS|8_biW&_*J0Y8oIXqR66UKEZv2@@acAb>RSa*+gaz5ywctXvn zBmY7tiCeWl3NKGe$52@2I8lhGbRR`FzIC} zYj4(_WQD2_8{E`Lq1t(*27uKR6ubv@Ww$QP@Wc5WegaZ?j#DUT534( zmI&;}4fzRC-;?p|17Rg5C6s+j@XV}Jx0mQJ27pfh5a!e9H%1_I%-?FRbH9wk^X%Gzx=T?49%2P$XbcK{xE`ZV6A3k$p%*2UHd z{UfI^VuouB7+Z?5PR-tz_`qu(`JGIn{kQY*2#}voI@eNt0m75Xa)$7K4eLK?selHS z%Q6#T)Vx+vxf4KZ0YgOU2zUj^=RmMrO!%WL->HDt-KH@Fc<2f2@$TLq!&H=PqYfb1 z(Oyk}oTGY1XuE%evuxgblbw@u2*5kmWd*DTq-JMly|B2w^ku-p3JV>tfyQs_N1%)8 z7JvL;=lXw)y>(PnUE4pdbVv(GOCzmxD{-*fwd0j?0xOMuj>=nVN(E%88B1j!SDY~zW=W=P-#Z7-QumP z>y%My+Zu56a)Jv7qKPnHvw;R`wB=*co`2)5++K;$9E%Xr;&{k~5tQBrr~^z{P1V)Z zBunk8>!pBDy5pR>zZVTW5Ec0Y+Q790I7uW`fdM&>jl`vcyZyyA+_9FMsyz*Eug{J- z0r?Ed0sx~v1NHshu#E8-e+Egwg?z=CyZ?zghvSxJ=WYYw-Xjy4;ynPDl8}@&Ujl*# z^$s1cIo%_9R9I(wz;g`j6nQWYL&^V8V`;Q$MS9nl;>ZhRzn@De#xGW_j62rermdH< z7-amJdhN%G_`hO_H{|Es- z^*e2bn$@Qcc};lIgL~G`Kolh;kq_-Ish*`hAkgD!PqP=QwvfC?oQH&(M3N$?H!5qVDzzU|%8d-}97zKT)+z8yHT) z4EXj4LGtoWfRPLYPyGa%ZA*ZnRZMwI_+f$f6H4-F0Yj%w`9BT=!tn7FWpPh_K($FE zQDjGY_P7S@qAX9+^9w~DiEQQ9_WTk9{7SjDt?DJ>-%jD*f3S*a+uJbWvn(oeL~zNt z;LeI|bot_f_Yc}N;1lU(7|H?vG%2NiZn$8(9ILvHjQ*-uJw=I7BNsbW%7zQmGP8Ir z@MI|8?`Onwy$$g{y#W4>l864#p>~~3QI9(HW}PNZGV&=dV}Qp@J-l8L`u+a*uZ^Zn z`7t~Ip-}<-9DuOd7_8djaORU$i2222c+#f{AbD$Azpu;wMbd&`;*&nZ zV+NGjvHDdrrp5(GVaaV~&~>;|Q(@ufddqM4?R-BV9hLtSGkyehMPv9I)qr17{XIZe zZ=w_f>W=Dnm~6I26KXkQLBIfo{9%Cp9u#VSAVPG*Srawj4Y>Tu9HmAaV(75xGl_j( zHpf#5gByQOKFII$`M<|4`y~d-U_1HV!vd1TjKJzux%p2MaR3d?3#Wk3d`5_{u}PsM z7nc7skuUYvGE4=GiA}(Y)`T~FgvIwaL{5JSKp>3%aWU}8w4oJu;eF3|gCL_5il&7@?yK)m?wSK;E}eEB)Yaz(+{o)jYyX=RywfSc*9X@&2gu& zXfXT#c`GLxMFEHbJ)6-jxZtIX(h{&Y@~yFT{Qg+|JAnMymcZ~-Z-889)qo3ERtUF4 zfq3QL;pmUoL_mmg@iqE|1-&@I_|z^JDoN(#$} zN07oj_Dxg0ulmqiC@TH`Xb~6~qvzUzhI3m(cnckoo{s zMdGL2T$h7(bj^AgkTHz`(3}RK6b7u)g}swbf4NBi@NW>Rcl+2KX9kEiut1fZrFu9z z?N+lww6IDuTtNOH>;+u9;ih5RhPgY23YJNFTM~0oe2G5R4R{ zAfAKC4BmF^>KuMf0s@cO5Lk_ndjX!KBColDlWZwyF2=XbN?2ei|30~({gUnF`Ssc2 zHXyby1p0}%6T$bAqR{^1X#0<^e6O;vuqM`-Nre0%MR^R;e9SwU`|s^Ksm;Td)SPK+ z0Js>a=Z*)ugw6LTfpjOkBh$d)ocLlTl54!l-N}>cJ|tK#{r6PX-Lfh)MgsgA1&^Py z_fr%y6)+{H239v=P1wtJ_V-wovXxr!iZfZ|1t4Ap?X92{cW2o*rSjS2-`Ksh;9e*$ar9}|dhS9)WY7tHHO<`dnOZC5;cxwx@{TmH$y0GrNV|M_^ zb$D19%UBEG^Ybmfl485nD!L=70OGOK-r~E<_Qa2kEFZ95hG4bL7+5az^RqK&yw$a} zACttbR-g;kuI_Fa00I%$xRvQPx|Sqy>2mUnJHo&v4~dArXTJIK?xWIqC+1-Sq%69E z#KopbZBnj7Zr^HOphC!Mheeh`@&F#I>1#Ai!I-j$J^)gVkJlDJy)REqg{=byDu={% z?=%+F)MxN#&z>DGA>*OpXeDzQmgY!>Y=zSJVAKr(cF02G&X7b*9l+M^0^m7HOz&Mt ziM}rQT<-FJbBVvbGYz;cde{0~pJ>*8e2w7=DucaU4=zzJh}r-3{|H#c78AgPeCI?c zZM+d)G$g8HHXlgML;ouJm?)`1!P&VgO4<2!m6-FCacB|1SnOF2`1sa@#6Bujq)=F( z=jR6pqT!7qG!1Po*ZB=9-i9~({_O?aGyYvqg}+xS;`Lp2{rMB1sp}#xW)=)D5_xIw z@Q%EW^`tNlX~IyP#U*oIg%D`JVCeNjM(pP=qEtbLPk{d5bF!g({cBA_&lA3R&;4d# zfo3dZp4J$=TMo{?zuggx?IP7mp`oQ!xX|ng1KQ3!OU${Wp2^0{rw;BAuk#LBBDIBg z-=m?LWtp~h%V<>ZhW+_hy*#&OT`}G`Wnk(8#=sJ%A)(2THt&nm^0R@#-U-0P$Lo1& z{n1_;hp8=F}S7`+cGG7$TI%(H{vtbDT=FZ?}<#|sZ`(v6$px@9@j zTFPSA2}&ZnReq=IKKT*j?8;&%33s}1NNN2`w*?pT`rZC;uGTBHEZ@`m*ZA9p zhzr2GF)KfPM>C?e>?xLBPgbW&__pjlat*yW-QA{6A~X1v5U*T*e_J53^+S;#Uu04C zuB)p+qnPKQwFphgyo15(ynPu`gU@*i$um|)0_!=fNlw@Q+h=#9-0blEWrqC~CVw{HixO>*^u8ZngRPS>tc$;KfZmSM;-*Zc5CEjj_p$Fid|mgEnZ%@^*$-E0DM9^zkW*c zSx<2borGb@5O1~YcOO4_O2e;q7Clhu>~XJ|zMjn6M*F@RO6 zkw4yolun?EajEnn>n7EYKiHqGjje4sPInp_Ax<{T$&C@02P$m9ZSI_{KkMrHZ6%h( z=kp!C?!f zgx!(K(9-5p9Y#jRX_Ff+vsWfO-P^rDN7~_TK=(Ka2=qX!56qjFa#5}3>dI|yZi>%b z#uNpn-8E=De$jqB1A1MIf59X=>18XM%840x-@P{qNTOUhwRi-qwd!sqkZrN|XC5Sr zS{)a*1@6%PUP}s$jRxc|V!MSl;Mz%}RR}ylL`p2o#T3T}nH|K`iku}Cf&lVZJ;`@Z z0B5*<%U;9w@iIEi4A#Ky^_j0L%Y6OOIuuY5wlHInz#F7Ca2uUcE{=bEhvnx@{ zwvd?*w9~KzBq*nZJd@klTuu1+6}B^VasXgfDfNg8*bQyW116rR7yP;~4?r~TH7NiJ zJ@^LTfw$}YH#?Q7aqEZR^|-E{bQuymn>sZEjD%NS!NI{rvqJN{X8n&0PoS1Y>!y65 z5<6v2-SvfkSPIp$OH4o)2Z~4%AqUG84h0Ut?vFK*dc{}BVsyPbxwwPhii(Pwv=l;N zJIqnLK-fmWZsdJYRKRCDC#diBvx{8J%=!6c?_SE*s8HpG#kcpgGcDeYnVvU78D57y zFSrD9cG~=rO)ormT_$HB6%`db+}(G(E5Js1oVY?AuA#cKwGb}#``a||R7n5(PM7c7 zP`CXBomSgspcj<$W=<#?RcYN2pLdo0vSc)kgaII!;<8v2{BLbg{@?tn@Sp-ct{j$& zo=ovzLL8A}JB0ZqMnnkh+nkagAX@_!`q_Kk<*gm{c5*+GI1xZslivwg@@+%AOMr88 z-J4q(Xhd><2zc1*tD_;8HDb++5K?}r&AlHh;LcQ9SFZZiI7d64wUQ^~!p?<*V*5Y? z+i&z9XY+1+2kZXAYcvI$)8<(mPWo^^1Ww34g-=##(_!zk$prBOK&rM?E=yDCG|+OK zl`NlSM)U7V?7!7%*=X2+bU0O(R|uxPgWulGFVWs3rzi*c83j|a-twy2qe25&gbHH5#;;J`zo@W85A~~CuB)x&)_Si0|9bZ1cb)7QeaXxV9rrK!C znto^0kL>!$SpBCJRI5NK14>(qH-gEWncWl5d^wZaJ7u2f^A$Xm8hAroT-Lhx0MF}8 z%#~#YP}P7H)A&GYZ{i5!33rD(*0ti96ur)#C03iKJB0MxcLAJBqqpJZBxV;!5~n^? zVDX(gGCIyNXoyq0;>&3@AaZ*q#qtk`frj#5?KeiRfObT|&>rP^ECk?=2^?(Kv3`yU z+4Lm?254^&vlrOthnt!`Pm;6&XPycm#?p{)et6w-=;nR+lexFAZwyc>JAe11xZ`kK zevHZhT?4iOZV2%~mb&OFz^nOe&+`Hh61l8v-!bQzaD9i+HL;stfM(2UzQN@Lk!(19 zt_8?Ri^+J*r&x7)1hym^Z^jmY4!qP(J5PK67avpx@IhjajrhEuo!#zK4)uEPU~@I7 zu_aiEH6r{?LTIBUu-z>#KFPG#r$QU(ACth#oMyZitr z{~VyQ$5myi?g+Oj?un)$0Yl$hKzl#kR&(qH&;R5){!R5_Yr8C=o^Py06EHhu@YMWG z`*`*@rFce>iG2lk40@THeWXqH#`yexpRaa5GRyE>s2ASuuN;S~ zN&#Bh-Uo(Pt+zMIK%h4Rk6ZvuG+$6wQ0bq~>>s;^2bf$a(!nEF&(mvPYcypObYW9|4_CJ7u|M*(1 z)TRMX1^jdA0QN&I^r7To!Z5f41dEoB;X$FmT_ADJg{{96EP4khQ@g z9eV22(0^lL{}os*jQf`?-2oN0uhcT)>rHW*&}hB|#?H{uG+#9m34oJ9fNqgl)D-`5 zQ~&3yiWJJ-hQ&N%1Z9UXmZ8p!**$GLG+`COp5~-)@Da zp|EbGs05($dsA~|0f^UwI-4cB)h9*E3*L6YFt+8dB}&*EAv9dKZDQ>W!We>v_ZlBQ zEQCK+?j6$1Iq#Xy>(HMCrPPj5JGDHi(bm#P=*V4pNJ0fW*nHH;-`!vPgk5y*hDEf) zt8%A&>-lpU0M+!L;WWA#^1I$|Ito>D)ry?=e@G%f*n0GL+q3^OG5#|Q0C|RpUoX-@ zh23WZ`U+ZIH9t`^-s4>Rd|OK8%dWog6^C`M1r#h&0eYVX`xM|M6B5iuM+XSm2V;po zhja-_d>B!JlXC$4EJUNYau=oase{szj^=W?L&U3BDzB}iWZtP^Xv2Qi2A0zMJuk#c z;U15oEZ>L}P&qNkN>0no5OEXqB~>r16LxvHdv#wi|MUB|Ktw9$K##U{ zly!haec`@ub8Aa=a2WqfJ^>8D@3s5Q_2-FPQYfArk~fHRqsYUfg!3*h)Bbmg?rHq6 zVIdNNb&V|H#9m_p<3ZNf9|#DPKBxs%?t5M2>-1brEpDeN&rb8gkT(3(ugJ}y85uM} z#@6FGR0+-tjDQEEzvla2km*tx_Cpd97B06?taJi&x^!O}S!o#&UzG1x<&ikjyRGSN zw@mAcw@NTd^UncmeMvyKw#A2J2HA5>NL^pYRXblsJFCC~K>`cs^klz%+WT2;27qp^ zwfAJO-D-l#%>);mWnX9~*eSAZyO52DjU6xD_f`2-s<#M#j|vFtP~F`J4~ErVOV^dW z!Qsh)ojXWs+RaxSVSAWY4u3uxBw+SURR7MZd$g)Yl$r4P7h9=n#}Bde2+e)`jvOV) zTVT2RtB`8du4~%NHmE**IuhX+Vi_AA4RU^6{3iVa$|sYR41$^5jMfw^>Z(*I=xG1I zYa&#c=g#)<@QvkK3YAM?cb*ct(y<_NGG)ktqrdrOntZ2Cwp09YxRX?fcjF-9EMWivJEyhH5DQT3xOJ9z5=)U z+=b}QKp4PN)zJNY+Gdi6zwFZYbP!oQW@~Q6+;gPV6$Easrx<(ih@1cYm-i}2D3U|S zYL9bJG4}5RG;~fdA;x{lSCWz#*LlN)l23EULf5C378n#NJPb=}_AmE}%}T1lHE(qv z_m~q}?#+1uHS}%N*Q@pZbMaz>^QW%~pR}<{fF0oEYtzL^>;=gF&tJjZ>MNIjl7wUP z3FT*+R9EL=W^wAXUpG80f}+G&GY5DR)G_kf^ODQfcu^8Xc9okca#%qqo_c?MyHnoX zLMW_tgZ$#M&8$)VEjr=j`@j99z)_xI7iUuSwL{g_Dz+OTi{k?I)ZbA&AQL7h)uf#> z6PRwsoKd(vc~)-WepZrIwG?QrG%tHbQt@kHs*-5T3`5Wt1{G;C(u(gC-m|1fz4H;L zqm^iw^hGi0W~#G6oBH%LoAKVPrt2H#pN8y{L&SxHJ$R&gdP=;_oL?{(QS zJV#>S7RM~ale;=>s(zKZ-647Y&6GmnwIiUggA=B0^M_UP=7(nYL8 zk=h-du;Bx=Vx8*ykjaVcPoExM4vOD%Kku4NAxnGZhw|Hx(F#%B>Jn_Nxp<0jt*baQ zkgvcf1!#b- zWK5oVqJ*ex@`~L^4jV&YyEDhuxnZrWsS^yj(A)AqUYN$c9i23`)WIuwfiiJwFoi2Y zo@sZD&s5+!g#>dfWzC`Gimku>+9~!$DDEESjxdsqjm=Cb)AQJ z4CPHl$<|e~cO1`bn4Y_9hzxvp8(Z#|5yfdrwS?ZZyVhxzZ?5eat3!*9ie6k<-e3(y zNnvuVC3!=mNbI3r=s(=U zeE+*on;`xB>Gl~KIzbms`KO2^4ddaYrkUOS_y?4)(IHsfk2nhH z;sW{nwdP+2EnG;v{YV$)=GN(WK=4gy!!bo~I+e{;@VONPQmyjQxfC~)YdB@KvNo2 z=jPZh1=up@6a{rMrYj~oW%!pbd8~$gg(~~yC=uT0_TRes#17k|4N<_20|5rwKm$?L zpxGc2&Z&&uj;Gy}Y)HGGX*asje!B#L)tT}Q5fmjXsmxaemOej25I8Z6U+lE%3Dw#rq^WAU6vlu+jxIf1`RmixE! z!9;G;4cyuG2HSbzgruYxuJm+{yXoDbLpnJ*NdZ9m_qo-zd`9OLc+z?}kU>!3YOQPi z99(3l5H=fCT579R0)CzG4AVAw6@*jWK7IPABhIP%sVMRN*_&@9wNQQW!VjDKsozpL z&J8&#ltnY~Hy~Q#jt&um6f#ZvSbNz_W42mR>wX(# zK=8HgNj;8l+xoftIS{n$87rjKeWU-mXdSJ}=TIDMa7kY$ZHKc~H~dLbcAX^GaWHxL zV*_aiRWwHN1zwakr&b?xr$xLTlvMzti!CgnkJ4I|=G14*F;7&}BpCz|e_7@8B>g2O zCgpa3@yx=v^94TcjbAMAnCr#>9)|mbkC0JnnBiZ)KebN6Gqe&YiO17M0{r0+8p)z2 zgi--Al?~PAE>3pU>%+Hw=WiR|aLZEQLv&G&HF9%@!UuASEbvG^!3(t{Z!VUc--a7e zO!^!;Hdpv&t!vp>{_x}J%YR+EnZVsKP_i4>#~1QF<{HgxaLVby@XEvAZc@PhwRFVz zo=|HIwYawnn)Cv9f@8!N0hu|LK|EUZbvVx|UmQt&f6@pc&39X!n4%x%g7Y`uGEFRc z@%6tX5@tw-c4q_zq$9n{-$fnTkurvB;TxQU2mNyC)X*wgTRyVWqE$lRglTZeI@v@A zp~dtlcqcdc)zTB}#8H+yDnFt+lx!u<@2Pz6*^a{<`HPjm$k-t}&_yd{DjemNQ2^mo zW*byVmq>ei;!|EdwS#-6ES<5#XW=T}a78m!DbwJm^hI5jVm)m4ura5kt0@mhOk*%7gU8A2g^N`%}Q$-z9ranEM@^JPZh<_Kb00WUjXN3+p#X z9+mKaIXqHHVN+tlB(OdrZf_pa(_+h~ZE_%viYpu1JfU4!2+CZeX*X;pso7(4M%YU0 zR?;X*A-UH7+F}&1VC?@qkKx4rz#Q>lRo@Z2AC*z}?bYrQSs4;UQWA37RQurc2Qi#v z-Fkz)+t;ZsPhGFqK`WBs>PU&xpP27i62^(A@JNiOHs?-oq;EF^VQb2+yv1wuV^7-LsXcJ6l!OBv-!-AJQQJZPWG03Z6(ShRSE4Z`q|E%&0DqZB(8k{HTE?l6eW_dl(UeR%RNYb%&+O}ga$6_Q>+_h%EBS2bCjd=nyC`Atp zi-42Q)RDJOFiEHK=YrA|`AVWO&>6X4s}8%0U*5;tbU%ot00%9xmPqg2UOh;P>oumI zPHLMu?e?Xcm`)?_TY`724g{F&7uol-DlY;2@l4m~x?Ca_-wSX`CF6q=PMwz~ zJ1u-Jo9=6YwC0;PGyaCZngv%^U0+BQ3xuV{mj&7EYqKy#IXmOX zs9~Kp1GPJ?-smD?_6K$`i!Y{SG{mjXwd)U&QxxMQbTiv=dtg@YE$(ma_t-|Zn?-*r z%AwwG`T0yIE!BQJyg*KVmz~$fR@&14zV`AOx9pV#jt9IY_hEB6B_?Kibkh|jyKcEW zwwN_9nNb`II;%NM|HkH9&p>C+QA^O3Xx0_ar<>gkNu;~f>o=c9y!(uBCXi}g43mP; zr|?I(>{(^bqpNXM#jk`w!&~UKIL>hB%XK3Je)O*4H4V6BnSq!JoNhmm}$NP`tSst#gBCy{w`zM0<^40-105YzkCXdtjp#aL_Jb@*F{Fh zxhYV#aClzaIgnw|a7rK;n-bW>L*gZlPGz6)RU}LD?b^!(36BBzd z4@*-!QXZMtA;D6u*~#0Xi8NOA>Qe0n1TRVsLEz9Hfeijy#9k&X=RoGw zB1tw2TZ4dNz?{FE&AZ>jMF_vG8c{if88Mo6$#^A>+diQI#9Og}vvQ!|;->j1Lip(6C$wa5Q-M{p()}InK7?4HNE|3!DR1=MuIlx`3=~z0f6wK2wih*;^ zA~3g+s6GcjAcy+hrLc6d3+>rfRy)6C{&UreCh@7^s1SNM_~wK<_|8B3W743_+!VciYv;!-xes8&|J`J>9}|VPwxi@ke$ohe(5hXLJs* z3;b14AgSt>S&%1yJ#GlnfGrg<$UMi!N3J!p2=IlKk3}vmzLC1s@I%D zxy(ezpmdqs(eVc{QzydPT~-`<lZZJO7iHyd%hgzZCT=5vfO=7i+Y-3Xo zwQ7eH*WN~Vn_zsa6zE$cF0aBpp;`2MHR1p5kjhWMz>6|+!9xn|S$35pVS1^xbm!Bm z+UgbE#oL@!4Unw{=3C>6@87%Z+JbPK3pd){GPe~qj@z52Te{xpx9L!*~fD6?b0o$#-Mw7OByrBSGy&t-7eQ|YLm%_<6K*PDZfBA~hd3<%1Vrmz0e4 zEoC;ETX`DMHr3-aM~X`=cEgMxhT2aodv=Q1?fdJG_Kqk?G#L2MELT@|h+*}8enZf# zu$&@BHgR=KSwIhDZ#pPo1l_@n`HDvgfkQL?-uLwm+Kn_z)pN?mMeT@#2=bmD3cr!H z=ZhV9rb_Kql*ROz1anW^Uz-e26?KwTQj$p>eGM>n7QbYobTaDztNNWX8_LpA%Ipcr zTAu5OWEuu7F|#cTt+CnfWjv4(n=4mGPwue5D9*Tj?_~YM&*b)p{T`p?((;la-FcM6 z{QGi6mmS?!vYX(n#}%d2Xa&R*a*RO#q+q90-jwtoIpMO7hEH5?7$L)FH(1gXGe#L; zwEZH(kZF43S{`=RSer8#4XxT3%N)JVrv0q~HqW{dRdl&5EBs}n$H>W5BYco0^m0jC zC8x2vwLTUc?q}imeW`g#>~v}TW6V0wo6jcO@#Nuwpha23?(eFYm{-E7NjH?|oIUM2 z&iGd$mhUc4G>zjnekQk`;-DZk|GIQiremO;P`+IVj;rN6Zz?Xc>&S0#UG1whjV1Fm z>g{)52@yEi&_+nWW^QDkUFg*@{T?BC>>vK>d0#tgnSA07W6!QMg`%I37V}EtptI8T z8}r$**tXk4Y`E~8eL^CVyv6`qfZ|+nZ@ZQKw@5dF$p-eNG!f9Bvs(3Zyrq`@ACenh6KR;#Mr{%Bd9NuzA&V zv7LOxql8utp{4OnL8@=FTqqB3wqZpMpqw9><^=Dqo2!J^j@9aoB1?sNN(^kAIj-<# z_PjLYF$s7T2ueuXEc&8t5YYT3Jsua#}MkexE?J z(NO2}F2#j?eOQ*hz0W!R{Z<*2az!rL!SK-h=tbv!r_Jk)S-Q*=V@_6lV-KDvCI_~DIV{54C5b~W^Q{t*f=PA`^kl`r-?PIS%wYI%^Fd^ z_JLI9^%?!bMD)_=P!+`Fqd`%0?rpEg*;E3)L>zv*zbVD=u?gn1b#3nIGEJvWN-ho= z)J~>TMq*6TBKhW`o7;5yM9OlzM&gEOUb&Sn$^`z9wB!Anw6hb>$|0>(`v7UX%P@7( z4Sju?#;e^6g*BataSQjTXeE(PHa6s!pFBAeTQ9H1>!8`v3;Aq&$-_&{GtFw6zA~aJxmyJxR;en!Hyq!D-?Vt~a^nqX-l|>dYSKi1X%I#q@Z`-RpeOTu{Obc& z@s>wn>wu9V9$=Vb64KWECb5-qAT9AS(}AY~tCzrSC>X(mQ%y0sv?d{eQ!9X8iI*OF z2<@>Ku3W-Hfvb628~4R|!MdiL_5;5vJZU0k9p8q~&C)@EJN24;~|@)u-KV9>BfJR}HCpHaA! zR%U*%N4d+~KnE@fmWrj z{e4kv>E}BV>!+`F!vd?fqZut4w^a!QHX`fXUvA+yv>7k@(m136+jS%Jy#9PY?&(LSM-Dz8#9XOMlnM95(Uf41nIwNWcOg}WoAQC&b6c{ohU{eV*7Bu4 z-(w{i#^V%e_9OjEswrk-%fSXF0>9j6u03U?!6i^`zR%>a<$zfk7QT+NG3*a~o?A&Z zTTC3%l}=ebo9_GS&R48YxW9@t;>W(^br3{oW7Qy=Y%qJJ@+$*<=zS?T2$PUnuu7P5cRbWJza>#dW>2^Yo_c_g&qWn(0O zSz;p>Ug#m!SZ9}rVO>-#J&i1(b|JjQ*`Pa@tLS*Ef4|%L9B$n9X|8tnOboa3N{nQl zep%P0ph6FO&7+!R!&1U3`NN#%Rx01sYVFFYKH89*vgDpzsMO8D$jO;+?zKPjQc5FD zgx!^a6%*^u>3ZZI;S12=6GJay(L=Y~J#77hnq4vMJU9Kq6Pkf?btH%?0hZ6j_4w6s zK*{UUzI*0PKw4Lz_@b)xe$6z`ve-7uKt}V=6q@#i$*A!r#G~Bvs7F0h7w3g1_NZWe zEfA80E(AG=nG^jVNxh;Z~EJzEK!w=)RSKtYr1{?TP8_6*weskGwcc6pLtG$ zK|$ccCa-09m@>{vRs8$*7BvSym&X-vX(w85sV64wUKU|+%IgU{G0(mD5Y6uX!?tqj zaVGN@8~(aMarAoTuv{lz6fjxkwxPm^&zT8bglW#Et;4e1BW>>yRNS=&)~4@-f@c|@ z_^QQE+vRB zcN6mxNXI*)^~`hKerHS|OznYHTE_Lfosl_jD{+%lr=I+LGBb3i^HdRG2jfo1Z)XjH zR6AZobXM;u3qV$&;%1$Sv2s&Wu}h6N=tc0Z-Jx*7UyZG8F2~6#2f6CUr85nuO(OUZ ztMfS&@Y*n&&!#V*gU-f}^V9HeB1afiVkg24)Sd=TtauO3i&~a*BWd%*{xs6$MG=!DAPXd=oHYH%Yov$Sclf_!FZPxm zBYm)}evZLFB49j0&7;B~3GHDRay?Jm#yPeW($UqKU8{+TyvIhf^y-yyBnSH5j;MF9 zUi|MM_&ape7C=VT9LXb;fVY!k6_Ysd^nNCQ?2mUOr($EPI2Y7iUr52XG^I!d9S22Fg$lgn z%0dXGq~b#PAgw>R<-|uOWN%~k%y0eY`UXSJQUcYkk2~_6Y$x<$KwNXV!Fh;n^wLm5 zt?GlWMf?%P4vr1Oquqq5+|%f4*WBHW*mj>bah7_%AA<^CRtm*$e5<}|+?*&WKA?J+ zp3~b&pyfg^!Vf_cHP370LXL|cyIr9;$n?Z=R938jwjR<3N$3V17T6L$~e=o$+@?tNzBx&KcSZWN>>gSy$rur$U-G-gMxlG6R7SCDY$jyO{=KjW< zwk5rr*bS6vlT_ke^!l+zj0Umetj7D;!$pIP34!=F;Z&1tBpBB0uGsCDs`^5lvn%h> zo0rc1pc5|dU#z?Px{Go`Es85su6sgqW%5E=vfs&`&TS}LJ-ZGDpd{8ItL$2I3W3tD zQAV1a=3Ju79X?_ZC@*z;oSmkHm)9k`j0?qAIcq#Qx3Pe#WZS@xtx0~a1lJurn22X? z7LJYZx55lw7-q3OXp-z-a8pKk+iK8LHa|7a8eoO0x3XFD>TN)&t;Ec%uyOKrWCWY4 zs*s|{!o<-A|L@CTfPs07lsu4lwodn+wMdZ+G(Mx7Es2smlpJL1xTRKZDmVKI@+r^- zJMSlW%j?*d*ZY9_D$bm@?<0=#^h3e5u6jAg!!Cw1bNl$ZR1Z%AA^})+9p&kqBnrj$ zaOK+%VS&+MAyS_Tdz)!*C%=Fg>mu67HHEYo0sP5P`9kRzTJK=}TOdGtKbkoU$*_M= zNvUM+6mwI4#3=f6B9hZyL)3+$Uudr+O??(eAktI)u##lX6;tn0SsAg7I?z?bzqPInzgO#AU^ECf-8&U~{37u;4qL-692gAZujfxx(ixcGICEWpPsa zJ@$EfmmDqZ;xnv^Z0C7bmhGdeAt2PYY(abkE@JqRdB3~}khUjEzrXOSfvT(+^eNMf zSVj8ypr%){)^6Q*zS`Ay7QK2&y{G+1`?vmRCxF}VkFm0i8`vm2Q(s%aXSy6Pzt7}riD&JH3z089{ z!R|RU@ySQ3@x%^2lbZIc9|{|mx*Ii&O0KrWxP^*)kZr%8*`vnfduB=PODu-$3uDHL z`0l@;pD?hmO$x1Ek#lfdH^Z~iB$mP~US3xk&v2r$_8gQ}ZAEq(zSlAPRyi})QN&jG zoHd2uvn}4=|@A^!6L&R!35QyN5qbNb5k)5`*ZiU6XaMt4_e1A zm>4uHcBcgtw5BtMIHV6A`-ArCM=v=M>wFWa6LobZ+gwcwho$^|$?Q)#TA}Nub6eDV z?zcQubH|Xnm=Ev!lk-B~DmC7#cshCs{aM3||IYI%mTl|97&2mAyaF3o?8664^ui#6 ziOXA*GhpHt@fds${bX9X(103zpu9Vxt$}_hY+2kFZ3z)EOQdzX&o#6J*nhqrTY^%a zx;!K2S6BcMXq_!UBG!4U6!HbPPA7%o^`qq#50kU1;}qu*@DZaZ;n=T)9tA_3lp(e4=&)YrQrM%8=?mf@Y_L z85QT7hW)3lV@C-EZNrEd9cGsu2pYjRf8!`eTs7dY`%uf}<#%fi((?5Yk&z0oCsFN> ztm8xw#_=le&C)PRUr3AS;Gem*KMH>p11cBNwc%bPwyamm&7i`N6Q59lD;q2*6fUHM z75APnU_5xH)XyMcWmDNH;wzqiz1i@T1MYftZsUBlF7&SD#AP+Z$$2LDb=WIar9+@J1&*=BHqd2!PNrynr~Ia|PC)FRx0 zXlsk#BumUZyRJ^_bicjjav=HJ#^CsMJJKJ61{dX-u$Fh`hczQmHo)5s%`!3tELNb~ zzA(BLPGMmGte9Q^CeSaTOCXmPR6IUuW1;m^Bs|p=(osC@n72qy{^5#FxS|vNEz*OS z^%*y(lmA>x2k8Zq&5Qw$(=VN{IV!qZc;02|Dsc)T< zB!j}u)Qt=&Sg+elMlX1A9EM&3WQzRPSK7xd7cr}1V)xz6y|i&&q+X7h6X>c})0qRoX#8MxI2}AcNVI2P_h$IkVk7IvHc0j1q&$ov|31o3j`>$gGD6!&#zZlkLr(BDa}& z?rQrj+3FYYO6gS&L}{yq@5G|+7b$)zD?J8w|IS;#klOXMpjHmB$x;R ziKl)rchc0vv$7%|9+?ho(j$e+aNEQ+wV}VN+X}=xe>O9t%U}n&2jyuz4n9>`slH53xlTJ^&7n5I4;62#K>;$SMD=IwU2UbxiYs@H- zK|Iyp28=)O=hpp*qJus$R;H6VI`Ikc;}lq0Ci|vrQb6`J>3? zJ@&erQ{ztUT3agM1#Ud2i_Q~@VKp^xG($1K=wqGzfH?QP_rz1WcMT(#?ef2F56Po! z1$uqlI9}VzeswSEwZSab37hKMC*3f_sfZDNFer8UI%HXY(Qjc=+^>imoe{YMooz$w zyYj7H%bA3KUh%`2PP0xm9lv+Ut6lmHBomfv-$X7UmQFu?>##T`B^Z!WNf&6+QQ|RJ zyl)Nsm*T2fZcm7dT5=k|1Vdk3$Ya}GMv(+%-bSCC(pFi;2gw;k?Todi5?<^0UOsEM z-6vMG=o8+v$8?zWUs_Rq@AUKI=J{+ZP~`P&8ddMt3Pfdoew8K+e|Xq(d%{brZKsYq zQP)bkHx{??w)d#b^Z13%QK>x~m#@ah%Uj>Arx~Mc{_*6deI4meti3)q5@F4xL)(MZ z^n{0!K%zs(Dc%>w>ODC=Bjl_6mZqkxhH7R!DkRdEiM>Mg0^*QwHeG#ju+DGYa)8U? z=Da+gtROzYLF<{D(QNVSL!GpYVC8-z>5daaS-t?p$X9+82?Nwv!QvCqb|7bOSTu;J zne{CQW^v817qsT-T@}oj5ks7n;i())vKeJ*d>$y@i@OZ!^61e|k1RG>&)E+oUV+*^ zzlmOyJwlun0B1w!2)Qn)Ry1M9oX>&y%pBTHMZ)>0xXz;z%HpjQdheG}No~+|!UQ}$ zesEbgbCy?-+k&TVBop_BpSLPlEu{^i> zR!?e8Go?djxa5sM>Z&W+-DR0FdU|?2UH4`UcvRo*PSf$)%oZVPbME7i&hx+BoU+j5 zO5OJ&TvnF(f^QDj8BfNU_&6p#u6OTjPAooj=eA_-GY6g+SHSu+MU4px#Y{@Ydw}~A zznQffoTD$Y=d0%Q2r3`w$f)pYXta?_{zNsnEke=a7Li4utx1n0{~E&6ds0DF$K}}S z&1($`*2y3|NZtDt&vXpMiWkt-tLtv_oYNc6bnAYP1gmihG0eleW#Bt)Gh>9moSjhv zCEd5}(x(MN)^*G88g*^Ox@oT#qeP3I?~vG^{iPn@HFLc(|w_uMzA8)Z&KzeyX77bJgpy({ia(Ud*3Up3ozUcfmDDJa3^Dh=y#qz&26kg4J zN#jQ>6`50a_ab22``JQMCSM0k*UWt{t!utmT9de^jSg26hQO5t zm#+G7jIFmD{*kn9#2=IuX(JgV@jOA`>A2VHeTw$Oi zg&l_@Q-aQd_MJq)RN-=}KjoI;3tg=!oYeQPQ+v8%mwp2+{X4W_h%v7&} zt_8eKF+Kq@&CF?@cspqT`dptGDtz^7A7-z>+)+IMCs}J(OGx`knHVoz=To^pS0kUb z%$X~6YQMn^y>>kSAORu77u#$rQ38eIIDHACRN@&PF6_V zU9Lb0OC;{vjBlFB;xLT%6Ew6rvvM1Y>$vXm9ee=;C2@~lR->$E$cqxUSF1{$zpjI^i#t*Uedw0E?IIwYjWPF^#uoIwToX~IGLGD^o#NS)L65$v9(kV zaZip#O~*xFAGjnuos*Ju?{m`aBN&!Y8Th)k`STKC&Z{F1UNZybgv1*!o214gpqN!= zg3?ADoQgx=i-$rXf8xJW3Q?TVVVlsNGg!qb$vdMIb#Y*k}%GB__Uye^-&+NT>f zlVF8_o4VWWrs?u)kyrkIjD2-j6!5mKB1$)cv>@Fgjert@ARsX?^dQ~cCEX%GxN*6*Is)qREZCk$Dd3yMyB4d^4euJ zs!uss;>X&>-^Cau$3BsJG*=y(?+`T{lt{Czx6NfSI{i3lhF&1xwcemMz0ud<#h}bD z==)hbs164MPj>SBTP4zbZ|<`s4V}D?MDwe#RiKjC+~AWbU?$f3+*iz`ADr_Q-MFcS z{DJ+|e*xcqRJ6z^D3&}%$m(5&qsv3CtNXwJnAM~&E%Vy5=%A3bvry}sl+JZ`Qd2lf zJVRB<5Du{h#FL%mVVl#NgVJKDDk*-X+|Dq-JcG~@Z7t}z;LkT1(yCt{l+}vf|1eu2 zx83n~(jEoMI_}7lxu-WBk{bHdH{x9iYYwJX|DSBIb5=B4uLDlHxm$n9FLrH3=0IPS zD>4b{tKn{@Xdco=+ePD{Z&gKGb<;y-&*r2A>9{rxQ<^ceHCunkCBLpCdgaRhrsh0! z_2Fa2^OsKu6?s@&Enb|gZ*8>~bv7zjDal4CQGLtjYas4JEF|B|%8$ys;T?+vcH zl3yVD2$03G+_-~%;G$kosG@|nd53+mI$vr;4CDS45T(w_&3)zgZDLCu%Ftf&ePw{t zRVPs8b$v+wQAAMtclw=tvp0e2Lc95aSkd_vQ>0HzYdW$F)`NQ25ScYo`^l{+Zs3jrm^#O+h;oPK_wA5>NrGU;S zfZ_~8RWtJY{F(Y=Qqu0;Czh9d?ERagq>cU+o9aDH;}~iX_4%$6N}L!evH@}A_{?3k zrohPIYWI83^=Q87=%ISlDRUSEmX$fuKi^ZcZ%L^Vz@Gdoh$KPq7FS*Ol|qNNLi1)k zdWjQKF@LkZH(r@*Kyn^`q(nOebna!r>*O6X3S*mI*$cidTk%ohT1$8)cg_415|;mz zKtDm1k2;E$?pzBZ#5&KgP3ZsaZ7V7bP!}Q0a)^mEV6Nh0S@t-V$884Igx1c66n|F0 z8$lFn!q3yo4q-h*b*ihmpSL$^u1-X-z86@uzeEE7tH!qwj$#vGH38WQS73O`A#TRJs%Irtl z37C1pCtRTF6#q!ylEI>~vLY)dhpecmXpJzlOr!NG_`7mW7`zlJXA~u;iBb4elMO9? za$CZu5ichv2h_h_+S_AL(v=rVH`Tn7$Sx>&O@#JwfIBfA@kEH}gaMrHewpaZtA!p9 z*s6Rpmx^W{MqE^BislV#Mb$m&U(kJu7ya^YtCcA11xT+HUI&E$9>pL7^>~e$M9o%K zyV`UV`5KPdJgeuu2K4&@bRKeDFbsSv9&P%sNCihN_vh4O5U4?frq73H#$!5PQ~eb- zCOBq7K_J?HQQo-Y{B-T8<7RLI%M1Xz(3{VTV#Vx0a7GeCC?Nsh6Wab_Nw%@ll+R7VPH{e=E`d z&s)M!2p+A$6fhAOOK0^9Fpdl^jLD0B-W)_OrdC^X(cJ_1$SXf*lxc?N5C69G{-t>+ z>d!cR_UA=|+q_lSD6${#Wp1_9DS%%qsxLzo%tnSegtS?Z2e@Fn|I2Uve;+5Cp*|3X z9#bNO#DK4zVmVgt;omB&|MEx2+)*Zfv`qNEzkxR2lSIj*(sKMJ2VXG)dVjq9Q~$|( zgV!W;qXs)6`{F1OtVbo4Uq243-31zIGl&Z?jjzI+{%0WnWv2f3lZ@PcKXKJD2%hJ8 z=?#8h9W1zL(o#7nT!AKpmpgx}+sH2b6aaZ__aA<-JfQ^~f zsQxk_UIJ05U%sPYo%)}y30YVce%BUk8;_vg8FwUb$836I3k|di3+vupflXr)3jFQj z`j?UG5dCwn$0%VDJXflMZ&a#b5Fs?I0h(DFSV4*SHb@Lw28+ENr`qQKvjO^36MlgL z)Y|kpA;A!aOb@Jjp!b@=Bm~7tffZInI22Am9>cP)=h_X{SwaoW)%CN+gn8;c?KLOp%o zP*_8}jn4D}OrZjsnI5n=Omxe4^zThTDdka9Qd024q~;uIzDNmj62-qK?7#LAXD7kJ z#KK})d3}KR_X}*!kujD94PN#5A)Vm5LeL=WdrKi0I?Rpt8yts_&+7K|Cj!4)YJ+}4 zSy@&K38xPZ4mt+Q1(THN2S!G6!`7X?MbjDKD*Wx@_%BBFB>q?nCF0ZBKubzkHxv#p zDjII>7_1QO+tcn)NfW}6D&r*d39F!Pd z=PXFYxrn+bRf_25KYl}WBr)?H6gGh+&3RF|4##4rTaL`^tnCCcl%-Kmw!D4^A5+-% z_wV|RE`Bennoc3#OVH43iQsAsy|+pky6bf+QgE@a;=rkCQDgqql zQfE=Il5tRJO&2m`d{_EN&wCs42G|XyPTXtqy3=&_ovZwSNJ-2OsE#pPcXM!XboKRh z6r&4W0~f3LpU?V++NXg{Mo#qMKmgu6h>O45chck)sp2et*#o+73)-eW@~P`NNqXV( zoDD|pWjh-i{=dwIBs^o>R&|kW#q}MNseNxxn@>(AKbRi9 z{@3HJSEy^S=_t-h;o)grm_qwvC}3upKf=1)^R-~l!=Ijwr&QB8V1akX}TV;J60eE7eB~-^1YS+;u!Gxn7Wz82i zm%EE;W&OWmb)5F4tFI1vWCCTD`=@PBd;|}FKC_=b9*r`a)&1qJp})A@Yo6~3^Ss=C zQ%BfbS68<`*u%B`lY1)ZuiF_WK=@oO+%!_ zLnz@tFzu0Y;3G0~sHgV4nme?EJ)bp)Yxj1k^o zP6P66`k~FW@REI)@H(Gf^^gdX7#7J-6@HuHzdKsWrG9XXb_52bkeDALspk=R3l&LtX7588C z`1p0zTAbN5JSx7<%bV!X$~4_~5DE#YFh92uq}h=?kxPB|ocLvbT}IBv#O{qKyDB4& zJnY!Fo}3Erifjf;F%XcZ3!ZjJ8pzxqu}+@^mf>Nu&krat5tIJq@z%Bt$0R^9t)A-* zY6q}XO^#mGY)11=Dd?|MP^EBY6bq79W>#kHODyr3#X;R1B6egO)Q`qwdcA=wQ9iur_s);* z!tR%g`8S|sru~xzH%=CnwW?%tyW{4PiRuCvYkn{7q?Gq_ehf?e`$=9Y56h=S+~VE2 zb9>9v+%58dRj{|x(cIL&Uv$hKDH2K$J`ODQSG&6|8=u8%E=OeUj}m?~<7taY_t^h2 zNjUF)0#vMNd9(yYbaPa~!OQedz2jSqsdE0bjgGgj{b}Z=E3S!G8LN$#J{g({yBDub zWI12gS`vO>)2jOg8O@6lbh!>y=CVCN^8<=?Z9P3bOD3&~Ixh#xhmp2wXwpn4Du%7m zx>5s?707}klzI}J2S1NyG2<<-;8Cw%SO0eYaFNI;9oX`-1tX^^HDUgOa--KdHjV0h5T>lGY_k%Yuf!)FMX=ypkwCa7`J9@DSbj-vbiI}i+>eha>jZfgzt%CsrA!fDw z*v4z%Xt_31Br+vBWxqA{)cdkfN!CZ?@8ZTJYeQUL5^%rx<(Xp`FPU{+Fa^w<@w#gvCl_;Wr#48wx$3Eua zA*`&dL{?ReDvkTX#C3FahrP{YnHiNnNB;3_X%M%53#6sEf%4Ty7Px1U*5#+)rrhR( z^i$RLl9v8KLHB2NuK9!UXo^3_r@JEb>C@%jzQxZ~NDl^5Vr1JT4$Iw8pzQkVX7CcX zD`(kN)rWMXST_PF?_U27C*cVHROYlRJ6Tr@IIXy$3+yVlf zJEC<@%@^pW8azqyXvEZ3U0qy8lt6jD(j(^Lf%?A*&6?jgBRv+|(+7SA@*A6&6c=++ zb8^EOP}Q%im$W{7%I~Tr9&bk#QgY=gsr7V^yY4K$rekG4k9y&PIs&~7slL7OO4ihD z*(|e1I@$BOr=1O;OQl_5#W4kjCMMsR1S0UuQ4hF@B!b!ZY3I?WuhH0_W47fS_b`rz z*80%IN&KuR(ZBDq9Fa;HuW7iHAhJhOihdHcNw+iN-Hx&UbuEhkSz^V`O;#NLshNC} zG!hwLik;WosAoJTYO3{hmZq+tZgNV{(#H31wyv4mP7$fxY3rvU^9 z*S4Wew|8C>{6ezpp{nORH_(8iY;}`7qbw}xJVTxTMJnD}>o0)mYF%inRPrGeaKB0_ z7q-UB1ij9s+iG%y#G3{gks`6Ga6LD$2?NQd23yN!Y?cn6P+|(=*oOD~@P)Jt?cm$nN%*}+7iGh6-1gk>yB8L{$ck#?S-?9BJ@^+p+>k}FwPx&86Qc!{t0 zv0`gmYr+}J{fVel{w&b2(6u2lV#}P~U6fiiaNJuQOJ^6KtMInUMwh|C=XBdu?kI6# z7YI%zue-kR3Aw2Mjn)}MBlA7{;jcPZTVgIf%7fkUybK>qmW5)i222jE@_}6`OyIB7 z|49T5sFDT~zl(Ut^+20KTlTJI_*Ubom;J%gYlfqq-57O`pKm1(Gu@57nYytZ$4;qa%u&DiArVv|uwDzth2M)3uki}`&4@#a!*M>lMr zC)1jr0Q)TOR$|~IvA{bO6*`@eqxY6|9_z(qq?D}5=q@cS8yZ+EtvR30&Pva4Bh+d79ctpxo))S~6T1<6QdqFC8zC=`RHLPN(J~}oAEw>pa7ZVdp7WWkscHS`>61N;-x4L@wgi+}e zqMc{_6A@^n-<+)C>QH*b1?|!IdVvu?NM&hm9+sr%fstBe73{>(O{ZHtJ+qO!A-;3_ zR8^ydJo##$_rCge4LK7Fvz&TCPbk5YkI?A?Ri>Z%+_U+Yb1eanu5Mt*HcKKOq{HJP zNIBGhGQLTJ@#-}`>kUIV8y!VgJSEf3*;Esjp=cPC4Xc@evXqbd)Kogqap{**0(aZm z4Y^&Byc;BK!6w9&Gr3_ zNY;Z;yr^G5uJnDw<%vb_zgsvjf>DEqAL5P}Nfr(=1-{wXqD57Y2mk%V*BjpbgViJ) z-q(UT4-@@h@`&Qb8%6UWw3o`7;AT--@YDjYN{^+OyN#$lL~8D4Kw9ECwq)Gv>v?D$ z9bwixf^r8mI=tJvqo*^3Hod_Xa%-7o=z3>04oM_bv%l@g+8+cpSDmVjjT8jG`+Y%n zY`of$w`5qw_lh8KqDVvnLKX4?2v0IeTd|G2O zCHFvLSTJ(bcu#>`!0!rIDV_h}pl(WSmtB)eV8VQX@tBz=uU`caXdm1A9z3KvBzj*x z9y<0{RGB^&!;f7Ax-9&&B?Y6`^os}^3LJvL)gCtRX+?cRqCSa(Wy2n)CHe6D2P0F)P~_)xiPh#QU^Qk z;@WNQ7yh!bb){rNRY!Y*2JgR&kQQ7Nq5D|c<^Aa;vtf472iq*$^ENrVa%2xwC!sB) zvRN1irF)gmV|97urHDK|Cd*Yw4Q{mwIzCtbO*HzA4cWaqRG=%fJTi4KO!8#)>(=J) zJiME;YdrADY@4ntty;SuvXufMe~7>px6{~4ZgWb)>JM)tdSv(WY97=wY;U&ja;nlh z=Mxo{0J3blxqxG)vUhf;Rf>8ZNkygb9pTOnS^jxBcZY+|2Ho_}6hnUJjQMLIOkQfV zPnZw`9LZ`5dxl(Jtdu0UTP<_F2U7fKo^>B}$|pQ{C@Zk-*&Rz=Hgg@BEm1aGrLlmX zGmCFVxzK@}-*D`M&A)LEUZ7|)eCcmt9a4SP#hmimE|J#%nG+J!I3HO$8VR3j-1<$1y26y(1rfUenypV6B^DBA zJ`q;(E``LqRlj>inIiCh)hr#IEye=BfvZpY4A zUq1>*=UBAWm8N?jD0LDA?(~Z>FgSZ?^qGN)wRyRzD#~WtF2Jm=`IEJwt(ErHf>@n! z-I|40hYpJ?=2(bbTsKmgXiDWBrFFA6CB*h@Sq|U2eN-1xtop;6wVL$26OtT(7f1fF z14m6{V^=*w#VqZ)W+0PKUX{gcgQbAW?o1I)HpJs-%g>}YrC<`Yk(V7jKOcxh9dWiC zE!gYfL6oF7tkb;g;$#2rD(?_`u4t@zIj+U7U5U*@k7TE&rd}H>crpV34c@-r;J1J_ zCIuELyPD-AAK4a{y}6cP1-fr92^G@>{eI^uJ!uwy5pOYp)d64<`l%M%P z(Q?rcy=BSeQdu_gcNlL+I*V(LD~B?zgK-3*s;8pHxoiW!Vo*gLmV~cR$lUp+wBWoA zU7B6M$FOn4^d*dJp?H=!TAP4m48qhZrPp}>HclP}spPHKh~lkzXM>60d44dhm~C(^ zA>_t!$=!SS1_R+RkgeOfcLu+fNcR2;Os$ioGK+iXrc_8bczY#;%-kkWHpiYC{*lW~ zps3JqLIip9GZg>G7Q+EYrmUkXthf7cDLE2Voddg!`2DC?B_mwE(EjDZ>@jddd3-pa zC+PdK;&rBTXCKwx(a}&zLR@np&Bxcvz-m+#*Faocyt=L~``!0&<^?@e*WD>dmdENF zRCWFNT-(8~7?hNhb~{%!Z$2juf)hIEzUALHQ;mGHAR62bi8=lAdm9508vKXoTNqy$ zLk6D-1jYeGO^wjCZt+OzSj2F5e$Q$MspG^rR;}{V2M4uzZnDSYY6y+A&UDyeQg2`3 z#Ef`hg{YS_JGyDel3Gpm*6rPRxFkwUlXE0`5z&y}&9EVYnHbzn)k;te4&`zj`fx`EyYrqt8pW`4 z!v~ig&T+!}Mf_rQqj?<2;&Ue)poba=Oz(++A$#AT%VAw}t#J>@n^fUmW?RI3%m2#v z7}_SgxvOS(FQ^k(A%j(>IUnMhJ$9yqoVEuag8Z+wKg6f6+kvt3>UdQD5x>iHHANw&e#2TVmPN1p66nf}yD~x1d33Yha=f3EA<#$(HaG7t` zp-|7-4ZLOXOL?gq7tHTsWEsoI%Gag))su#-AF}9_jYeRo(fSyjBPGp}f+mhy5+@n0 zZN~bTs}=^yLXSe^6womw-<=s|53~gL{{Tb2VM}v{qkX4`PWr9Gp;}vKv+czLDXLo< zc2Utcn26wjY?~>Wfsg&MdwT?OR-f;(37EF+P!5Cp#{Uv-`x{Z=Y<`?ZkAh@ON@R7#~l<#D#PEeoO^lEEH|j~br26w;ML+T+p-(V_5En5f9^>R zG|t)RJ(`&2LZjCo&x{0rBAjZZCGjHm8nH&&DlHg@iQKh%rJ|+U2uUd|R4B1$JkT>K znnG%ds0f4DdN<2nBU#oB1o^a&FXKlFyh`;fnc6xg-O@Xo^qT`TEr+QixZJpUYe5jt z7$`GuGiu*@|8poIMQ%%Na;k^k-b#R5{V^IupsZASoyrj+O3RLk0Ww%lEy3Q#D^pvN zh2z(5Kgm%#wH^*0b%q2!G3vBM7R=$~T|6kB=6&Lf<4%k8;Xb;zHQS_*p{H{8fq{|n z0YAU+=(nHi?n_BefOaEz%NxLb49K`f*g(k|a1G*EOFZ*{<;6`Hz^Jnyo zjPL%5v)nxQJl*+zX1|!w!y`b2NV%uB5|=<%$Q~RyT14ayUG0@QKUjt&&wW^!%~xL% zT(5O@bOaCvmD*v0=jr2HZIC@$C)diY7CFtyofbNkS}>HkBBJDXC(2)|9@pD8UOxba zQUiGLp0SzPw$t@NKPeFoAFvIla^y)9e!C7ALd*sR1k=v`#DL3eNeOo>O>!@NjlgwY zqFWa{s_#h!P#8hyi;r5fu_Zojh`&Jle}44-t{*lf;yCbK;YU@1BHr^tMmgHyH>lhS zgc-HBwAxjl{hC?HlLH_!3{BoEQm}-1OYaa4nXThgr0vKZ=}xELG;DU?aRYDnu&fH} z(K|^h3?M%rmb%^}IPa8hzj36Pj7~N@O7iG?D*EKjv!7d5^9|;#?37l=o0bo6?`spdpCw~fZ7_V- zA)+hdSJyj~fL(+73ino^6~h(Jm5&i51eEzTR%~kdUk=)Cz`=Fq)SG86Wmdr~{%SE{aPYjYrr~%+mBl!8a$3r7;nM_7>3YEj`RMKeK2U5UU7WZMT2JOq6%L*=ABIPhi9C>&GFv;@o>&B~;(egZ{-FmrP?g$j3ooZ77=($` z|GK-_5fxBY#_3c}te^ASxo3q#&g_k>Z0zs7RxGZ$-l`cXfP@{-M@mXcmOA}VktI+L zulgqYtI`;r*xjIofIc10^)_0jvNTlCUB1FtWP;5$ddtx#8h$l&U&@b*r42|Guq{Si zcRySySYP)>E3b&55if33^1Z#TTHu<@ahuImpjfU?u+c3tg1|(Px9=CosHuy6kZ%EQ z_$F0Mp~ku>)gQOE?Ln@l~0ttG4$gQXVGrSwc+NOY_;g)|zxHEvf7q|6yk zWrJ~_=v$ZMm`q-|OU5q{%^mi=Ntbk-u4eMKYD}YfqEkP3ZmFGXmU|h$`0kn-2(c0T zlukC5k6Yz`CR3P3#HiECZ`=TT;%2J;jSgv2`O4!O0LD^kM#SNs4>eFA9*bYANvTPq z>2{=#3<7^sq|Q#}gtB~+d&%R>IZ{7XM_ic0Rv{He7>nZU!Jrj5mAHsW%4xME#mA@D zC{R=ERNTF*`-%a+E7-ti^cm{w>s!IKUhh3fcP`(eSL?E@nNcpwgv8d~nx8iy?!I_E zy6pAWQStMC-3;o^HE-YKh;1zBh2oC*pV#`;gFL5u%MU%_@~rNfkt#=1H(>Fb%ww+m zBU{^n*?+Ir{MpBIaYwxN2tTio+<=(>44y$yYp!wd zv==tJW?UWPg+)?1qI9@+yKbrsyH;xQq5i96+@|68Z97NeFOQ5(i11GiEjzD>{oycUzBeog=l+BrCQ6bf;J{ziP~bN-*!9FV@Z zmT`t3m)8k^y7o&b^ih37L&l8cIsL!;N_PpFzo7CsBjsKXzwt5~w78&*lz9tN$QWuG zCn6;D2gRA{nwsm>$+@x&I={I&n4qw5>-X==EMf^U|DNUpX8CbEu)z%(G0$6g1y2r3 z$#jI&=jZQlO|0pp#EnrcSkbZl)hpA zb02rse>W_Cz9H`kp}m10Qs}V@Ojb5Fw&tep#6=1^{c_ytrDGPcD)DU+raU3ivL@+P(@AcvTK4O^NP@QP~gO%2X>$LDm_iQ={{t7i429`#!9qbpU|S*EL1E7iR>^yL#KKTj=+ds%ix+o5 zm@)?{kSy&;FvP^{CJ>>@&G0f2u9vD3E|3_Z@je}g?52G~T47P<+D z6flZDf^+SpVQ+t5Ia6|7hr`S^ah2Au9QDttL^(Y!L6j3vVZ6%KLb{lw$oRTrRE>FC>u-ATiFFK@!5ddZ(bC5-#n{hDP!1eSDnM4uV`utjA? zu2c!MUdO(eA?)JtJMK#tsdhdjd1q*-T&bh^kwx_Z2?+_Ajo8zt1P(KR_YE_!@jK{G zkO?DXaB5olVVAq!cYe6CSlq9Bv^z@!vIcHZW{M&K+bJnECt^9bg!g3;j{GJP%cY6F zO3P#*VvA*ou;REu4RE!Z^^*+2%LJvmwUMGpB1C(^e=q3&=Yw?u5V|phVq(ERed=mq zEmtE2s~c~$Y*x|lc-%MS`CSa7kmh(y1ZkgsGpGsfH{D+Muaz!$C$ug7i2wD);9j=N z_R87*VlrSp0sJPHufP%{GEa>+h}Gcgz4^Lz7&tgVH8nMu#>Expqqy55bHG~;TIoeL zQEr~iw|aK*Dn!8U{J{7lr!Kkp)!97+0`aYWWT-%Oe>kyZ=!}R-X(_dS#L=X`1;oz- z4Kl7jlb=56S)G6J*SYdT5P_L;ws-9tYhh*3OgH2^23j+S>|57YDzIzU>Ylug2SIl* z!a%ZlHapq=>|*IG)=ny|A^K}F6iUK^I=NbJu)ehy`FUmC=JGYFI*XW#C!7L!1S{vr zJ>)g}LZs>od`}siUn!}<~+DtqeQZImtM9gZtm-+W+H$AByyU1qopC97}~gjfAA^v`Dmg4Zt+^Fp8HOF(Mz>3cnAG zMUU66uqzGG-W_4Q97`6un{oFr79T%w(38YeY^*&L~l_kF9RXKRl2v=t5C(ST;VPGiE(^D3W`meyaK(>JE2 zPx4UU#4@P@mbf%6J^({~B=)ZQ=Iom--~zAuT1fOY**(#Q1GC0Tzh0L1YJ%a0emW7A76k|?KXxesbTHC8!xYvvX$>Gp8+jMr-o?$61Qz?;sFvV^}+5TBLhReSE5VQ zW~<{H*W^zWO=b0hoxio7J!QmgluV+%`HY8oY=hVNYIrz1`?dycbMP~gO`CmEJ8t*+ z!QRv4$uZX80@6J#5nOef@t*IWJff~#GF1JJr)nJ6CUW52pFGZz+RP7fFD@^$fqBbD zbufw{4EC6O$o7tih)9}tq-_MKYm=nwQ_H#GQY)X^dyE`RF3J*>E$^H2Rb>S9M9P%|Z8Ph81h>HzY6a7$ z2uQ61utA;L9x5dQbezET-+6{NSLdOTk#96$3Fk(DLld6g#a#b({yr%8KkxnK;Pc-1 z4oDM1qN2|B1DSz8;`d=T4dpsT>+0HC^4?z~yhP&f3*Kg;d_5dNCIit_*SQJt(K+2g z?R15eYU95X?z@EUrUyV$W!tOw8`E2zytKgX&&!qb1kR}hHv*du|`L+<~H#dydwzlI%aDoSnJDRk$&|2O;-~~c4iv#^3 zNZ{B|f3X3FUawnRrvxWV*SQ!jb;U8OR$}{H?aK_g6$HQbI|dL&vY&^YzI79Z#Tc3J}{W8yJvrM`vy+jlCHHHHo!*ShS>`S6PA->~<#W7IPKT)SdFw^VC;0XUTvDH_QRx|*D>oeN z+_U|D9b&Weq@`zGMn5@8!Ta!T!2pu`2+`xwQtY7#jqu6|W&m5su2}kJIiPDXDRA=` z7a`}?`g-Y31zXZc9Aie@$K=4yrgWLD1QA*Eh`^ezO)}@R@-bDXXh)<4t^YBudO+Lr zvn#acHzzXHN>r$M9tk)e@7>~5PfOi2>`zhdx6vnyjJHjVV2*IPwH5S5gnn2RcD~OK z>1i#!aD3%hk%}}VCGfl!(-9U34w96U)hH5Y8_jR>#`jr5Ks!lEI2DlvP`M@LBD80g z^6|g#k$4A$X84ATn#K>ib}W6d;y2NNd0%b1w@;sh^rR|Co0-T< zaNBQh(gX>BVYc#dn$I7m2LMm*vy5%eluep_;^O!68!t13KZmoa7Y~TY+s-yd(FTO% z+tnYg^ht~A5= z;W)ejG5eJjyOhBznex`9sy)?q> zcMQra8t=CE7dsQ4K|ULI4baN%iJo*m#U|%P=b^U;-jg4*t79E$8QMW%8Zhm@PdHl+ zzvlCUU=|OOO@4WKZd4{-q!DqzK!G!Na!};o+ z8a;ai@ymB^sD#t8r_~McVvr^T2*zLNhs}0AOBh>gvwY2r-5{a>jKx1XR_UR@($2hc# zy|YHLE!WTRzsy^DJm)g#~ zxDLGCrFouwz(TmV2(vN2|4dtiK2Ti!8n>6C+0jX${eH-T-mW>)&e`uY_lJ4==GQaS zDR;{cunqcy;SHa-Oy3tIY%Q~t9gAEp5gInQJ%cl{*zS>Tw6U7*?k$cZbx6*YTzwY1 zbN;R?cxh5Gtr)i~di=1#O6-D(6A7KIM{A`|oD=K#L+EvGvCPm9$GsUIEIhGuYUR$p zHHW$IJw%uUJ6Ej}?-pC4no>j!(Vf|sWshrwD~e*8?b(JOo$J0q$MI80Af2z+^StS%XR1p7%#5$6&GYs}f^n?P1fWgYoPx)#Egf3fC2J|nAwd)jvQ2Cu^
    S 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 DlWc@0 literal 0 HcmV?d00001 diff --git a/docs/my-website/img/create_key.png b/docs/my-website/img/create_key.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b0532982eb5c834efc204d9cacd8d3a7f54edb GIT binary patch literal 143093 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 literal 0 HcmV?d00001 diff --git a/docs/my-website/img/test_alert.png b/docs/my-website/img/test_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..ba253da83a11db86f0946869058740afdc80a43d GIT binary patch literal 207731 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

    H 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ⅆ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 literal 0 HcmV?d00001 diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 764e9e721..d50e31c79 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -40,6 +40,7 @@ const sidebars = { "proxy/virtual_keys", "proxy/users", "proxy/ui", + "proxy/budget_alerts", "proxy/model_management", "proxy/health", "proxy/debugging", From ac085a4643291c7b920c30597ac12ebeabcd5607 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 18:34:18 -0800 Subject: [PATCH 063/304] fix(proxy_server.py): actual implementation of slack soft budget alerting --- litellm/proxy/_types.py | 1 + litellm/proxy/proxy_server.py | 50 +++++++++++++++++-- litellm/proxy/schema.prisma | 3 ++ litellm/proxy/utils.py | 94 +++++++++++++++++++++++++++++++++-- schema.prisma | 3 ++ 5 files changed, 142 insertions(+), 9 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 6196f18a2..5cac7c9ad 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -509,6 +509,7 @@ class LiteLLM_VerificationTokenView(LiteLLM_VerificationToken): team_tpm_limit: Optional[int] = None team_rpm_limit: Optional[int] = None team_max_budget: Optional[float] = None + soft_budget: Optional[float] = None class UserAPIKeyAuth( diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index eca5fb30a..b0bd20c19 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -94,6 +94,8 @@ from litellm.proxy.utils import ( _read_request_body, _is_valid_team_configs, _is_user_proxy_admin, + _is_projected_spend_over_limit, + _get_projected_spend_over_limit, ) from litellm.proxy.secret_managers.google_kms import load_google_kms import pydantic @@ -360,7 +362,6 @@ async def user_api_key_auth( valid_token = await prisma_client.get_data( token=api_key, table_name="combined_view" ) - elif custom_db_client is not None: try: valid_token = await custom_db_client.get_data( @@ -932,6 +933,7 @@ async def _PROXY_track_cost_callback( f"user_api_key {user_api_key}, prisma_client: {prisma_client}, custom_db_client: {custom_db_client}" ) if user_api_key is not None: + ## UPDATE DATABASE await update_database( token=user_api_key, response_cost=response_cost, @@ -1085,6 +1087,39 @@ async def update_database( # Calculate the new cost by adding the existing cost and response_cost new_spend = existing_spend + response_cost + ## CHECK IF USER PROJECTED SPEND > SOFT LIMIT + soft_budget_cooldown = existing_spend_obj.soft_budget_cooldown + if existing_spend_obj.soft_budget_cooldown == False and ( + _is_projected_spend_over_limit( + current_spend=new_spend, + soft_budget_limit=existing_spend_obj.litellm_budget_table.soft_budget, + ) + == True + ): + key_alias = existing_spend_obj.key_alias + projected_spend, projected_exceeded_date = ( + _get_projected_spend_over_limit( + current_spend=new_spend, + soft_budget_limit=existing_spend_obj.litellm_budget_table.soft_budget, + ) + ) + soft_limit = existing_spend_obj.litellm_budget_table.soft_budget + user_info = { + "key_alias": key_alias, + "projected_spend": projected_spend, + "projected_exceeded_date": projected_exceeded_date, + } + # alert user + asyncio.create_task( + proxy_logging_obj.budget_alerts( + type="projected_limit_exceeded", + user_info=user_info, + user_max_budget=soft_limit, + user_current_spend=new_spend, + ) + ) + # set cooldown on alert + soft_budget_cooldown = True # track cost per model, for the given key spend_per_model = existing_spend_obj.model_spend or {} current_model = kwargs.get("model") @@ -1100,7 +1135,11 @@ async def update_database( # Update the cost column for the given token await prisma_client.update_data( token=token, - data={"spend": new_spend, "model_spend": spend_per_model}, + data={ + "spend": new_spend, + "model_spend": spend_per_model, + "soft_budget_cooldown": soft_budget_cooldown, + }, ) valid_token = user_api_key_cache.get_cache(key=token) @@ -1874,17 +1913,18 @@ async def generate_key_helper_fn( allowed_cache_controls = allowed_cache_controls # TODO: @ishaan-jaff: Migrate all budget tracking to use LiteLLM_BudgetTable - if prisma_client is not None: + _budget_id = None + if prisma_client is not None and key_soft_budget is not None: # create the Budget Row for the LiteLLM Verification Token budget_row = LiteLLM_BudgetTable( - soft_budget=key_soft_budget or litellm.default_soft_budget, + soft_budget=key_soft_budget, model_max_budget=model_max_budget or {}, created_by=user_id, updated_by=user_id, ) new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) _budget = await prisma_client.db.litellm_budgettable.create(data={**new_budget}) # type: ignore - _budget_id = getattr(_budget, "id", None) + _budget_id = getattr(_budget, "budget_id", None) try: # Create a new verification token (you may want to enhance this logic based on your needs) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 1fe55f24e..54e23e769 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -23,6 +23,7 @@ model LiteLLM_BudgetTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget + keys LiteLLM_VerificationToken[] // multiple keys can have the same budget } model LiteLLM_OrganizationTable { @@ -90,6 +91,7 @@ model LiteLLM_VerificationToken { token String @id key_name String? key_alias String? + soft_budget_cooldown Boolean @default(false) // key-level state on if budget alerts need to be cooled down spend Float @default(0.0) expires DateTime? models String[] @@ -109,6 +111,7 @@ model LiteLLM_VerificationToken { model_spend Json @default("{}") model_max_budget Json @default("{}") budget_id String? + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) } // store proxy config.yaml diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index c67448c86..31e913e8b 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -222,6 +222,7 @@ class ProxyLogging: "user_and_proxy_budget", "failed_budgets", "failed_tracking", + "projected_limit_exceeded", ], user_max_budget: float, user_current_spend: float, @@ -255,6 +256,23 @@ class ProxyLogging: level="High", ) return + elif type == "projected_limit_exceeded" and user_info is not None: + """ + Input variables: + user_info = { + "key_alias": key_alias, + "projected_spend": projected_spend, + "projected_exceeded_date": projected_exceeded_date, + } + user_max_budget=soft_limit, + user_current_spend=new_spend + """ + message = f"""\n🚨 `ProjectedLimitExceededError` 💸\n\n`Key Alias:` {user_info["key_alias"]} \n`Expected Day of Error`: {user_info["projected_exceeded_date"]} \n`Current Spend`: {user_current_spend} \n`Projected Spend at end of month`: {user_info["projected_spend"]} \n`Soft Limit`: {user_max_budget}""" + await self.alerting_handler( + message=message, + level="High", + ) + return else: user_info = str(user_info) # percent of max_budget left to spend @@ -748,7 +766,8 @@ class PrismaClient: detail={"error": f"No token passed in. Token={token}"}, ) response = await self.db.litellm_verificationtoken.find_unique( - where={"token": hashed_token} + where={"token": hashed_token}, + include={"litellm_budget_table": True}, ) if response is not None: # for prisma we need to cast the expires time to str @@ -758,7 +777,8 @@ class PrismaClient: response.expires = response.expires.isoformat() elif query_type == "find_all" and user_id is not None: response = await self.db.litellm_verificationtoken.find_many( - where={"user_id": user_id} + where={"user_id": user_id}, + include={"litellm_budget_table": True}, ) if response is not None and len(response) > 0: for r in response: @@ -766,7 +786,8 @@ class PrismaClient: r.expires = r.expires.isoformat() elif query_type == "find_all" and team_id is not None: response = await self.db.litellm_verificationtoken.find_many( - where={"team_id": team_id} + where={"team_id": team_id}, + include={"litellm_budget_table": True}, ) if response is not None and len(response) > 0: for r in response: @@ -809,7 +830,9 @@ class PrismaClient: hashed_tokens.append(t) where_filter["token"]["in"] = hashed_tokens response = await self.db.litellm_verificationtoken.find_many( - order={"spend": "desc"}, where=where_filter # type: ignore + order={"spend": "desc"}, + where=where_filter, # type: ignore + include={"litellm_budget_table": True}, ) if response is not None: return response @@ -1728,6 +1751,69 @@ async def _read_request_body(request): return {} +def _is_projected_spend_over_limit( + current_spend: float, soft_budget_limit: Optional[float] +): + from datetime import date + + if soft_budget_limit is None: + # If there's no limit, we can't exceed it. + return False + + today = date.today() + + # Finding the first day of the next month, then subtracting one day to get the end of the current month. + if today.month == 12: # December edge case + end_month = date(today.year + 1, 1, 1) - timedelta(days=1) + else: + end_month = date(today.year, today.month + 1, 1) - timedelta(days=1) + + remaining_days = (end_month - today).days + + # Check for the start of the month to avoid division by zero + if today.day == 1: + daily_spend_estimate = current_spend + else: + daily_spend_estimate = current_spend / (today.day - 1) + + # Total projected spend for the month + projected_spend = current_spend + (daily_spend_estimate * remaining_days) + + if projected_spend > soft_budget_limit: + print_verbose("Projected spend exceeds soft budget limit!") + return True + return False + + +def _get_projected_spend_over_limit( + current_spend: float, soft_budget_limit: Optional[float] +) -> Optional[tuple]: + import datetime + + if soft_budget_limit is None: + return None + + today = datetime.date.today() + end_month = datetime.date(today.year, today.month + 1, 1) - datetime.timedelta( + days=1 + ) + remaining_days = (end_month - today).days + + daily_spend = current_spend / ( + today.day - 1 + ) # assuming the current spend till today (not including today) + projected_spend = daily_spend * remaining_days + + if projected_spend > soft_budget_limit: + approx_days = soft_budget_limit / daily_spend + limit_exceed_date = today + datetime.timedelta(days=approx_days) + + # return the projected spend and the date it will exceeded + return projected_spend, limit_exceed_date + + return None + + def _is_valid_team_configs(team_id=None, team_config=None, request_data=None): if team_id is None or team_config is None or request_data is None: return diff --git a/schema.prisma b/schema.prisma index 1fe55f24e..54e23e769 100644 --- a/schema.prisma +++ b/schema.prisma @@ -23,6 +23,7 @@ model LiteLLM_BudgetTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") updated_by String organization LiteLLM_OrganizationTable[] // multiple orgs can have the same budget + keys LiteLLM_VerificationToken[] // multiple keys can have the same budget } model LiteLLM_OrganizationTable { @@ -90,6 +91,7 @@ model LiteLLM_VerificationToken { token String @id key_name String? key_alias String? + soft_budget_cooldown Boolean @default(false) // key-level state on if budget alerts need to be cooled down spend Float @default(0.0) expires DateTime? models String[] @@ -109,6 +111,7 @@ model LiteLLM_VerificationToken { model_spend Json @default("{}") model_max_budget Json @default("{}") budget_id String? + litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) } // store proxy config.yaml From 679c47d196110268068ccc014001591ab8a42de9 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 19:11:37 -0800 Subject: [PATCH 064/304] fix(proxy_server.py): fix budget creation --- litellm/proxy/proxy_server.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index ddd702c22..ab8e7b2d6 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1881,16 +1881,20 @@ async def generate_key_helper_fn( allowed_cache_controls = allowed_cache_controls # TODO: @ishaan-jaff: Migrate all budget tracking to use LiteLLM_BudgetTable - if prisma_client is not None: + if prisma_client is not None and key_soft_budget is not None: # create the Budget Row for the LiteLLM Verification Token budget_row = LiteLLM_BudgetTable( - soft_budget=key_soft_budget or litellm.default_soft_budget, + soft_budget=key_soft_budget, model_max_budget=model_max_budget or {}, - created_by=user_id, - updated_by=user_id, ) new_budget = prisma_client.jsonify_object(budget_row.json(exclude_none=True)) - _budget = await prisma_client.db.litellm_budgettable.create(data={**new_budget}) # type: ignore + _budget = await prisma_client.db.litellm_budgettable.create( + data={ + **new_budget, # type: ignore + "created_by": user_id, + "updated_by": user_id, + } + ) _budget_id = getattr(_budget, "id", None) try: From 446cc393f92fffe77833eba47bc32f357188a582 Mon Sep 17 00:00:00 2001 From: Tim Xia Date: Sat, 2 Mar 2024 22:27:42 -0500 Subject: [PATCH 065/304] Fix message template based on transformers chat_template docs --- litellm/llms/prompt_templates/factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index cc8d3d49b..103eb5977 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -110,9 +110,9 @@ def mistral_instruct_pt(messages): "post_message": " [/INST]\n", }, "user": {"pre_message": "[INST] ", "post_message": " [/INST]\n"}, - "assistant": {"pre_message": " ", "post_message": " "}, + "assistant": {"pre_message": " ", "post_message": " "}, }, - final_prompt_value="", + final_prompt_value="", messages=messages, ) return prompt From f5f12d204e4c98d7d076b5efaf31581c4420e3ce Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 19:52:45 -0800 Subject: [PATCH 066/304] fix(proxy_server.py): fix track cost callback --- litellm/proxy/proxy_server.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index eda311015..7172902a5 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1094,12 +1094,16 @@ async def update_database( ## CHECK IF USER PROJECTED SPEND > SOFT LIMIT soft_budget_cooldown = existing_spend_obj.soft_budget_cooldown - if existing_spend_obj.soft_budget_cooldown == False and ( - _is_projected_spend_over_limit( - current_spend=new_spend, - soft_budget_limit=existing_spend_obj.litellm_budget_table.soft_budget, + if ( + existing_spend_obj.soft_budget_cooldown == False + and existing_spend_obj.litellm_budget_table is not None + and ( + _is_projected_spend_over_limit( + current_spend=new_spend, + soft_budget_limit=existing_spend_obj.litellm_budget_table.soft_budget, + ) + == True ) - == True ): key_alias = existing_spend_obj.key_alias projected_spend, projected_exceeded_date = ( @@ -1938,7 +1942,7 @@ async def generate_key_helper_fn( } ) _budget_id = getattr(_budget, "budget_id", None) - + try: # Create a new verification token (you may want to enhance this logic based on your needs) user_data = { From b85a6304c4a029678fea64f56d79ad70c0cb3e14 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 20:09:10 -0800 Subject: [PATCH 067/304] refactor(main.py): trigger new build --- litellm/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/main.py b/litellm/main.py index 67586603d..a8d919117 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,7 +12,6 @@ from typing import Any, Literal, Union from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy - import httpx import litellm from ._logging import verbose_logger From be2f759881fe2ab9d96980c11ca31df155d8ff7f Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 20:09:26 -0800 Subject: [PATCH 068/304] =?UTF-8?q?bump:=20version=201.28.10=20=E2=86=92?= =?UTF-8?q?=201.28.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2d5666935..acb605982 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.10" +version = "1.28.11" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.10" +version = "1.28.11" version_files = [ "pyproject.toml:^version" ] From 37ad5efc6171f75a6c715296e467c30b74d06b4a Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 20:52:54 -0800 Subject: [PATCH 069/304] fix(proxy/utils.py): fix resetting budget logic --- litellm/proxy/proxy_server.py | 2 +- litellm/proxy/utils.py | 14 +++++++++++--- proxy_server_config.yaml | 4 ++-- tests/test_keys.py | 17 ++++++++++++++--- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 7172902a5..f1dec3881 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3464,7 +3464,7 @@ async def update_key_fn(request: Request, data: UpdateKeyRequest): response = await prisma_client.update_data( token=key, data={**non_default_values, "token": key} ) - return {"key": key, **non_default_values} + return {"key": key, **response["data"]} # update based on remaining passed in values except Exception as e: if isinstance(e, HTTPException): diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 31e913e8b..765909157 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1140,7 +1140,13 @@ class PrismaClient: + f"DB Token Table update succeeded {response}" + "\033[0m" ) - return {"token": token, "data": db_data} + _data: dict = {} + if response is not None: + try: + _data = response.model_dump() + except: + _data = response.dict() + return {"token": token, "data": _data} elif ( user_id is not None or (table_name is not None and table_name == "user") @@ -1228,9 +1234,11 @@ class PrismaClient: if t.token.startswith("sk-"): # type: ignore t.token = self.hash_token(token=t.token) # type: ignore try: - data_json = self.jsonify_object(data=t.model_dump()) + data_json = self.jsonify_object( + data=t.model_dump(exclude_none=True) + ) except: - data_json = self.jsonify_object(data=t.dict()) + data_json = self.jsonify_object(data=t.dict(exclude_none=True)) batcher.litellm_verificationtoken.update( where={"token": t.token}, # type: ignore data={**data_json}, # type: ignore diff --git a/proxy_server_config.yaml b/proxy_server_config.yaml index 198d33013..b65cefe79 100644 --- a/proxy_server_config.yaml +++ b/proxy_server_config.yaml @@ -40,8 +40,8 @@ litellm_settings: budget_duration: 30d general_settings: master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234) - proxy_budget_rescheduler_min_time: 30 - proxy_budget_rescheduler_max_time: 60 + proxy_budget_rescheduler_min_time: 3 + proxy_budget_rescheduler_max_time: 6 # database_url: "postgresql://:@:/" # [OPTIONAL] use for token-based auth to proxy environment_variables: diff --git a/tests/test_keys.py b/tests/test_keys.py index a6e85d6d9..888d92744 100644 --- a/tests/test_keys.py +++ b/tests/test_keys.py @@ -438,6 +438,15 @@ async def test_key_with_budgets(): """ from litellm.proxy.utils import hash_token + async def retry_request(func, *args, _max_attempts=5, **kwargs): + for attempt in range(_max_attempts): + try: + return await func(*args, **kwargs) + except aiohttp.client_exceptions.ClientOSError as e: + if attempt + 1 == _max_attempts: + raise # re-raise the last ClientOSError if all attempts failed + print(f"Attempt {attempt+1} failed, retrying...") + async with aiohttp.ClientSession() as session: key_gen = await generate_key( session=session, i=0, budget=10, budget_duration="5s" @@ -449,9 +458,11 @@ async def test_key_with_budgets(): reset_at_init_value = key_info["info"]["budget_reset_at"] reset_at_new_value = None i = 0 - await asyncio.sleep(120) - while i < 3: - key_info = await get_key_info(session=session, get_key=key, call_key=key) + await asyncio.sleep(10) + for i in range(3): + key_info = await retry_request( + get_key_info, session=session, get_key=key, call_key=key + ) reset_at_new_value = key_info["info"]["budget_reset_at"] try: assert reset_at_init_value != reset_at_new_value From a4b44898325eb5676007bb0072e2cf50ab18a8dd Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 21:01:36 -0800 Subject: [PATCH 070/304] fix(proxy/utils.py): fix model dump pydantic versioning issue --- litellm/proxy/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 765909157..59d638c68 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1144,7 +1144,7 @@ class PrismaClient: if response is not None: try: _data = response.model_dump() - except: + except Exception as e: _data = response.dict() return {"token": token, "data": _data} elif ( From ff2e002a920d1447a2fedaaeda3dbbb438f82a74 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 21:10:37 -0800 Subject: [PATCH 071/304] fix(proxy/utils.py): fix pydantic model dump logic --- litellm/proxy/utils.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 59d638c68..c92f75f0e 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1142,10 +1142,7 @@ class PrismaClient: ) _data: dict = {} if response is not None: - try: - _data = response.model_dump() - except Exception as e: - _data = response.dict() + _data = response.dict() return {"token": token, "data": _data} elif ( user_id is not None From db0489d6037bb4c6fd1f0460a2d0eed76cc3efe1 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 21:11:25 -0800 Subject: [PATCH 072/304] fix(proxy/utils.py): add linting fix --- litellm/proxy/utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index c92f75f0e..fc90c3b7b 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1142,7 +1142,10 @@ class PrismaClient: ) _data: dict = {} if response is not None: - _data = response.dict() + try: + _data = response.model_dump() # type: ignore + except Exception as e: + _data = response.dict() return {"token": token, "data": _data} elif ( user_id is not None From 4f3d1ee11f0f0232d2c6a3d11836ceda69b64638 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 21:19:34 -0800 Subject: [PATCH 073/304] test(test_keys.py): extend time for test --- tests/test_keys.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_keys.py b/tests/test_keys.py index 888d92744..db21a2176 100644 --- a/tests/test_keys.py +++ b/tests/test_keys.py @@ -458,7 +458,7 @@ async def test_key_with_budgets(): reset_at_init_value = key_info["info"]["budget_reset_at"] reset_at_new_value = None i = 0 - await asyncio.sleep(10) + await asyncio.sleep(20) for i in range(3): key_info = await retry_request( get_key_info, session=session, get_key=key, call_key=key From f17c0230c81e9639cea686402e6ca56080f80220 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 21:22:05 -0800 Subject: [PATCH 074/304] fix(main.py): trigger new build --- litellm/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/main.py b/litellm/main.py index a8d919117..67586603d 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,6 +12,7 @@ from typing import Any, Literal, Union from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy + import httpx import litellm from ._logging import verbose_logger From 922b38301f4cb3b476039e777936316411dee675 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 23:11:04 -0800 Subject: [PATCH 075/304] docs(budget_alerts.md): doc cleanup --- docs/my-website/docs/proxy/budget_alerts.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/my-website/docs/proxy/budget_alerts.md b/docs/my-website/docs/proxy/budget_alerts.md index 580040d97..f9fc63f0e 100644 --- a/docs/my-website/docs/proxy/budget_alerts.md +++ b/docs/my-website/docs/proxy/budget_alerts.md @@ -10,6 +10,16 @@ import Image from '@theme/IdealImage'; ### 1. Setup Slack Alerting on your Proxy Config.yaml +**Add Slack Webhook to your env** +Get a slack webhook url from https://api.slack.com/messaging/webhooks + + +Set `SLACK_WEBHOOK_URL` in your proxy env + +```shell +export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/<>/<>/<>" +``` + **Update proxy config.yaml with slack alerting** Add `general_settings:alerting` ```yaml @@ -22,15 +32,8 @@ general_settings: alerting: ["slack"] ``` -Get a slack webhook url from https://api.slack.com/messaging/webhooks -Set `SLACK_WEBHOOK_URL` in your proxy env - -```shell -SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/<>/<>/<>" -``` - Start proxy ```bash $ litellm --config /path/to/config.yaml From 53326da1c9e09af13628a5c5efccda78ad74d53e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 23:12:34 -0800 Subject: [PATCH 076/304] refactor(budget_alerts.md): add spacing in doc --- docs/my-website/docs/proxy/budget_alerts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/my-website/docs/proxy/budget_alerts.md b/docs/my-website/docs/proxy/budget_alerts.md index f9fc63f0e..ab90838e0 100644 --- a/docs/my-website/docs/proxy/budget_alerts.md +++ b/docs/my-website/docs/proxy/budget_alerts.md @@ -20,7 +20,7 @@ Set `SLACK_WEBHOOK_URL` in your proxy env export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/<>/<>/<>" ``` -**Update proxy config.yaml with slack alerting** +**Update proxy config.yaml with slack alerting** Add `general_settings:alerting` ```yaml model_list: From b283588eb80e29c4d419769b70130dc8238f0e34 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 2 Mar 2024 23:12:49 -0800 Subject: [PATCH 077/304] refactor(budget_alerts.md): add spacing in doc --- docs/my-website/docs/proxy/budget_alerts.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/my-website/docs/proxy/budget_alerts.md b/docs/my-website/docs/proxy/budget_alerts.md index ab90838e0..659cd6d59 100644 --- a/docs/my-website/docs/proxy/budget_alerts.md +++ b/docs/my-website/docs/proxy/budget_alerts.md @@ -21,6 +21,7 @@ export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/<>/<>/<>" ``` **Update proxy config.yaml with slack alerting** + Add `general_settings:alerting` ```yaml model_list: From 14a19fc6014a7d63e04c283aedd3fc8b12a901f3 Mon Sep 17 00:00:00 2001 From: xihajun Date: Sun, 3 Mar 2024 23:43:03 +0000 Subject: [PATCH 078/304] Disable special token restriction for claude ai --- litellm/llms/anthropic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 150ae0e07..6bfedc101 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -200,10 +200,10 @@ def completion( ## CALCULATING USAGE prompt_tokens = len( - encoding.encode(prompt) + encoding.encode(prompt,disallowed_special=()) ) ##[TODO] use the anthropic tokenizer here completion_tokens = len( - encoding.encode(model_response["choices"][0]["message"].get("content", "")) + encoding.encode(model_response["choices"][0]["message"].get("content", ""),disallowed_special=()) ) ##[TODO] use the anthropic tokenizer here model_response["created"] = int(time.time()) From 19eb9063fb09226be3178b2b47be3ab4e22822f3 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 07:13:08 -0800 Subject: [PATCH 079/304] (feat) - add claude 3 --- litellm/llms/anthropic.py | 31 ++++++++++++++----------------- litellm/main.py | 2 +- litellm/tests/test_completion.py | 16 ++++++++++++++++ litellm/utils.py | 2 +- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 150ae0e07..829a8becd 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -20,7 +20,7 @@ class AnthropicError(Exception): self.status_code = status_code self.message = message self.request = httpx.Request( - method="POST", url="https://api.anthropic.com/v1/complete" + method="POST", url="https://api.anthropic.com/v1/messages" ) self.response = httpx.Response(status_code=status_code, request=self.request) super().__init__( @@ -35,9 +35,7 @@ class AnthropicConfig: to pass metadata to anthropic, it's {"user_id": "any-relevant-information"} """ - max_tokens_to_sample: Optional[ - int - ] = litellm.max_tokens # anthropic requires a default + max_tokens: Optional[int] = litellm.max_tokens # anthropic requires a default stop_sequences: Optional[list] = None temperature: Optional[int] = None top_p: Optional[int] = None @@ -46,7 +44,7 @@ class AnthropicConfig: def __init__( self, - max_tokens_to_sample: Optional[int] = 256, # anthropic requires a default + max_tokens: Optional[int] = 256, # anthropic requires a default stop_sequences: Optional[list] = None, temperature: Optional[int] = None, top_p: Optional[int] = None, @@ -124,6 +122,10 @@ def completion( model=model, messages=messages, custom_llm_provider="anthropic" ) + for message in messages: + if message["role"] == "system": + message["role"] = "assistant" + ## Load Config config = litellm.AnthropicConfig.get_config() for k, v in config.items(): @@ -134,7 +136,7 @@ def completion( data = { "model": model, - "prompt": prompt, + "messages": messages, **optional_params, } @@ -173,7 +175,7 @@ def completion( ## LOGGING logging_obj.post_call( - input=prompt, + input=messages, api_key=api_key, original_response=response.text, additional_args={"complete_input_dict": data}, @@ -192,19 +194,14 @@ def completion( status_code=response.status_code, ) else: - if len(completion_response["completion"]) > 0: - model_response["choices"][0]["message"][ - "content" - ] = completion_response["completion"] + text_content = completion_response["content"][0].get("text", None) + model_response.choices[0].message.content = text_content # type: ignore model_response.choices[0].finish_reason = completion_response["stop_reason"] ## CALCULATING USAGE - prompt_tokens = len( - encoding.encode(prompt) - ) ##[TODO] use the anthropic tokenizer here - completion_tokens = len( - encoding.encode(model_response["choices"][0]["message"].get("content", "")) - ) ##[TODO] use the anthropic tokenizer here + prompt_tokens = completion_response["usage"]["input_tokens"] + completion_tokens = completion_response["usage"]["output_tokens"] + total_tokens = prompt_tokens + completion_tokens model_response["created"] = int(time.time()) model_response["model"] = model diff --git a/litellm/main.py b/litellm/main.py index 67586603d..9fbd1b828 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -1023,7 +1023,7 @@ def completion( api_base or litellm.api_base or get_secret("ANTHROPIC_API_BASE") - or "https://api.anthropic.com/v1/complete" + or "https://api.anthropic.com/v1/messages" ) custom_prompt_dict = custom_prompt_dict or litellm.custom_prompt_dict response = anthropic.completion( diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index f6be6e952..200b0ae58 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -84,6 +84,22 @@ def test_completion_claude(): # test_completion_claude() +def test_completion_claude_3(): + litellm.set_verbose = True + messages = [{"role": "user", "content": "Hello, world"}] + try: + # test without max tokens + response = completion( + model="anthropic/claude-3-opus-20240229", + messages=messages, + max_tokens=10, + ) + # Add any assertions, here to check response args + print(response) + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + def test_completion_mistral_api(): try: litellm.set_verbose = True diff --git a/litellm/utils.py b/litellm/utils.py index b3e197c1a..173f5e79e 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4200,7 +4200,7 @@ def get_optional_params( if top_p is not None: optional_params["top_p"] = top_p if max_tokens is not None: - optional_params["max_tokens_to_sample"] = max_tokens + optional_params["max_tokens"] = max_tokens elif custom_llm_provider == "cohere": ## check if unsupported param passed in supported_params = [ From fdd8199a255f3eae8f647e2e253d795ae6c86b06 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 07:29:23 -0800 Subject: [PATCH 080/304] (feat) streaming claude-3 --- litellm/tests/test_completion.py | 19 +++++++++++++++++++ litellm/utils.py | 17 ++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 200b0ae58..163a66af3 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -100,6 +100,25 @@ def test_completion_claude_3(): pytest.fail(f"Error occurred: {e}") +def test_completion_claude_3_stream(): + litellm.set_verbose = False + messages = [{"role": "user", "content": "Hello, world"}] + try: + # test without max tokens + response = completion( + model="anthropic/claude-3-opus-20240229", + messages=messages, + max_tokens=10, + stream=True, + ) + # Add any assertions, here to check response args + print(response) + for chunk in response: + print(chunk) + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + def test_completion_mistral_api(): try: litellm.set_verbose = True diff --git a/litellm/utils.py b/litellm/utils.py index 173f5e79e..c315ca4a4 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -8017,10 +8017,21 @@ class CustomStreamWrapper: finish_reason = None if str_line.startswith("data:"): data_json = json.loads(str_line[5:]) - text = data_json.get("completion", "") - if data_json.get("stop_reason", None): + type_chunk = data_json.get("type", None) + if type_chunk == "content_block_delta": + """ + Anthropic content chunk + chunk = {'type': 'content_block_delta', 'index': 0, 'delta': {'type': 'text_delta', 'text': 'Hello'}} + """ + text = data_json.get("delta", {}).get("text", "") + elif type_chunk == "message_delta": + """ + Anthropic + chunk = {'type': 'message_delta', 'delta': {'stop_reason': 'max_tokens', 'stop_sequence': None}, 'usage': {'output_tokens': 10}} + """ + # TODO - get usage from this chunk, set in response + finish_reason = data_json.get("delta", {}).get("stop_reason", None) is_finished = True - finish_reason = data_json["stop_reason"] return { "text": text, "is_finished": is_finished, From d5c750dcddf5013461813e535a48f51a891c2865 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 07:35:21 -0800 Subject: [PATCH 081/304] (feat) add claude-3 to model_prices --- .../model_prices_and_context_window_backup.json | 16 ++++++++++++++++ model_prices_and_context_window.json | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index d97c042c5..b29e15229 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -643,6 +643,22 @@ "litellm_provider": "anthropic", "mode": "chat" }, + "claude-3-opus-20240229": { + "max_tokens": 200000, + "max_output_tokens": 4096, + "input_cost_per_token": 0.000015, + "output_cost_per_token": 0.000075, + "litellm_provider": "anthropic", + "mode": "chat" + }, + "claude-3-sonnet-20240229": { + "max_tokens": 200000, + "max_output_tokens": 4096, + "input_cost_per_token": 0.000003, + "output_cost_per_token": 0.000015, + "litellm_provider": "anthropic", + "mode": "chat" + }, "text-bison": { "max_tokens": 8192, "input_cost_per_token": 0.000000125, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index d97c042c5..b29e15229 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -643,6 +643,22 @@ "litellm_provider": "anthropic", "mode": "chat" }, + "claude-3-opus-20240229": { + "max_tokens": 200000, + "max_output_tokens": 4096, + "input_cost_per_token": 0.000015, + "output_cost_per_token": 0.000075, + "litellm_provider": "anthropic", + "mode": "chat" + }, + "claude-3-sonnet-20240229": { + "max_tokens": 200000, + "max_output_tokens": 4096, + "input_cost_per_token": 0.000003, + "output_cost_per_token": 0.000015, + "litellm_provider": "anthropic", + "mode": "chat" + }, "text-bison": { "max_tokens": 8192, "input_cost_per_token": 0.000000125, From 25bbb73ce317436e8153a80d00484a356829069e Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 07:40:18 -0800 Subject: [PATCH 082/304] (docs) add claude-3 --- docs/my-website/docs/providers/anthropic.md | 68 ++++++++++++--------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/docs/my-website/docs/providers/anthropic.md b/docs/my-website/docs/providers/anthropic.md index cfa14cd32..617476b97 100644 --- a/docs/my-website/docs/providers/anthropic.md +++ b/docs/my-website/docs/providers/anthropic.md @@ -1,6 +1,7 @@ # Anthropic LiteLLM supports +- `claude-3` (`claude-3-opus-20240229`, `claude-3-sonnet-20240229`) - `claude-2` - `claude-2.1` - `claude-instant-1` @@ -24,11 +25,43 @@ from litellm import completion os.environ["ANTHROPIC_API_KEY"] = "your-api-key" messages = [{"role": "user", "content": "Hey! how's it going?"}] -response = completion(model="claude-instant-1", messages=messages) +response = completion(model="claude-3-opus-20240229", messages=messages) print(response) ``` -## Usage - "Assistant Pre-fill" + +## Usage - Streaming +Just set `stream=True` when calling completion. + +```python +import os +from litellm import completion + +# set env +os.environ["ANTHROPIC_API_KEY"] = "your-api-key" + +messages = [{"role": "user", "content": "Hey! how's it going?"}] +response = completion(model="claude-3-opus-20240229", messages=messages, stream=True) +for chunk in response: + print(chunk["choices"][0]["delta"]["content"]) # same as openai format +``` + + + +## Supported Models + +| Model Name | Function Call | +|------------------|--------------------------------------------| +| claude-3-opus | `completion('claude-3-opus-20240229', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-3-sonnet | `completion('claude-3-sonnet-20240229', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-2.1 | `completion('claude-2.1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-2 | `completion('claude-2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-instant-1 | `completion('claude-instant-1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-instant-1.2 | `completion('claude-instant-1.2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | + +## Advanced + +### Usage - "Assistant Pre-fill" You can "put words in Claude's mouth" by including an `assistant` role message as the last item in the `messages` array. @@ -50,7 +83,7 @@ response = completion(model="claude-2.1", messages=messages) print(response) ``` -### Example prompt sent to Claude +#### Example prompt sent to Claude ``` @@ -61,7 +94,7 @@ Human: How do you say 'Hello' in German? Return your answer as a JSON object, li Assistant: { ``` -## Usage - "System" messages +### Usage - "System" messages If you're using Anthropic's Claude 2.1 with Bedrock, `system` role messages are properly formatted for you. ```python @@ -78,7 +111,7 @@ messages = [ response = completion(model="claude-2.1", messages=messages) ``` -### Example prompt sent to Claude +#### Example prompt sent to Claude ``` You are a snarky assistant. @@ -88,28 +121,3 @@ Human: How do I boil water? Assistant: ``` -## Streaming -Just set `stream=True` when calling completion. - -```python -import os -from litellm import completion - -# set env -os.environ["ANTHROPIC_API_KEY"] = "your-api-key" - -messages = [{"role": "user", "content": "Hey! how's it going?"}] -response = completion(model="claude-instant-1", messages=messages, stream=True) -for chunk in response: - print(chunk["choices"][0]["delta"]["content"]) # same as openai format -``` - - -### Model Details - -| Model Name | Function Call | Required OS Variables | -|------------------|--------------------------------------------|--------------------------------------| -| claude-2.1 | `completion('claude-2.1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | -| claude-2 | `completion('claude-2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | -| claude-instant-1 | `completion('claude-instant-1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | -| claude-instant-1.2 | `completion('claude-instant-1.2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | From d179ae376e4256c2e9fdba4a84c054c3ee8ca971 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 07:53:06 -0800 Subject: [PATCH 083/304] (feat) claude-3 test fixes --- docs/my-website/docs/providers/anthropic.md | 2 -- litellm/llms/anthropic.py | 20 +++++++++++++++++++- litellm/tests/test_completion.py | 4 ++-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/docs/my-website/docs/providers/anthropic.md b/docs/my-website/docs/providers/anthropic.md index 617476b97..198a6a03d 100644 --- a/docs/my-website/docs/providers/anthropic.md +++ b/docs/my-website/docs/providers/anthropic.md @@ -4,7 +4,6 @@ LiteLLM supports - `claude-3` (`claude-3-opus-20240229`, `claude-3-sonnet-20240229`) - `claude-2` - `claude-2.1` -- `claude-instant-1` - `claude-instant-1.2` ## API Keys @@ -56,7 +55,6 @@ for chunk in response: | claude-3-sonnet | `completion('claude-3-sonnet-20240229', messages)` | `os.environ['ANTHROPIC_API_KEY']` | | claude-2.1 | `completion('claude-2.1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | | claude-2 | `completion('claude-2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | -| claude-instant-1 | `completion('claude-instant-1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | | claude-instant-1.2 | `completion('claude-instant-1.2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | ## Advanced diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 829a8becd..79b84c4d2 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -121,11 +121,29 @@ def completion( prompt = prompt_factory( model=model, messages=messages, custom_llm_provider="anthropic" ) - + """ + format messages for anthropic + 1. Anthropic supports roles like "user" and "assistant", (here litellm translates system-> assistant) + 2. The first message always needs to be of role "user" + """ + # 1. Anthropic only supports roles like "user" and "assistant" for message in messages: if message["role"] == "system": message["role"] = "assistant" + # 2. The first message always needs to be of role "user" + if len(messages) > 0: + if messages[0]["role"] != "user": + # find the index of the first user message + for i, message in enumerate(messages): + if message["role"] == "user": + break + + # remove the user message at existing position and add it to the front + messages.pop(i) + # move the first user message to the front + messages = [message] + messages + ## Load Config config = litellm.AnthropicConfig.get_config() for k, v in config.items(): diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 163a66af3..bbe1dae3a 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -56,7 +56,7 @@ def test_completion_custom_provider_model_name(): def test_completion_claude(): litellm.set_verbose = True litellm.cache = None - litellm.AnthropicConfig(max_tokens_to_sample=200, metadata={"user_id": "1224"}) + litellm.AnthropicConfig(max_tokens=200, metadata={"user_id": "1224"}) messages = [ { "role": "system", @@ -67,7 +67,7 @@ def test_completion_claude(): try: # test without max tokens response = completion( - model="claude-instant-1", + model="claude-instant-1.2", messages=messages, request_timeout=10, ) From 019b9ef6f6c9577d9575aceb2f475defaeec7ded Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 08:01:02 -0800 Subject: [PATCH 084/304] fix(utils.py): fix num retries logic --- litellm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index b3e197c1a..5f9e8cac9 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -2585,7 +2585,7 @@ def client(original_function): if ( isinstance(e, openai.APIError) or isinstance(e, openai.Timeout) - or isinstance(openai.APIConnectionError) + or isinstance(e, openai.APIConnectionError) ): print_verbose(f"RETRY TRIGGERED!") kwargs["num_retries"] = num_retries From ba460e68384cb274e9f6767d43fb27a5a6b001fc Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 08:20:26 -0800 Subject: [PATCH 085/304] (test) claude fixes --- litellm/llms/anthropic.py | 14 +++++++++++++- litellm/tests/test_add_function_to_prompt.py | 3 ++- litellm/tests/test_completion.py | 9 +++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 79b84c4d2..44a1b128a 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -125,12 +125,19 @@ def completion( format messages for anthropic 1. Anthropic supports roles like "user" and "assistant", (here litellm translates system-> assistant) 2. The first message always needs to be of role "user" + 3. Each message must alternate between "user" and "assistant" (this is not addressed as now by litellm) + 4. final assistant content cannot end with trailing whitespace (anthropic raises an error otherwise) """ # 1. Anthropic only supports roles like "user" and "assistant" - for message in messages: + for idx, message in enumerate(messages): if message["role"] == "system": message["role"] = "assistant" + # if this is the final assistant message, remove trailing whitespace + # TODO: only do this if it's the final assistant message + if message["role"] == "assistant": + message["content"] = message["content"].strip() + # 2. The first message always needs to be of role "user" if len(messages) > 0: if messages[0]["role"] != "user": @@ -211,6 +218,11 @@ def completion( message=str(completion_response["error"]), status_code=response.status_code, ) + elif len(completion_response["content"]) == 0: + raise AnthropicError( + message="No content in response", + status_code=response.status_code, + ) else: text_content = completion_response["content"][0].get("text", None) model_response.choices[0].message.content = text_content # type: ignore diff --git a/litellm/tests/test_add_function_to_prompt.py b/litellm/tests/test_add_function_to_prompt.py index 932e6edd1..93b09cd8c 100644 --- a/litellm/tests/test_add_function_to_prompt.py +++ b/litellm/tests/test_add_function_to_prompt.py @@ -47,8 +47,9 @@ test_function_call_non_openai_model() ## case 2: add_function_to_prompt set def test_function_call_non_openai_model_litellm_mod_set(): litellm.add_function_to_prompt = True + litellm.set_verbose = True try: - model = "claude-instant-1" + model = "claude-instant-1.2" messages = [{"role": "user", "content": "what's the weather in sf?"}] functions = [ { diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index bbe1dae3a..a9d41be8d 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -92,7 +92,6 @@ def test_completion_claude_3(): response = completion( model="anthropic/claude-3-opus-20240229", messages=messages, - max_tokens=10, ) # Add any assertions, here to check response args print(response) @@ -198,19 +197,17 @@ def test_completion_mistral_api_modified_input(): def test_completion_claude2_1(): try: + litellm.set_verbose = True print("claude2.1 test request") messages = [ { "role": "system", - "content": "Your goal is generate a joke on the topic user gives", + "content": "Your goal is generate a joke on the topic user gives.", }, - {"role": "assistant", "content": "Hi, how can i assist you today?"}, {"role": "user", "content": "Generate a 3 liner joke for me"}, ] # test without max tokens - response = completion( - model="claude-2.1", messages=messages, request_timeout=10, max_tokens=10 - ) + response = completion(model="claude-2.1", messages=messages) # Add any assertions here to check the response print(response) print(response.usage) From 3e8cecc03b18d1612e0b5426d11db052e26f7f61 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 08:29:16 -0800 Subject: [PATCH 086/304] (fix) test streaming --- litellm/tests/test_streaming.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py index 083953f57..5767a944b 100644 --- a/litellm/tests/test_streaming.py +++ b/litellm/tests/test_streaming.py @@ -348,7 +348,7 @@ def test_completion_claude_stream(): }, ] response = completion( - model="claude-instant-1", messages=messages, stream=True, max_tokens=50 + model="claude-instant-1.2", messages=messages, stream=True, max_tokens=50 ) complete_response = "" # Add any assertions here to check the response From 9bac163e4ebd3fc73a4af79490f570997171cd60 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 08:32:13 -0800 Subject: [PATCH 087/304] (test) claude-instant-1 --- litellm/tests/test_provider_specific_config.py | 6 +++--- litellm/tests/test_router.py | 2 +- litellm/tests/test_router_timeout.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/litellm/tests/test_provider_specific_config.py b/litellm/tests/test_provider_specific_config.py index 5e5d19c78..dcb4dcb4c 100644 --- a/litellm/tests/test_provider_specific_config.py +++ b/litellm/tests/test_provider_specific_config.py @@ -53,7 +53,7 @@ def claude_test_completion(): try: # OVERRIDE WITH DYNAMIC MAX TOKENS response_1 = litellm.completion( - model="claude-instant-1", + model="claude-instant-1.2", messages=[{"content": "Hello, how are you?", "role": "user"}], max_tokens=10, ) @@ -63,7 +63,7 @@ def claude_test_completion(): # USE CONFIG TOKENS response_2 = litellm.completion( - model="claude-instant-1", + model="claude-instant-1.2", messages=[{"content": "Hello, how are you?", "role": "user"}], ) # Add any assertions here to check the response @@ -74,7 +74,7 @@ def claude_test_completion(): try: response_3 = litellm.completion( - model="claude-instant-1", + model="claude-instant-1.2", messages=[{"content": "Hello, how are you?", "role": "user"}], n=2, ) diff --git a/litellm/tests/test_router.py b/litellm/tests/test_router.py index 127caf223..7c182ee68 100644 --- a/litellm/tests/test_router.py +++ b/litellm/tests/test_router.py @@ -933,7 +933,7 @@ def test_router_anthropic_key_dynamic(): { "model_name": "anthropic-claude", "litellm_params": { - "model": "claude-instant-1", + "model": "claude-instant-1.2", "api_key": anthropic_api_key, }, } diff --git a/litellm/tests/test_router_timeout.py b/litellm/tests/test_router_timeout.py index 139914f6d..3816c649e 100644 --- a/litellm/tests/test_router_timeout.py +++ b/litellm/tests/test_router_timeout.py @@ -35,7 +35,7 @@ def test_router_timeouts(): { "model_name": "anthropic-claude-instant-1.2", "litellm_params": { - "model": "claude-instant-1", + "model": "claude-instant-1.2", "api_key": "os.environ/ANTHROPIC_API_KEY", }, "tpm": 20000, From 1bd92b20dd49370b412da25f9a4549f5f265ce5d Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 08:44:39 -0800 Subject: [PATCH 088/304] (test-fix) hf is unstable --- litellm/tests/test_text_completion.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/litellm/tests/test_text_completion.py b/litellm/tests/test_text_completion.py index 0b9811183..a16b86449 100644 --- a/litellm/tests/test_text_completion.py +++ b/litellm/tests/test_text_completion.py @@ -2836,6 +2836,8 @@ def test_completion_hf_prompt_array(): print(str(e)) if "is currently loading" in str(e): return + if "Service Unavailable" in str(e): + return pytest.fail(f"Error occurred: {e}") From 2d051addf1d3d4e92240e208849dda7a0df65d61 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 09:06:42 -0800 Subject: [PATCH 089/304] (test) test_exceptions.py --- litellm/tests/test_exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index 9c90014c0..311bbfa57 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -70,7 +70,7 @@ models = ["command-nightly"] @pytest.mark.parametrize("model", models) def test_context_window_with_fallbacks(model): ctx_window_fallback_dict = { - "command-nightly": "claude-2", + "command-nightly": "claude-2.1", "gpt-3.5-turbo-instruct": "gpt-3.5-turbo-16k", "azure/chatgpt-v-2": "gpt-3.5-turbo-16k", } From 766e8cba8405fda1a7331be88a538d760eb247b7 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 09:24:26 -0800 Subject: [PATCH 090/304] =?UTF-8?q?bump:=20version=201.28.12=20=E2=86=92?= =?UTF-8?q?=201.28.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model_prices_and_context_window_backup.json | 16 +++++++++++++++- pyproject.toml | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index b29e15229..23afaf04d 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -1252,6 +1252,20 @@ "litellm_provider": "bedrock", "mode": "embedding" }, + "bedrock/us-west-2/mistral.mixtral-8x7b-instruct": { + "max_tokens": 32000, + "input_cost_per_token": 0.00000045, + "output_cost_per_token": 0.0000007, + "litellm_provider": "bedrock", + "mode": "completion" + }, + "bedrock/us-west-2/mistral.mistral-7b-instruct": { + "max_tokens": 32000, + "input_cost_per_token": 0.00000015, + "output_cost_per_token": 0.0000002, + "litellm_provider": "bedrock", + "mode": "completion" + }, "anthropic.claude-v1": { "max_tokens": 100000, "max_output_tokens": 8191, @@ -2236,4 +2250,4 @@ "mode": "embedding" } -} +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index acb605982..b136ffdcd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.11" +version = "1.28.13" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.11" +version = "1.28.13" version_files = [ "pyproject.toml:^version" ] From 873ddde9247eec82b7795ce49d4c6e1a4f4c7d7a Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 09:32:27 -0800 Subject: [PATCH 091/304] fix(huggingface_restapi.py): fix huggingface streaming error raising --- litellm/llms/huggingface_restapi.py | 55 ++++++++++++++++++++++++++--- litellm/proxy/proxy_server.py | 13 ++++++- litellm/utils.py | 5 +-- 3 files changed, 65 insertions(+), 8 deletions(-) diff --git a/litellm/llms/huggingface_restapi.py b/litellm/llms/huggingface_restapi.py index 205bad7ee..61a6ac040 100644 --- a/litellm/llms/huggingface_restapi.py +++ b/litellm/llms/huggingface_restapi.py @@ -634,15 +634,60 @@ class Huggingface(BaseLLM): status_code=r.status_code, message=str(text), ) - streamwrapper = CustomStreamWrapper( - completion_stream=r.aiter_lines(), + """ + Check first chunk for error message. + If error message, raise error. + If not - add back to stream + """ + # Async iterator over the lines in the response body + response_iterator = r.aiter_lines() + + # Attempt to get the first line/chunk from the response + try: + first_chunk = await response_iterator.__anext__() + except StopAsyncIteration: + # Handle the case where there are no lines to read (empty response) + first_chunk = "" + + # Check the first chunk for an error message + if ( + "error" in first_chunk.lower() + ): # Adjust this condition based on how error messages are structured + raise HuggingfaceError( + status_code=400, + message=first_chunk, + ) + + return self.async_streaming_generator( + first_chunk=first_chunk, + response_iterator=response_iterator, model=model, - custom_llm_provider="huggingface", logging_obj=logging_obj, ) - async for transformed_chunk in streamwrapper: - yield transformed_chunk + async def async_streaming_generator( + self, first_chunk, response_iterator, model, logging_obj + ): + # Create a new async generator that begins with the first_chunk and includes the remaining items + async def custom_stream_with_first_chunk(): + yield first_chunk # Yield back the first chunk + async for ( + chunk + ) in response_iterator: # Continue yielding the rest of the chunks + yield chunk + + # Creating a new completion stream that starts with the first chunk + completion_stream = custom_stream_with_first_chunk() + + streamwrapper = CustomStreamWrapper( + completion_stream=completion_stream, + model=model, + custom_llm_provider="huggingface", + logging_obj=logging_obj, + ) + + async for transformed_chunk in streamwrapper: + yield transformed_chunk def embedding( self, diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index f1dec3881..7dbb068bc 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -167,6 +167,15 @@ class ProxyException(Exception): self.param = param self.code = code + def to_dict(self) -> dict: + """Converts the ProxyException instance to a dictionary.""" + return { + "message": self.message, + "type": self.type, + "param": self.param, + "code": self.code, + } + @app.exception_handler(ProxyException) async def openai_exception_handler(request: Request, exc: ProxyException): @@ -2241,12 +2250,14 @@ async def async_data_generator(response, user_api_key_dict): error_traceback = traceback.format_exc() error_msg = f"{str(e)}\n\n{error_traceback}" - raise ProxyException( + proxy_exception = ProxyException( message=getattr(e, "message", error_msg), type=getattr(e, "type", "None"), param=getattr(e, "param", "None"), code=getattr(e, "status_code", 500), ) + error_returned = json.dumps({"error": proxy_exception.to_dict()}) + yield f"data: {error_returned}\n\n" def select_data_generator(response, user_api_key_dict): diff --git a/litellm/utils.py b/litellm/utils.py index 53e6e8245..233fd6bae 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -8117,7 +8117,8 @@ class CustomStreamWrapper: text = "" # don't return the final bos token is_finished = True finish_reason = "stop" - + elif data_json.get("error", False): + raise Exception(data_json.get("error")) return { "text": text, "is_finished": is_finished, @@ -8132,7 +8133,7 @@ class CustomStreamWrapper: } except Exception as e: traceback.print_exc() - # raise(e) + raise e def handle_ai21_chunk(self, chunk): # fake streaming chunk = chunk.decode("utf-8") From a52169e04d41133e07034c6b24b977b1d5d8f445 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 09:33:44 -0800 Subject: [PATCH 092/304] refactor(main.py): trigger new build --- litellm/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/main.py b/litellm/main.py index 9fbd1b828..b7707b722 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,7 +12,6 @@ from typing import Any, Literal, Union from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy - import httpx import litellm from ._logging import verbose_logger From bd37b38ece20cb532be8f91ea48f5c3ed9dedd3b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 09:34:01 -0800 Subject: [PATCH 093/304] =?UTF-8?q?bump:=20version=201.28.13=20=E2=86=92?= =?UTF-8?q?=201.28.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b136ffdcd..78d4b5cea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.13" +version = "1.28.14" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.13" +version = "1.28.14" version_files = [ "pyproject.toml:^version" ] From 1c4028262790c7808c2040b4826c2bfc9932d7b1 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 10:11:29 -0800 Subject: [PATCH 094/304] fix(anthropic.py): support anthropic system prompt --- litellm/llms/anthropic.py | 45 ++++++++---------------- litellm/llms/prompt_templates/factory.py | 45 +++++++++++++++++++++--- 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 44a1b128a..184bc7153 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -41,6 +41,7 @@ class AnthropicConfig: top_p: Optional[int] = None top_k: Optional[int] = None metadata: Optional[dict] = None + system: Optional[str] = None def __init__( self, @@ -50,6 +51,7 @@ class AnthropicConfig: top_p: Optional[int] = None, top_k: Optional[int] = None, metadata: Optional[dict] = None, + system: Optional[str] = None, ) -> None: locals_ = locals() for key, value in locals_.items(): @@ -118,38 +120,19 @@ def completion( messages=messages, ) else: - prompt = prompt_factory( + # Separate system prompt from rest of message + system_prompt_idx: Optional[int] = None + for idx, message in enumerate(messages): + if message["role"] == "system": + optional_params["system"] = message["content"] + system_prompt_idx = idx + break + if system_prompt_idx is not None: + messages.pop(system_prompt_idx) + # Format rest of message according to anthropic guidelines + messages = prompt_factory( model=model, messages=messages, custom_llm_provider="anthropic" ) - """ - format messages for anthropic - 1. Anthropic supports roles like "user" and "assistant", (here litellm translates system-> assistant) - 2. The first message always needs to be of role "user" - 3. Each message must alternate between "user" and "assistant" (this is not addressed as now by litellm) - 4. final assistant content cannot end with trailing whitespace (anthropic raises an error otherwise) - """ - # 1. Anthropic only supports roles like "user" and "assistant" - for idx, message in enumerate(messages): - if message["role"] == "system": - message["role"] = "assistant" - - # if this is the final assistant message, remove trailing whitespace - # TODO: only do this if it's the final assistant message - if message["role"] == "assistant": - message["content"] = message["content"].strip() - - # 2. The first message always needs to be of role "user" - if len(messages) > 0: - if messages[0]["role"] != "user": - # find the index of the first user message - for i, message in enumerate(messages): - if message["role"] == "user": - break - - # remove the user message at existing position and add it to the front - messages.pop(i) - # move the first user message to the front - messages = [message] + messages ## Load Config config = litellm.AnthropicConfig.get_config() @@ -167,7 +150,7 @@ def completion( ## LOGGING logging_obj.pre_call( - input=prompt, + input=messages, api_key=api_key, additional_args={ "complete_input_dict": data, diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 103eb5977..6b0deb2ee 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -424,6 +424,46 @@ def anthropic_pt( return prompt +def anthropic_messages_pt(messages: list): + """ + format messages for anthropic + 1. Anthropic supports roles like "user" and "assistant", (here litellm translates system-> assistant) + 2. The first message always needs to be of role "user" + 3. Each message must alternate between "user" and "assistant" (this is not addressed as now by litellm) + 4. final assistant content cannot end with trailing whitespace (anthropic raises an error otherwise) + 5. System messages are a separate param to the Messages API (used for tool calling) + """ + ## Ensure final assistant message has no trailing whitespace + last_assistant_message_idx: Optional[int] = None + # reformat messages to ensure user/assistant are alternating, if there's either 2 consecutive 'user' messages or 2 consecutive 'assistant' message, add a blank 'user' or 'assistant' message to ensure compatibility + new_messages = [] + for i in range(len(messages) - 1): # type: ignore + if i == 0 and messages[i]["role"] == "assistant": + new_messages.append({"role": "user", "content": ""}) + + new_messages.append(messages[i]) + + if messages[i]["role"] == messages[i + 1]["role"]: + if messages[i]["role"] == "user": + new_messages.append({"role": "assistant", "content": ""}) + else: + new_messages.append({"role": "user", "content": ""}) + + if messages[i]["role"] == "assistant": + last_assistant_message_idx = i + + new_messages.append(messages[-1]) + + if last_assistant_message_idx is not None: + new_messages[last_assistant_message_idx]["content"] = new_messages[ + last_assistant_message_idx + ][ + "content" + ].strip() # no trailing whitespace for final assistant message + + return new_messages + + def amazon_titan_pt( messages: list, ): # format - https://github.com/BerriAI/litellm/issues/1896 @@ -650,10 +690,7 @@ def prompt_factory( if custom_llm_provider == "ollama": return ollama_pt(model=model, messages=messages) elif custom_llm_provider == "anthropic": - if any(_ in model for _ in ["claude-2.1", "claude-v2:1"]): - return claude_2_1_pt(messages=messages) - else: - return anthropic_pt(messages=messages) + return anthropic_messages_pt(messages=messages) elif custom_llm_provider == "together_ai": prompt_format, chat_template = get_model_info(token=api_key, model=model) return format_prompt_togetherai( From ae82b3f31a3b535cb48d51bcd5de6932acfa12c6 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 10:42:28 -0800 Subject: [PATCH 095/304] feat(anthropic.py): adds tool calling support --- litellm/llms/anthropic.py | 15 +++++- litellm/llms/prompt_templates/factory.py | 63 +++++++++++++++++++++++- litellm/utils.py | 15 +++++- 3 files changed, 89 insertions(+), 4 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 184bc7153..ce413be65 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -6,7 +6,11 @@ import time from typing import Callable, Optional from litellm.utils import ModelResponse, Usage import litellm -from .prompt_templates.factory import prompt_factory, custom_prompt +from .prompt_templates.factory import ( + prompt_factory, + custom_prompt, + construct_tool_use_system_prompt, +) import httpx @@ -142,6 +146,15 @@ def completion( ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in optional_params[k] = v + ## Handle Tool Calling + if "tools" in optional_params: + tool_calling_system_prompt = construct_tool_use_system_prompt( + tools=optional_params["tools"] + ) + optional_params["system"] = ( + optional_params("system", "\n") + tool_calling_system_prompt + ) # add the anthropic tool calling prompt to the system prompt + data = { "model": model, "messages": messages, diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 6b0deb2ee..cc75237e0 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -390,7 +390,7 @@ def format_prompt_togetherai(messages, prompt_format, chat_template): return prompt -### +### ANTHROPIC ### def anthropic_pt( @@ -424,6 +424,62 @@ def anthropic_pt( return prompt +def construct_format_parameters_prompt(parameters: dict): + parameter_str = "\n" + for k, v in parameters.items(): + parameter_str += f"<{k}>" + parameter_str += f"{v}" + parameter_str += f"" + parameter_str += "\n" + return parameter_str + + +def construct_format_tool_for_claude_prompt(name, description, parameters): + constructed_prompt = ( + "\n" + f"{name}\n" + "\n" + f"{description}\n" + "\n" + "\n" + f"{construct_format_parameters_prompt(parameters)}\n" + "\n" + "" + ) + return constructed_prompt + + +def construct_tool_use_system_prompt( + tools, +): # from https://github.com/anthropics/anthropic-cookbook/blob/main/function_calling/function_calling.ipynb + tool_str_list = [] + for tool in tools: + tool_str = construct_format_tool_for_claude_prompt( + tool["function"]["name"], + tool["function"].get("description", ""), + tool["function"].get("parameters", {}), + ) + tool_str_list.append(tool_str) + tool_use_system_prompt = ( + "In this environment you have access to a set of tools you can use to answer the user's question.\n" + "\n" + "You may call them like this:\n" + "\n" + "\n" + "$TOOL_NAME\n" + "\n" + "<$PARAMETER_NAME>$PARAMETER_VALUE\n" + "...\n" + "\n" + "\n" + "\n" + "\n" + "Here are the tools available:\n" + "\n" + "\n".join([tool_str for tool_str in tool_str_list]) + "\n" + ) + return tool_use_system_prompt + + def anthropic_messages_pt(messages: list): """ format messages for anthropic @@ -464,6 +520,9 @@ def anthropic_messages_pt(messages: list): return new_messages +### + + def amazon_titan_pt( messages: list, ): # format - https://github.com/BerriAI/litellm/issues/1896 @@ -690,6 +749,8 @@ def prompt_factory( if custom_llm_provider == "ollama": return ollama_pt(model=model, messages=messages) elif custom_llm_provider == "anthropic": + if model == "claude-instant-1" or model == "claude-2.1": + return anthropic_pt(messages=messages) return anthropic_messages_pt(messages=messages) elif custom_llm_provider == "together_ai": prompt_format, chat_template = get_model_info(token=api_key, model=model) diff --git a/litellm/utils.py b/litellm/utils.py index 233fd6bae..69f324589 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4106,6 +4106,7 @@ def get_optional_params( and custom_llm_provider != "anyscale" and custom_llm_provider != "together_ai" and custom_llm_provider != "mistral" + and custom_llm_provider != "anthropic" ): if custom_llm_provider == "ollama" or custom_llm_provider == "ollama_chat": # ollama actually supports json output @@ -4186,7 +4187,15 @@ def get_optional_params( ## raise exception if provider doesn't support passed in param if custom_llm_provider == "anthropic": ## check if unsupported param passed in - supported_params = ["stream", "stop", "temperature", "top_p", "max_tokens"] + supported_params = [ + "stream", + "stop", + "temperature", + "top_p", + "max_tokens", + "tools", + "tool_choice", + ] _check_valid_arg(supported_params=supported_params) # handle anthropic params if stream: @@ -4201,6 +4210,8 @@ def get_optional_params( optional_params["top_p"] = top_p if max_tokens is not None: optional_params["max_tokens"] = max_tokens + if tools is not None: + optional_params["tools"] = tools elif custom_llm_provider == "cohere": ## check if unsupported param passed in supported_params = [ @@ -9704,4 +9715,4 @@ def _get_base_model_from_metadata(model_call_details=None): base_model = model_info.get("base_model", None) if base_model is not None: return base_model - return None \ No newline at end of file + return None From 9094be7fbd1f566012bcd2e075f57808bed31372 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 11:13:14 -0800 Subject: [PATCH 096/304] (feat) maintain support to Anthropic text completion --- litellm/__init__.py | 3 +- litellm/llms/anthropic_text.py | 222 +++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 litellm/llms/anthropic_text.py diff --git a/litellm/__init__.py b/litellm/__init__.py index 0bc5f4f39..e42bfbf03 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -573,6 +573,7 @@ from .utils import ( ) from .llms.huggingface_restapi import HuggingfaceConfig from .llms.anthropic import AnthropicConfig +from .llms.anthropic_text import AnthropicTextConfig from .llms.replicate import ReplicateConfig from .llms.cohere import CohereConfig from .llms.ai21 import AI21Config @@ -594,7 +595,7 @@ from .llms.bedrock import ( AmazonCohereConfig, AmazonLlamaConfig, AmazonStabilityConfig, - AmazonMistralConfig + AmazonMistralConfig, ) from .llms.openai import OpenAIConfig, OpenAITextCompletionConfig from .llms.azure import AzureOpenAIConfig, AzureOpenAIError diff --git a/litellm/llms/anthropic_text.py b/litellm/llms/anthropic_text.py new file mode 100644 index 000000000..bccc8c769 --- /dev/null +++ b/litellm/llms/anthropic_text.py @@ -0,0 +1,222 @@ +import os, types +import json +from enum import Enum +import requests +import time +from typing import Callable, Optional +from litellm.utils import ModelResponse, Usage +import litellm +from .prompt_templates.factory import prompt_factory, custom_prompt +import httpx + + +class AnthropicConstants(Enum): + HUMAN_PROMPT = "\n\nHuman: " + AI_PROMPT = "\n\nAssistant: " + + +class AnthropicError(Exception): + def __init__(self, status_code, message): + self.status_code = status_code + self.message = message + self.request = httpx.Request( + method="POST", url="https://api.anthropic.com/v1/complete" + ) + self.response = httpx.Response(status_code=status_code, request=self.request) + super().__init__( + self.message + ) # Call the base class constructor with the parameters it needs + + +class AnthropicTextConfig: + """ + Reference: https://docs.anthropic.com/claude/reference/complete_post + + to pass metadata to anthropic, it's {"user_id": "any-relevant-information"} + """ + + max_tokens_to_sample: Optional[int] = ( + litellm.max_tokens + ) # anthropic requires a default + stop_sequences: Optional[list] = None + temperature: Optional[int] = None + top_p: Optional[int] = None + top_k: Optional[int] = None + metadata: Optional[dict] = None + + def __init__( + self, + max_tokens_to_sample: Optional[int] = 256, # anthropic requires a default + stop_sequences: Optional[list] = None, + temperature: Optional[int] = None, + top_p: Optional[int] = None, + top_k: Optional[int] = None, + metadata: Optional[dict] = None, + ) -> None: + locals_ = locals() + for key, value in locals_.items(): + if key != "self" and value is not None: + setattr(self.__class__, key, value) + + @classmethod + def get_config(cls): + return { + k: v + for k, v in cls.__dict__.items() + if not k.startswith("__") + and not isinstance( + v, + ( + types.FunctionType, + types.BuiltinFunctionType, + classmethod, + staticmethod, + ), + ) + and v is not None + } + + +# makes headers for API call +def validate_environment(api_key, user_headers): + if api_key is None: + raise ValueError( + "Missing Anthropic API Key - A call is being made to anthropic but no key is set either in the environment variables or via params" + ) + headers = { + "accept": "application/json", + "anthropic-version": "2023-06-01", + "content-type": "application/json", + "x-api-key": api_key, + } + if user_headers is not None and isinstance(user_headers, dict): + headers = {**headers, **user_headers} + return headers + + +def completion( + model: str, + messages: list, + api_base: str, + custom_prompt_dict: dict, + model_response: ModelResponse, + print_verbose: Callable, + encoding, + api_key, + logging_obj, + optional_params=None, + litellm_params=None, + logger_fn=None, + headers={}, +): + headers = validate_environment(api_key, headers) + if model in custom_prompt_dict: + # check if the model has a registered custom prompt + model_prompt_details = custom_prompt_dict[model] + prompt = custom_prompt( + role_dict=model_prompt_details["roles"], + initial_prompt_value=model_prompt_details["initial_prompt_value"], + final_prompt_value=model_prompt_details["final_prompt_value"], + messages=messages, + ) + else: + prompt = prompt_factory( + model=model, messages=messages, custom_llm_provider="anthropic" + ) + + ## Load Config + config = litellm.AnthropicTextConfig.get_config() + for k, v in config.items(): + if ( + k not in optional_params + ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in + optional_params[k] = v + + data = { + "model": model, + "prompt": prompt, + **optional_params, + } + + ## LOGGING + logging_obj.pre_call( + input=prompt, + api_key=api_key, + additional_args={ + "complete_input_dict": data, + "api_base": api_base, + "headers": headers, + }, + ) + + ## COMPLETION CALL + if "stream" in optional_params and optional_params["stream"] == True: + response = requests.post( + api_base, + headers=headers, + data=json.dumps(data), + stream=optional_params["stream"], + ) + + if response.status_code != 200: + raise AnthropicError( + status_code=response.status_code, message=response.text + ) + + return response.iter_lines() + else: + response = requests.post(api_base, headers=headers, data=json.dumps(data)) + if response.status_code != 200: + raise AnthropicError( + status_code=response.status_code, message=response.text + ) + + ## LOGGING + logging_obj.post_call( + input=prompt, + api_key=api_key, + original_response=response.text, + additional_args={"complete_input_dict": data}, + ) + print_verbose(f"raw model_response: {response.text}") + ## RESPONSE OBJECT + try: + completion_response = response.json() + except: + raise AnthropicError( + message=response.text, status_code=response.status_code + ) + if "error" in completion_response: + raise AnthropicError( + message=str(completion_response["error"]), + status_code=response.status_code, + ) + else: + if len(completion_response["completion"]) > 0: + model_response["choices"][0]["message"]["content"] = ( + completion_response["completion"] + ) + model_response.choices[0].finish_reason = completion_response["stop_reason"] + + ## CALCULATING USAGE + prompt_tokens = len( + encoding.encode(prompt) + ) ##[TODO] use the anthropic tokenizer here + completion_tokens = len( + encoding.encode(model_response["choices"][0]["message"].get("content", "")) + ) ##[TODO] use the anthropic tokenizer here + + model_response["created"] = int(time.time()) + model_response["model"] = model + usage = Usage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=prompt_tokens + completion_tokens, + ) + model_response.usage = usage + return model_response + + +def embedding(): + # logic for parsing in - calling - parsing out model embedding calls + pass From 1183e5f2e5c4c71482034f1c20af5e9c671d40fb Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 11:16:34 -0800 Subject: [PATCH 097/304] (feat) maintain anthropic text completion --- docs/my-website/docs/providers/anthropic.md | 1 + litellm/main.py | 70 ++++++++++++++------- litellm/tests/test_completion.py | 5 +- litellm/utils.py | 8 ++- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/docs/my-website/docs/providers/anthropic.md b/docs/my-website/docs/providers/anthropic.md index 198a6a03d..aff3415d3 100644 --- a/docs/my-website/docs/providers/anthropic.md +++ b/docs/my-website/docs/providers/anthropic.md @@ -56,6 +56,7 @@ for chunk in response: | claude-2.1 | `completion('claude-2.1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | | claude-2 | `completion('claude-2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | | claude-instant-1.2 | `completion('claude-instant-1.2', messages)` | `os.environ['ANTHROPIC_API_KEY']` | +| claude-instant-1 | `completion('claude-instant-1', messages)` | `os.environ['ANTHROPIC_API_KEY']` | ## Advanced diff --git a/litellm/main.py b/litellm/main.py index b7707b722..60effd96f 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -39,6 +39,7 @@ from litellm.utils import ( ) from .llms import ( anthropic, + anthropic_text, together_ai, ai21, sagemaker, @@ -1018,28 +1019,55 @@ def completion( or litellm.api_key or os.environ.get("ANTHROPIC_API_KEY") ) - api_base = ( - api_base - or litellm.api_base - or get_secret("ANTHROPIC_API_BASE") - or "https://api.anthropic.com/v1/messages" - ) custom_prompt_dict = custom_prompt_dict or litellm.custom_prompt_dict - response = anthropic.completion( - model=model, - messages=messages, - api_base=api_base, - custom_prompt_dict=litellm.custom_prompt_dict, - model_response=model_response, - print_verbose=print_verbose, - optional_params=optional_params, - litellm_params=litellm_params, - logger_fn=logger_fn, - encoding=encoding, # for calculating input/output tokens - api_key=api_key, - logging_obj=logging, - headers=headers, - ) + + if (model == "claude-2") or (model == "claude-instant-1"): + # call anthropic /completion, only use this route for claude-2, claude-instant-1 + api_base = ( + api_base + or litellm.api_base + or get_secret("ANTHROPIC_API_BASE") + or "https://api.anthropic.com/v1/complete" + ) + response = anthropic_text.completion( + model=model, + messages=messages, + api_base=api_base, + custom_prompt_dict=litellm.custom_prompt_dict, + model_response=model_response, + print_verbose=print_verbose, + optional_params=optional_params, + litellm_params=litellm_params, + logger_fn=logger_fn, + encoding=encoding, # for calculating input/output tokens + api_key=api_key, + logging_obj=logging, + headers=headers, + ) + else: + # call /messages + # default route for all anthropic models + api_base = ( + api_base + or litellm.api_base + or get_secret("ANTHROPIC_API_BASE") + or "https://api.anthropic.com/v1/messages" + ) + response = anthropic.completion( + model=model, + messages=messages, + api_base=api_base, + custom_prompt_dict=litellm.custom_prompt_dict, + model_response=model_response, + print_verbose=print_verbose, + optional_params=optional_params, + litellm_params=litellm_params, + logger_fn=logger_fn, + encoding=encoding, # for calculating input/output tokens + api_key=api_key, + logging_obj=logging, + headers=headers, + ) if "stream" in optional_params and optional_params["stream"] == True: # don't try to access stream object, response = CustomStreamWrapper( diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index a9d41be8d..13a08689c 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -56,7 +56,7 @@ def test_completion_custom_provider_model_name(): def test_completion_claude(): litellm.set_verbose = True litellm.cache = None - litellm.AnthropicConfig(max_tokens=200, metadata={"user_id": "1224"}) + litellm.AnthropicTextConfig(max_tokens_to_sample=200, metadata={"user_id": "1224"}) messages = [ { "role": "system", @@ -67,9 +67,10 @@ def test_completion_claude(): try: # test without max tokens response = completion( - model="claude-instant-1.2", + model="claude-instant-1", messages=messages, request_timeout=10, + max_tokens=10, ) # Add any assertions, here to check response args print(response) diff --git a/litellm/utils.py b/litellm/utils.py index 233fd6bae..4b9b0c8a4 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4200,7 +4200,11 @@ def get_optional_params( if top_p is not None: optional_params["top_p"] = top_p if max_tokens is not None: - optional_params["max_tokens"] = max_tokens + if (model == "claude-2") or (model == "claude-instant-1"): + # these models use antropic_text.py which only accepts max_tokens_to_sample + optional_params["max_tokens_to_sample"] = max_tokens + else: + optional_params["max_tokens"] = max_tokens elif custom_llm_provider == "cohere": ## check if unsupported param passed in supported_params = [ @@ -9704,4 +9708,4 @@ def _get_base_model_from_metadata(model_call_details=None): base_model = model_info.get("base_model", None) if base_model is not None: return base_model - return None \ No newline at end of file + return None From c53563a1fe8bf0f67dcdb77a5d0a7837ca778163 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 11:31:56 -0800 Subject: [PATCH 098/304] fix(test_completion.py): testing for anthropic function calling --- litellm/llms/anthropic.py | 40 ++++++++++++++++++++--- litellm/llms/prompt_templates/factory.py | 17 +++++++++- litellm/tests/test_completion.py | 41 ++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index ce413be65..6cea6450b 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -2,14 +2,16 @@ import os, types import json from enum import Enum import requests -import time +import time, uuid from typing import Callable, Optional -from litellm.utils import ModelResponse, Usage +from litellm.utils import ModelResponse, Usage, map_finish_reason import litellm from .prompt_templates.factory import ( prompt_factory, custom_prompt, construct_tool_use_system_prompt, + extract_between_tags, + parse_xml_params, ) import httpx @@ -114,6 +116,7 @@ def completion( headers={}, ): headers = validate_environment(api_key, headers) + _is_function_call = False if model in custom_prompt_dict: # check if the model has a registered custom prompt model_prompt_details = custom_prompt_dict[model] @@ -148,12 +151,14 @@ def completion( ## Handle Tool Calling if "tools" in optional_params: + _is_function_call = True tool_calling_system_prompt = construct_tool_use_system_prompt( tools=optional_params["tools"] ) optional_params["system"] = ( - optional_params("system", "\n") + tool_calling_system_prompt + optional_params.get("system", "\n") + tool_calling_system_prompt ) # add the anthropic tool calling prompt to the system prompt + optional_params.pop("tools") data = { "model": model, @@ -221,8 +226,33 @@ def completion( ) else: text_content = completion_response["content"][0].get("text", None) - model_response.choices[0].message.content = text_content # type: ignore - model_response.choices[0].finish_reason = completion_response["stop_reason"] + ## TOOL CALLING - OUTPUT PARSE + if _is_function_call == True: + function_name = extract_between_tags("tool_name", text_content)[0] + function_arguments_str = extract_between_tags("invoke", text_content)[ + 0 + ].strip() + function_arguments_str = f"{function_arguments_str}" + function_arguments = parse_xml_params(function_arguments_str) + _message = litellm.Message( + tool_calls=[ + { + "id": f"call_{uuid.uuid4()}", + "type": "function", + "function": { + "name": function_name, + "arguments": json.dumps(function_arguments), + }, + } + ], + content=None, + ) + model_response.choices[0].message = _message + else: + model_response.choices[0].message.content = text_content # type: ignore + model_response.choices[0].finish_reason = map_finish_reason( + completion_response["stop_reason"] + ) ## CALCULATING USAGE prompt_tokens = completion_response["usage"]["input_tokens"] diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index cc75237e0..2b0f4a2cf 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -1,6 +1,6 @@ from enum import Enum import requests, traceback -import json +import json, re, xml.etree.ElementTree as ET from jinja2 import Template, exceptions, Environment, meta from typing import Optional, Any @@ -520,6 +520,21 @@ def anthropic_messages_pt(messages: list): return new_messages +def extract_between_tags(tag: str, string: str, strip: bool = False) -> list[str]: + ext_list = re.findall(f"<{tag}>(.+?)", string, re.DOTALL) + if strip: + ext_list = [e.strip() for e in ext_list] + return ext_list + + +def parse_xml_params(xml_content): + root = ET.fromstring(xml_content) + params = {} + for child in root.findall(".//parameters/*"): + params[child.tag] = child.text + return params + + ### diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index a9d41be8d..068ddc78f 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -99,6 +99,47 @@ def test_completion_claude_3(): pytest.fail(f"Error occurred: {e}") +def test_completion_claude_3_function_call(): + litellm.set_verbose = True + tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, + }, + "required": ["location"], + }, + }, + } + ] + messages = [{"role": "user", "content": "What's the weather like in Boston today?"}] + try: + # test without max tokens + response = completion( + model="anthropic/claude-3-opus-20240229", + messages=messages, + tools=tools, + tool_choice="auto", + ) + # Add any assertions, here to check response args + print(response) + assert isinstance(response.choices[0].message.tool_calls[0].function.name, str) + assert isinstance( + response.choices[0].message.tool_calls[0].function.arguments, str + ) + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + def test_completion_claude_3_stream(): litellm.set_verbose = False messages = [{"role": "user", "content": "Hello, world"}] From 2f2f4dcc06103efd55a1ab71e0d872104b0090f5 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 13:01:09 -0800 Subject: [PATCH 099/304] (feat) show api base on Admin UI --- .../src/components/model_dashboard.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index ce042c9aa..000f563bd 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -75,8 +75,7 @@ const ModelDashboard: React.FC = ({ // loop through model data and edit each row for (let i = 0; i < modelData.data.length; i++) { let curr_model = modelData.data[i]; - let litellm_model_name = curr_model?.litellm_params?.model; - + let litellm_model_name = curr_model?.litellm_params?.mode let model_info = curr_model?.model_info; let defaultProvider = "openai"; @@ -109,6 +108,7 @@ const ModelDashboard: React.FC = ({ modelData.data[i].input_cost = input_cost; modelData.data[i].output_cost = output_cost; modelData.data[i].max_tokens = max_tokens; + modelData.data[i].api_base = curr_model?.litellm_params?.api_base; all_models_on_proxy.push(curr_model.model_name); @@ -141,6 +141,14 @@ const ModelDashboard: React.FC = ({ Provider + { + userRole === "Admin" && ( + + API Base + + ) + } + Access @@ -162,6 +170,11 @@ const ModelDashboard: React.FC = ({ {model.model_name} {model.provider} + { + userRole === "Admin" && ( + {model.api_base} + ) + } {model.user_access ? ( From 33afa53353d2d522cd5631b424359c2a5c123b43 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 13:08:25 -0800 Subject: [PATCH 100/304] fix(factory.py): support anthropic vision calling --- litellm/llms/prompt_templates/factory.py | 40 +++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 2b0f4a2cf..79fc59069 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -3,6 +3,7 @@ import requests, traceback import json, re, xml.etree.ElementTree as ET from jinja2 import Template, exceptions, Environment, meta from typing import Optional, Any +import imghdr, base64 def default_pt(messages): @@ -480,6 +481,27 @@ def construct_tool_use_system_prompt( return tool_use_system_prompt +def convert_to_anthropic_image_obj(openai_image_url: str): + """ + Input: + "image_url": "data:image/jpeg;base64,{base64_image}", + + Return: + "source": { + "type": "base64", + "media_type": "image/jpeg", + "data": {base64_image}, + } + """ + # Extract the base64 image data + base64_data = openai_image_url.split("data:image/")[1].split(";base64,")[1] + + # Infer image format from the URL + image_format = openai_image_url.split("data:image/")[1].split(";base64,")[0] + + return {"type": "base64", "media_type": image_format, "data": base64_data} + + def anthropic_messages_pt(messages: list): """ format messages for anthropic @@ -497,7 +519,23 @@ def anthropic_messages_pt(messages: list): if i == 0 and messages[i]["role"] == "assistant": new_messages.append({"role": "user", "content": ""}) - new_messages.append(messages[i]) + if isinstance(messages[i]["content"], list): # vision input + new_content = [] + for m in messages[i]["content"]: + if m.get("type", "") == "image_url": + new_content.append( + { + "type": "image", + "source": convert_to_anthropic_image_obj( + m["image_url"]["url"] + ), + } + ) + elif m.get("type", "") == "text": + new_content.append({"type": "text", "content": m["text"]}) + new_messages.append({"role": messages[i]["role"], "content": new_content}) # type: ignore + else: + new_messages.append(messages[i]) if messages[i]["role"] == messages[i + 1]["role"]: if messages[i]["role"] == "user": From edda2d9293f70bce37369560eb852bcb8ee4b433 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 13:34:49 -0800 Subject: [PATCH 101/304] test(test_completion.py): add testing for anthropic vision calling --- litellm/llms/prompt_templates/factory.py | 35 +++++++++++++-- .../tests/test_amazing_vertex_completion.py | 2 +- litellm/tests/test_completion.py | 45 +++++++++++++++++++ litellm/utils.py | 4 ++ 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 79fc59069..baf2c3a2a 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -499,7 +499,11 @@ def convert_to_anthropic_image_obj(openai_image_url: str): # Infer image format from the URL image_format = openai_image_url.split("data:image/")[1].split(";base64,")[0] - return {"type": "base64", "media_type": image_format, "data": base64_data} + return { + "type": "base64", + "media_type": f"image/{image_format}", + "data": base64_data, + } def anthropic_messages_pt(messages: list): @@ -515,10 +519,35 @@ def anthropic_messages_pt(messages: list): last_assistant_message_idx: Optional[int] = None # reformat messages to ensure user/assistant are alternating, if there's either 2 consecutive 'user' messages or 2 consecutive 'assistant' message, add a blank 'user' or 'assistant' message to ensure compatibility new_messages = [] + if len(messages) == 1: + # check if the message is a user message + if messages[0]["role"] == "assistant": + new_messages.append({"role": "user", "content": ""}) + + # check if content is a list (vision) + if isinstance(messages[0]["content"], list): # vision input + new_content = [] + for m in messages[0]["content"]: + if m.get("type", "") == "image_url": + new_content.append( + { + "type": "image", + "source": convert_to_anthropic_image_obj( + m["image_url"]["url"] + ), + } + ) + elif m.get("type", "") == "text": + new_content.append({"type": "text", "text": m["text"]}) + new_messages.append({"role": messages[0]["role"], "content": new_content}) # type: ignore + else: + new_messages.append(messages[0]) + + return new_messages + for i in range(len(messages) - 1): # type: ignore if i == 0 and messages[i]["role"] == "assistant": new_messages.append({"role": "user", "content": ""}) - if isinstance(messages[i]["content"], list): # vision input new_content = [] for m in messages[i]["content"]: @@ -546,8 +575,6 @@ def anthropic_messages_pt(messages: list): if messages[i]["role"] == "assistant": last_assistant_message_idx = i - new_messages.append(messages[-1]) - if last_assistant_message_idx is not None: new_messages[last_assistant_message_idx]["content"] = new_messages[ last_assistant_message_idx diff --git a/litellm/tests/test_amazing_vertex_completion.py b/litellm/tests/test_amazing_vertex_completion.py index 35d66907c..8ed15db65 100644 --- a/litellm/tests/test_amazing_vertex_completion.py +++ b/litellm/tests/test_amazing_vertex_completion.py @@ -351,7 +351,7 @@ def test_gemini_pro_vision_base64(): load_vertex_ai_credentials() litellm.set_verbose = True litellm.num_retries = 3 - image_path = "cached_logo.jpg" + image_path = "../proxy/cached_logo.jpg" # Getting the base64 string base64_image = encode_image(image_path) resp = litellm.completion( diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 068ddc78f..1677e04cf 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -159,6 +159,51 @@ def test_completion_claude_3_stream(): pytest.fail(f"Error occurred: {e}") +def encode_image(image_path): + import base64 + + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") + + +@pytest.mark.skip( + reason="we already test claude-3, this is just another way to pass images" +) +def test_completion_claude_3_base64(): + try: + litellm.set_verbose = True + litellm.num_retries = 3 + image_path = "../proxy/cached_logo.jpg" + # Getting the base64 string + base64_image = encode_image(image_path) + resp = litellm.completion( + model="anthropic/claude-3-opus-20240229", + messages=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "Whats in this image?"}, + { + "type": "image_url", + "image_url": { + "url": "data:image/jpeg;base64," + base64_image + }, + }, + ], + } + ], + ) + print(f"\nResponse: {resp}") + + prompt_tokens = resp.usage.prompt_tokens + raise Exception("it worked!") + except Exception as e: + if "500 Internal error encountered.'" in str(e): + pass + else: + pytest.fail(f"An exception occurred - {str(e)}") + + def test_completion_mistral_api(): try: litellm.set_verbose = True diff --git a/litellm/utils.py b/litellm/utils.py index 69f324589..1aa1d3767 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -200,6 +200,10 @@ def map_finish_reason( return "content_filter" elif finish_reason == "STOP": # vertex ai return "stop" + elif finish_reason == "end_turn" or finish_reason == "stop_sequence": # anthropic + return "stop" + elif finish_reason == "max_tokens": # anthropic + return "length" return finish_reason From 24797128077ba4d4356289fdb034607b212332b3 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 13:44:13 -0800 Subject: [PATCH 102/304] (feat) show model metrics on admin panel --- litellm/proxy/proxy_server.py | 49 +++++++++++++++++++ .../src/components/model_dashboard.tsx | 9 +++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 7dbb068bc..b9634b784 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -5811,6 +5811,55 @@ async def model_info_v2( return {"data": all_models} +@router.get( + "/model/metrics", + description="View number of requests & avg latency per model on config.yaml", + tags=["model management"], + dependencies=[Depends(user_api_key_auth)], +) +async def model_metrics( + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + global prisma_client + if prisma_client is None: + raise ProxyException( + message="Prisma Client is not initialized", + type="internal_error", + param="None", + code=status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + sql_query = """ + SELECT + CASE WHEN api_base = '' THEN model ELSE CONCAT(model, '-', api_base) END AS combined_model_api_base, + COUNT(*) AS num_requests, + AVG(EXTRACT(epoch FROM ("endTime" - "startTime"))) AS avg_latency_seconds + FROM + "LiteLLM_SpendLogs" + WHERE + "startTime" >= NOW() - INTERVAL '24 hours' + GROUP BY + CASE WHEN api_base = '' THEN model ELSE CONCAT(model, '-', api_base) END; + + """ + + db_response = await prisma_client.db.query_raw(query=sql_query) + response: List[dict] = [] + if response is not None: + # loop through all models + for model_data in db_response: + model = model_data.get("combined_model_api_base", "") + num_requests = model_data.get("num_requests", 0) + avg_latency_seconds = model_data.get("avg_latency_seconds", 0) + response.append( + { + "model": model, + "num_requests": num_requests, + "avg_latency_seconds": avg_latency_seconds, + } + ) + return response + + @router.get( "/model/info", description="Provides more info about each model in /models, including config.yaml descriptions (except api key and api base)", diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index 000f563bd..a16cafb2a 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -196,7 +196,12 @@ const ModelDashboard: React.FC = ({

- {userRole === "Admin" && + + Model Statistics + + + + {/* {userRole === "Admin" && pendingRequests && pendingRequests.length > 0 ? ( @@ -242,7 +247,7 @@ const ModelDashboard: React.FC = ({ - ) : null} + ) : null} */} ); From 78efe027b28d661769f0e3956d306efa8cd52c40 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 13:58:43 -0800 Subject: [PATCH 103/304] refactor(anthropic.py): fix linting error --- litellm/llms/anthropic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 6cea6450b..047616cfe 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -247,7 +247,7 @@ def completion( ], content=None, ) - model_response.choices[0].message = _message + model_response.choices[0].message = _message # type: ignore else: model_response.choices[0].message.content = text_content # type: ignore model_response.choices[0].finish_reason = map_finish_reason( From 0c11827a53d0c2738a740aa2a2c49f4c7db3355d Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 13:59:45 -0800 Subject: [PATCH 104/304] refactor(anthropic.py): fix linting error --- litellm/llms/anthropic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 6cea6450b..047616cfe 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -247,7 +247,7 @@ def completion( ], content=None, ) - model_response.choices[0].message = _message + model_response.choices[0].message = _message # type: ignore else: model_response.choices[0].message.content = text_content # type: ignore model_response.choices[0].finish_reason = map_finish_reason( From 091cea1acb98f82439c250877d26ed957d9f45b9 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 14:11:11 -0800 Subject: [PATCH 105/304] fix(factory.py): fix prompt mapping --- litellm/llms/prompt_templates/factory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index baf2c3a2a..dec87a61c 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -829,7 +829,7 @@ def prompt_factory( if custom_llm_provider == "ollama": return ollama_pt(model=model, messages=messages) elif custom_llm_provider == "anthropic": - if model == "claude-instant-1" or model == "claude-2.1": + if model == "claude-instant-1" or model == "claude-2": return anthropic_pt(messages=messages) return anthropic_messages_pt(messages=messages) elif custom_llm_provider == "together_ai": From 3a61df9995b02945846d37feb136e5a13eea4898 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 16:25:35 -0800 Subject: [PATCH 106/304] (feat) show /model/metrics on Admin UI --- litellm/proxy/proxy_server.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index b9634b784..47b8c1535 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -5828,18 +5828,21 @@ async def model_metrics( param="None", code=status.HTTP_500_INTERNAL_SERVER_ERROR, ) + sql_query = """ SELECT - CASE WHEN api_base = '' THEN model ELSE CONCAT(model, '-', api_base) END AS combined_model_api_base, - COUNT(*) AS num_requests, - AVG(EXTRACT(epoch FROM ("endTime" - "startTime"))) AS avg_latency_seconds + CASE WHEN api_base = '' THEN model ELSE CONCAT(model, '-', api_base) END AS combined_model_api_base, + COUNT(*) AS num_requests, + AVG(EXTRACT(epoch FROM ("endTime" - "startTime"))) AS avg_latency_seconds FROM - "LiteLLM_SpendLogs" + "LiteLLM_SpendLogs" WHERE - "startTime" >= NOW() - INTERVAL '24 hours' + "startTime" >= NOW() - INTERVAL '10000 hours' GROUP BY - CASE WHEN api_base = '' THEN model ELSE CONCAT(model, '-', api_base) END; - + CASE WHEN api_base = '' THEN model ELSE CONCAT(model, '-', api_base) END + ORDER BY + num_requests DESC + LIMIT 50; """ db_response = await prisma_client.db.query_raw(query=sql_query) From 5ce08a38c9bf9e4c9207aec9c49f2830c004862b Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 16:27:41 -0800 Subject: [PATCH 107/304] (feat) show num requests, latency --- .../src/components/model_dashboard.tsx | 25 ++++++++++--- .../src/components/networking.tsx | 35 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index a16cafb2a..f18d76e6a 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -11,7 +11,8 @@ import { Metric, Grid, } from "@tremor/react"; -import { modelInfoCall, userGetRequesedtModelsCall } from "./networking"; +import { modelInfoCall, userGetRequesedtModelsCall, modelMetricsCall } from "./networking"; +import { BarChart } from "@tremor/react"; import { Badge, BadgeDelta, Button } from "@tremor/react"; import RequestAccess from "./request_model_access"; import { Typography } from "antd"; @@ -30,6 +31,7 @@ const ModelDashboard: React.FC = ({ userID, }) => { const [modelData, setModelData] = useState({ data: [] }); + const [modelMetrics, setModelMetrics] = useState([]); const [pendingRequests, setPendingRequests] = useState([]); useEffect(() => { @@ -47,6 +49,15 @@ const ModelDashboard: React.FC = ({ console.log("Model data response:", modelDataResponse.data); setModelData(modelDataResponse); + const modelMetricsResponse = await modelMetricsCall( + accessToken, + userID, + userRole + ); + + console.log("Model metrics response:", modelMetricsResponse); + setModelMetrics(modelMetricsResponse); + // if userRole is Admin, show the pending requests if (userRole === "Admin" && accessToken) { const user_requests = await userGetRequesedtModelsCall(accessToken); @@ -197,9 +208,15 @@ const ModelDashboard: React.FC = ({ - Model Statistics - - + Model Statistics (Number Requests, Latency) + {/* {userRole === "Admin" && pendingRequests && diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 5993df34c..01cc61f3b 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -242,6 +242,41 @@ export const modelInfoCall = async ( } }; + +export const modelMetricsCall = async ( + accessToken: String, + userID: String, + userRole: String +) => { + /** + * Get all models on proxy + */ + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/model/metrics` : `/model/metrics`; + // message.info("Requesting model data"); + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + const errorData = await response.text(); + message.error(errorData); + throw new Error("Network response was not ok"); + } + const data = await response.json(); + // message.info("Received model data"); + return data; + // Handle success - you might want to update some state or UI based on the created key + } catch (error) { + console.error("Failed to create key:", error); + throw error; + } +}; + export const modelAvailableCall = async ( accessToken: String, userID: String, From 257c9cadafc3b31470e348aa2ab9c162ed7537f2 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 16:28:45 -0800 Subject: [PATCH 108/304] (build) new ui build --- litellm/proxy/_experimental/out/404.html | 2 +- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../out/_next/static/chunks/app/page-2ed0bc91ffef505b.js | 1 + .../out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js | 1 - litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 4 ++-- ui/litellm-dashboard/out/404.html | 2 +- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../out/_next/static/chunks/app/page-2ed0bc91ffef505b.js | 1 + .../out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js | 1 - ui/litellm-dashboard/out/index.html | 2 +- ui/litellm-dashboard/out/index.txt | 4 ++-- 14 files changed, 10 insertions(+), 10 deletions(-) rename litellm/proxy/_experimental/out/_next/static/{p1zjZBLDqxGf-NaFvZkeF => ZF-EluyKCEJoZptE3dOXT}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{p1zjZBLDqxGf-NaFvZkeF => ZF-EluyKCEJoZptE3dOXT}/_ssgManifest.js (100%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js rename ui/litellm-dashboard/out/_next/static/{p1zjZBLDqxGf-NaFvZkeF => ZF-EluyKCEJoZptE3dOXT}/_buildManifest.js (100%) rename ui/litellm-dashboard/out/_next/static/{p1zjZBLDqxGf-NaFvZkeF => ZF-EluyKCEJoZptE3dOXT}/_ssgManifest.js (100%) create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404.html index 064bb2163..eb5cf4286 100644 --- a/litellm/proxy/_experimental/out/404.html +++ b/litellm/proxy/_experimental/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js new file mode 100644 index 000000000..a0bd09f21 --- /dev/null +++ b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,57492))},57492:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eM}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{let t=await fetch("/model/metrics",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},y=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},w=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},k=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},b=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},v=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},S=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},A=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},T=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("/health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var E=s(10384),F=s(46453),M=s(13810),R=s(71801),O=s(42440),D=s(17189),U=s(12143),L=s(77171),z=s(42539),B=s(88707),q=s(1861);let{Option:K}=D.default;var V=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=U.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[y,Z]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),Z(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await T(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(L.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(U.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(z.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(U.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(D.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(K,{value:e,children:e},e))})}),(0,l.jsx)(U.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(B.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(B.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(D.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(D.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(D.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(U.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(z.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(z.Z,{placeholder:"ai_team"})}),(0,l.jsx)(U.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(z.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(L.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(F.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Save your Key"}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(R.Z,{children:["API Key: ",j]}),(0,l.jsx)(O.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(R.Z,{children:["Soft Limit Budget: $",y]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(R.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(R.Z,{children:"Key being created, this might take 30s"})})]})})})]})},J=s(33393),G=s(61244),W=s(10827),$=s(3851),H=s(2044),Y=s(64167),X=s(74480),Q=s(7178),ee=s(9853),et=s(56863),es=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(null),y=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await g(s,t);console.log("Response:",e),m(e);let l=await P(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),y()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(L.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(O.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(et.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(O.Z,{children:u}),(0,l.jsx)(M.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(ee.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},el=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(W.Z,{className:"mt-5",children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Key Alias"}),(0,l.jsx)(X.Z,{children:"Secret Key"}),(0,l.jsx)(X.Z,{children:"Spend (USD)"}),(0,l.jsx)(X.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(X.Z,{children:"Spend Report"}),(0,l.jsx)(X.Z,{children:"Team ID"}),(0,l.jsx)(X.Z,{children:"Metadata"}),(0,l.jsx)(X.Z,{children:"Models"}),(0,l.jsx)(X.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(X.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(R.Z,{children:e.key_alias}):(0,l.jsx)(R.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(R.Z,{children:e.max_budget}):(0,l.jsx)(R.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(es,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(R.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(R.Z,{children:e.expires}):(0,l.jsx)(R.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{onClick:()=>p(e.token),icon:J.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},en=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await b(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(M.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(et.Z,{children:["$",o]}),(0,l.jsxs)(O.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},er=s(36083),ea=s(68967),eo=s(27166),ei=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=er.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(ea.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(eo.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ec=s(37963);console.log("isLocal:",!1);var ed=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,p]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let y=g.get("token"),[Z,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(y){let e=(0,ec.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&Z&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(Z,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),p(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await j(Z,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,y,Z,o,s]),null==t||null==y){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==Z)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=er.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(F.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(en,{userID:t,userSpendData:x,userRole:s,accessToken:Z}),(0,l.jsx)(el,{userID:t,accessToken:Z,data:o,setData:m}),(0,l.jsx)(V,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:Z,data:o,setData:m}),(0,l.jsx)(ei,{teams:a,setSelectedTeam:b})]})})})},eh=s(5);let{Option:em}=D.default;var eu=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=U.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await v(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(L.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(U.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(U.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(D.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(em,{value:e,children:e},e))})}),(0,l.jsx)(U.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(z.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},ex=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)({data:[]}),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);console.log("Model data response:",e.data),i(e);let s=await p(t,a,r);if(console.log("Model metrics response:",s),d(s),"Admin"===r&&t){let e=await S(t);console.log("Pending Requests:",h),m(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!o||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let u=[];for(let e=0;e(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(O.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),"Admin"===r&&(0,l.jsx)(H.Z,{children:e.api_base}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(eh.Z,{color:"green",children:"Yes"}):(0,l.jsx)(eu,{userModels:u,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Model Statistics (Number Requests, Latency)"}),(0,l.jsx)(ee.Z,{data:c,index:"model",categories:["num_requests","avg_latency_seconds"],colors:["blue","red"],yAxisWidth:100,tickGap:5})]})]})})},ep=s(92836),ej=s(26734),eg=s(41608),ey=s(32126),eZ=s(23682);let{Option:ef}=D.default;var ew=e=>{let{userID:t,accessToken:s}=e,[r]=U.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await j(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},y=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(L.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:p,onCancel:g,children:(0,l.jsxs)(U.Z,{form:r,onFinish:y,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(U.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(z.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(U.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(z.Z,{placeholder:"ai_team"})}),(0,l.jsx)(U.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(D.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ef,{value:e,children:e},e))})}),(0,l.jsx)(U.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(B.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(z.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(L.Z,{title:"Save Your User",visible:a,onOk:p,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ek=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await w(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await w(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(F.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ew,{userID:o,accessToken:t}),(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)(eg.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ep.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ep.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(ey.Z,{children:(0,l.jsxs)(W.Z,{className:"mt-5",children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"User ID"}),(0,l.jsx)(X.Z,{children:"User Role"}),(0,l.jsx)(X.Z,{children:"User Models"}),(0,l.jsx)(X.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(X.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(ey.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(R.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(ea.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(eo.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"End User"}),(0,l.jsx)(X.Z,{children:"Spend"}),(0,l.jsx)(X.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},e_=s(8510),eb=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=U.Z.useForm(),[d]=U.Z.useForm(),{Title:h,Paragraph:m}=er.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,y]=(0,n.useState)(!1),[Z,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await A(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),y(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await C(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(F.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Team Name"}),(0,l.jsx)(X.Z,{children:"Spend (USD)"}),(0,l.jsx)(X.Z,{children:"Budget (USD)"}),(0,l.jsx)(X.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(R.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{icon:e_.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>y(!0),children:"+ Create New Team"}),(0,l.jsx)(L.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{y(!1),i.resetFields()},onCancel:()=>{y(!1),i.resetFields()},children:(0,l.jsxs)(U.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(D.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(U.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(B.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(ea.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(eo.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Member Name"}),(0,l.jsx)(X.Z,{children:"Role"}),(0,l.jsx)(X.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{icon:e_.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(L.Z,{title:"Add member",visible:Z,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(U.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(U.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},ev=e=>{let{searchParams:t,accessToken:s}=e,[r]=U.Z.useForm(),[a]=U.Z.useForm(),{Title:i,Paragraph:d}=er.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await N(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await N(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await I(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(F.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Member Name"}),(0,l.jsx)(X.Z,{children:"Role"}),(0,l.jsx)(X.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{icon:e_.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(L.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(U.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(U.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},eS=s(12968),eN=s(67951);async function eA(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new eS.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eC=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await j(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let p=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eA(o,e=>p("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),p("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=er.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(F.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(M.Z,{children:(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)(eg.Z,{className:"mt-4",children:[(0,l.jsx)(ep.Z,{children:"Chat"}),(0,l.jsx)(ep.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(ey.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(W.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(Y.Z,{children:(0,l.jsx)(Q.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(O.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(Q.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(ey.Z,{children:(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ep.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ep.Z,{children:"LlamaIndex"}),(0,l.jsx)(ep.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(ey.Z,{children:(0,l.jsx)(eN.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(ey.Z,{children:(0,l.jsx)(eN.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(ey.Z,{children:(0,l.jsx)(eN.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eI=s(33509),eP=s(30569);let{Sider:eT}=eI.default;var eE=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eI.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eT,{width:120,children:(0,l.jsxs)(eP.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eP.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eI.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eT,{width:120,children:(0,l.jsxs)(eP.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eP.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eP.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eP.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eP.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eF=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),g=new Date(o.getFullYear(),o.getMonth()+1,0),w=v(j),b=v(g);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(w)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await f(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await k(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await y(t,s,r,a,w,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await _(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,w,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(F.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(E.Z,{numColSpan:2,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Monthly Spend"}),(0,l.jsx)(ee.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Top API Keys"}),(0,l.jsx)(ee.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Top Users"}),(0,l.jsx)(ee.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Top Models"}),(0,l.jsx)(ee.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eM=()=>{let{Title:e,Paragraph:t}=er.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),y=j.get("token"),[Z,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(y){let e=(0,ec.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[y]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eE,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==Z?(0,l.jsx)(ed,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==Z?(0,l.jsx)(ex,{userID:g,userRole:s,token:y,accessToken:w}):"llm-playground"==Z?(0,l.jsx)(eC,{userID:g,userRole:s,token:y,accessToken:w}):"users"==Z?(0,l.jsx)(ek,{userID:g,userRole:s,token:y,keys:m,accessToken:w,setKeys:u}):"teams"==Z?(0,l.jsx)(eb,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==Z?(0,l.jsx)(ev,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eF,{userID:g,userRole:s,token:y,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js b/litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js deleted file mode 100644 index 8d5377ae4..000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("/health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.html b/litellm/proxy/_experimental/out/index.html index aaaaa698a..437d90aac 100644 --- a/litellm/proxy/_experimental/out/index.html +++ b/litellm/proxy/_experimental/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/litellm/proxy/_experimental/out/index.txt b/litellm/proxy/_experimental/out/index.txt index 72b67997a..28c9282be 100644 --- a/litellm/proxy/_experimental/out/index.txt +++ b/litellm/proxy/_experimental/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-37bd7c3d0bb898a3.js"],""] +3:I[57492,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-2ed0bc91ffef505b.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["p1zjZBLDqxGf-NaFvZkeF",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["ZF-EluyKCEJoZptE3dOXT",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null diff --git a/ui/litellm-dashboard/out/404.html b/ui/litellm-dashboard/out/404.html index 064bb2163..eb5cf4286 100644 --- a/ui/litellm-dashboard/out/404.html +++ b/ui/litellm-dashboard/out/404.html @@ -1 +1 @@ -404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file +404: This page could not be found.🚅 LiteLLM

404

This page could not be found.

\ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js b/ui/litellm-dashboard/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_buildManifest.js similarity index 100% rename from ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_buildManifest.js rename to ui/litellm-dashboard/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_buildManifest.js diff --git a/ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js b/ui/litellm-dashboard/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_ssgManifest.js similarity index 100% rename from ui/litellm-dashboard/out/_next/static/p1zjZBLDqxGf-NaFvZkeF/_ssgManifest.js rename to ui/litellm-dashboard/out/_next/static/ZF-EluyKCEJoZptE3dOXT/_ssgManifest.js diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js new file mode 100644 index 000000000..a0bd09f21 --- /dev/null +++ b/ui/litellm-dashboard/out/_next/static/chunks/app/page-2ed0bc91ffef505b.js @@ -0,0 +1 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,57492))},57492:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eM}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{let t=await fetch("/model/metrics",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}return await t.json()}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},y=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},w=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},k=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},b=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},v=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},S=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},A=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},T=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("/health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var E=s(10384),F=s(46453),M=s(13810),R=s(71801),O=s(42440),D=s(17189),U=s(12143),L=s(77171),z=s(42539),B=s(88707),q=s(1861);let{Option:K}=D.default;var V=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=U.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[y,Z]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),Z(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await T(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(L.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(U.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(z.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(U.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(D.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(K,{value:e,children:e},e))})}),(0,l.jsx)(U.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(B.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(B.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(D.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(D.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(D.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(U.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(z.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(z.Z,{placeholder:"ai_team"})}),(0,l.jsx)(U.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(z.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(L.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(F.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Save your Key"}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(R.Z,{children:["API Key: ",j]}),(0,l.jsx)(O.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(R.Z,{children:["Soft Limit Budget: $",y]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(R.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(R.Z,{children:"Key being created, this might take 30s"})})]})})})]})},J=s(33393),G=s(61244),W=s(10827),$=s(3851),H=s(2044),Y=s(64167),X=s(74480),Q=s(7178),ee=s(9853),et=s(56863),es=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(null),y=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await g(s,t);console.log("Response:",e),m(e);let l=await P(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),y()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(L.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(O.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(et.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(O.Z,{children:u}),(0,l.jsx)(M.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(ee.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},el=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(W.Z,{className:"mt-5",children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Key Alias"}),(0,l.jsx)(X.Z,{children:"Secret Key"}),(0,l.jsx)(X.Z,{children:"Spend (USD)"}),(0,l.jsx)(X.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(X.Z,{children:"Spend Report"}),(0,l.jsx)(X.Z,{children:"Team ID"}),(0,l.jsx)(X.Z,{children:"Metadata"}),(0,l.jsx)(X.Z,{children:"Models"}),(0,l.jsx)(X.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(X.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(R.Z,{children:e.key_alias}):(0,l.jsx)(R.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(R.Z,{children:e.max_budget}):(0,l.jsx)(R.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(es,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(R.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(R.Z,{children:e.expires}):(0,l.jsx)(R.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{onClick:()=>p(e.token),icon:J.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},en=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await b(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(M.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(et.Z,{children:["$",o]}),(0,l.jsxs)(O.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},er=s(36083),ea=s(68967),eo=s(27166),ei=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=er.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(ea.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(eo.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ec=s(37963);console.log("isLocal:",!1);var ed=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,p]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let y=g.get("token"),[Z,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(y){let e=(0,ec.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&Z&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(Z,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),p(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await j(Z,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,y,Z,o,s]),null==t||null==y){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==Z)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=er.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(F.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(en,{userID:t,userSpendData:x,userRole:s,accessToken:Z}),(0,l.jsx)(el,{userID:t,accessToken:Z,data:o,setData:m}),(0,l.jsx)(V,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:Z,data:o,setData:m}),(0,l.jsx)(ei,{teams:a,setSelectedTeam:b})]})})})},eh=s(5);let{Option:em}=D.default;var eu=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=U.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await v(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(L.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(U.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(U.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(D.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(em,{value:e,children:e},e))})}),(0,l.jsx)(U.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(z.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},ex=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)({data:[]}),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);console.log("Model data response:",e.data),i(e);let s=await p(t,a,r);if(console.log("Model metrics response:",s),d(s),"Admin"===r&&t){let e=await S(t);console.log("Pending Requests:",h),m(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!o||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let u=[];for(let e=0;e(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(O.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),"Admin"===r&&(0,l.jsx)(H.Z,{children:e.api_base}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(eh.Z,{color:"green",children:"Yes"}):(0,l.jsx)(eu,{userModels:u,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Model Statistics (Number Requests, Latency)"}),(0,l.jsx)(ee.Z,{data:c,index:"model",categories:["num_requests","avg_latency_seconds"],colors:["blue","red"],yAxisWidth:100,tickGap:5})]})]})})},ep=s(92836),ej=s(26734),eg=s(41608),ey=s(32126),eZ=s(23682);let{Option:ef}=D.default;var ew=e=>{let{userID:t,accessToken:s}=e,[r]=U.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await j(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},y=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(L.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:p,onCancel:g,children:(0,l.jsxs)(U.Z,{form:r,onFinish:y,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(U.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(z.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(U.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(z.Z,{placeholder:"ai_team"})}),(0,l.jsx)(U.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(D.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ef,{value:e,children:e},e))})}),(0,l.jsx)(U.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(B.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(z.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(L.Z,{title:"Save Your User",visible:a,onOk:p,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ek=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await w(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await w(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(F.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ew,{userID:o,accessToken:t}),(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)(eg.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ep.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ep.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(ey.Z,{children:(0,l.jsxs)(W.Z,{className:"mt-5",children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"User ID"}),(0,l.jsx)(X.Z,{children:"User Role"}),(0,l.jsx)(X.Z,{children:"User Models"}),(0,l.jsx)(X.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(X.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(ey.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(R.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(ea.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(eo.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"End User"}),(0,l.jsx)(X.Z,{children:"Spend"}),(0,l.jsx)(X.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},e_=s(8510),eb=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=U.Z.useForm(),[d]=U.Z.useForm(),{Title:h,Paragraph:m}=er.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,y]=(0,n.useState)(!1),[Z,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await A(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),y(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await C(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(F.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Team Name"}),(0,l.jsx)(X.Z,{children:"Spend (USD)"}),(0,l.jsx)(X.Z,{children:"Budget (USD)"}),(0,l.jsx)(X.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(R.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{icon:e_.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>y(!0),children:"+ Create New Team"}),(0,l.jsx)(L.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{y(!1),i.resetFields()},onCancel:()=>{y(!1),i.resetFields()},children:(0,l.jsxs)(U.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(z.Z,{})}),(0,l.jsx)(U.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(D.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(U.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(B.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(U.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})}),(0,l.jsx)(U.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(B.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(ea.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(eo.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Member Name"}),(0,l.jsx)(X.Z,{children:"Role"}),(0,l.jsx)(X.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{icon:e_.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(L.Z,{title:"Add member",visible:Z,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(U.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(U.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},ev=e=>{let{searchParams:t,accessToken:s}=e,[r]=U.Z.useForm(),[a]=U.Z.useForm(),{Title:i,Paragraph:d}=er.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await N(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await N(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await I(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(F.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsx)(M.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(Y.Z,{children:(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(X.Z,{children:"Member Name"}),(0,l.jsx)(X.Z,{children:"Role"}),(0,l.jsx)(X.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(Q.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(G.Z,{icon:e_.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(E.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(L.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(U.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(U.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(U.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(z.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(q.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},eS=s(12968),eN=s(67951);async function eA(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new eS.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eC=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await j(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let p=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eA(o,e=>p("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),p("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=er.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(F.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(M.Z,{children:(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)(eg.Z,{className:"mt-4",children:[(0,l.jsx)(ep.Z,{children:"Chat"}),(0,l.jsx)(ep.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(ey.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(W.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(Y.Z,{children:(0,l.jsx)(Q.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(O.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(Q.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(ey.Z,{children:(0,l.jsxs)(ej.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsx)(ep.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ep.Z,{children:"LlamaIndex"}),(0,l.jsx)(ep.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(ey.Z,{children:(0,l.jsx)(eN.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(ey.Z,{children:(0,l.jsx)(eN.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(ey.Z,{children:(0,l.jsx)(eN.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eI=s(33509),eP=s(30569);let{Sider:eT}=eI.default;var eE=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eI.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eT,{width:120,children:(0,l.jsxs)(eP.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eP.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eI.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eT,{width:120,children:(0,l.jsxs)(eP.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eP.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eP.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eP.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eP.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eP.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eF=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),g=new Date(o.getFullYear(),o.getMonth()+1,0),w=v(j),b=v(g);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(w)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await f(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await k(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await y(t,s,r,a,w,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await _(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,w,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(F.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(E.Z,{numColSpan:2,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Monthly Spend"}),(0,l.jsx)(ee.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Top API Keys"}),(0,l.jsx)(ee.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Top Users"}),(0,l.jsx)(ee.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(E.Z,{numColSpan:1,children:(0,l.jsxs)(M.Z,{children:[(0,l.jsx)(O.Z,{children:"Top Models"}),(0,l.jsx)(ee.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eM=()=>{let{Title:e,Paragraph:t}=er.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),y=j.get("token"),[Z,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(y){let e=(0,ec.o)(y);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[y]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eE,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==Z?(0,l.jsx)(ed,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==Z?(0,l.jsx)(ex,{userID:g,userRole:s,token:y,accessToken:w}):"llm-playground"==Z?(0,l.jsx)(eC,{userID:g,userRole:s,token:y,accessToken:w}):"users"==Z?(0,l.jsx)(ek,{userID:g,userRole:s,token:y,keys:m,accessToken:w,setKeys:u}):"teams"==Z?(0,l.jsx)(eb,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==Z?(0,l.jsx)(ev,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eF,{userID:g,userRole:s,token:y,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js b/ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js deleted file mode 100644 index 8d5377ae4..000000000 --- a/ui/litellm-dashboard/out/_next/static/chunks/app/page-37bd7c3d0bb898a3.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{20661:function(e,t,s){Promise.resolve().then(s.bind(s,56239))},56239:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return eF}});var l=s(3827),n=s(64090),r=s(47907),a=s(8792),o=s(2179),i=e=>{let{userID:t,userRole:s,userEmail:n,showSSOBanner:r}=e;return console.log("User ID:",t),console.log("userEmail:",n),(0,l.jsxs)("nav",{className:"left-0 right-0 top-0 flex justify-between items-center h-12 mb-4",children:[(0,l.jsx)("div",{className:"text-left my-2 absolute top-0 left-0",children:(0,l.jsx)("div",{className:"flex flex-col items-center",children:(0,l.jsx)(a.default,{href:"/",children:(0,l.jsx)("button",{className:"text-gray-800 text-2xl py-1 rounded text-center",children:(0,l.jsx)("img",{src:"/get_image",width:200,height:200,alt:"LiteLLM Brand",className:"mr-2"})})})})}),(0,l.jsxs)("div",{className:"text-right mx-4 my-2 absolute top-0 right-0 flex items-center justify-end space-x-2",children:[r?(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#setup-ssoauth-for-ui",target:"_blank",className:"mr-2",children:(0,l.jsx)(o.Z,{variant:"primary",size:"lg",children:"Enable SSO"})}):null,(0,l.jsxs)(o.Z,{variant:"secondary",size:"lg",children:[n,(0,l.jsxs)("p",{children:["Role: ",s]}),(0,l.jsxs)("p",{children:["ID: ",t]})]})]})]})},c=s(80588);let d=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/key/generate",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},h=async(e,t,s)=>{try{if(console.log("Form Values in keyCreateCall:",s),s.description&&(s.metadata||(s.metadata={}),s.metadata.description=s.description,delete s.description,s.metadata=JSON.stringify(s.metadata)),s.metadata){console.log("formValues.metadata:",s.metadata);try{s.metadata=JSON.parse(s.metadata)}catch(e){throw c.ZP.error("Failed to parse metadata: "+e),Error("Failed to parse metadata: "+e)}}console.log("Form Values after check:",s);let l=await fetch("/user/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_id:t,...s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},m=async(e,t)=>{try{console.log("in keyDeleteCall:",t),c.ZP.info("Making key delete request");let s=await fetch("/key/delete",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:[t]})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success("API Key Deleted"),l}catch(e){throw console.error("Failed to create key:",e),e}},u=async function(e,t,s){let l=arguments.length>3&&void 0!==arguments[3]&&arguments[3];try{let n="/user/info";"App Owner"==s&&t&&(n="".concat(n,"/?user_id=").concat(t)),console.log("in userInfoCall viewAll=",l),l&&(n="".concat(n,"/?view_all=true")),c.ZP.info("Requesting user data");let r=await fetch(n,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!r.ok){let e=await r.text();throw c.ZP.error(e),Error("Network response was not ok")}let a=await r.json();return console.log("API Response:",a),c.ZP.info("Received user data"),a}catch(e){throw console.error("Failed to create key:",e),e}},x=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/v2/model/info",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},p=async(e,t,s)=>{try{c.ZP.info("Requesting model data");let t=await fetch("/models",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return c.ZP.info("Received model data"),s}catch(e){throw console.error("Failed to create key:",e),e}},j=async(e,t)=>{try{let s="/global/spend/logs";console.log("in keySpendLogsCall:",s);let l=await fetch("".concat(s,"/?api_key=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to create key:",e),e}},g=async(e,t,s,l,n,r)=>{try{console.log("user role in spend logs call: ".concat(s));let t="/spend/logs";t="App Owner"==s?"".concat(t,"/?user_id=").concat(l,"&start_date=").concat(n,"&end_date=").concat(r):"".concat(t,"/?start_date=").concat(n,"&end_date=").concat(r),c.ZP.info("Making spend logs request");let a=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!a.ok){let e=await a.text();throw c.ZP.error(e),Error("Network response was not ok")}let o=await a.json();return console.log(o),c.ZP.success("Spend Logs received"),o}catch(e){throw console.error("Failed to create key:",e),e}},Z=async e=>{try{c.ZP.info("Making spend logs request");let t=await fetch("/global/spend/logs",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},y=async e=>{try{c.ZP.info("Making spend keys request");let t=await fetch("/global/spend/keys?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Spend Logs received"),s}catch(e){throw console.error("Failed to create key:",e),e}},f=async(e,t)=>{try{t&&JSON.stringify({api_key:t}),c.ZP.info("Making top end users request");let s={method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}};t&&(s.body=JSON.stringify({api_key:t}));let l=await fetch("/global/spend/end_users",s);if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Top End users received"),n}catch(e){throw console.error("Failed to create key:",e),e}},w=async e=>{try{c.ZP.info("Making top models request");let t=await fetch("/global/spend/models?limit=5",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error(e),Error("Network response was not ok")}let s=await t.json();return console.log(s),c.ZP.success("Top Models received"),s}catch(e){throw console.error("Failed to create key:",e),e}},k=async(e,t)=>{try{let s=await fetch("/v2/key/info",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({keys:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},_=async(e,t)=>{try{let s="/spend/users";console.log("in spendUsersCall:",s);let l=await fetch("".concat(s,"/?user_id=").concat(t),{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error(e),Error("Network response was not ok")}let n=await l.json();return console.log(n),n}catch(e){throw console.error("Failed to get spend for user",e),e}},b=async(e,t,s,l)=>{try{let n=await fetch("/user/request_model",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({models:[t],user_id:s,justification:l})});if(!n.ok){let e=await n.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let r=await n.json();return console.log(r),c.ZP.success(""),r}catch(e){throw console.error("Failed to create key:",e),e}},v=async e=>{try{let t="/user/get_requests";console.log("in userGetRequesedtModelsCall:",t);let s=await fetch(t,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let l=await s.json();return console.log(l),c.ZP.success(""),l}catch(e){throw console.error("Failed to get requested models:",e),e}},S=async(e,t)=>{try{let s="/user/get_users?role=".concat(t);console.log("in userGetAllUsersCall:",s);let l=await fetch(s,{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to delete key: "+e),Error("Network response was not ok")}let n=await l.json();return console.log(n),c.ZP.success("Got all users"),n}catch(e){throw console.error("Failed to get requested models:",e),e}},N=async(e,t)=>{try{console.log("Form Values in teamCreateCall:",t);let s=await fetch("/team/new",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),l}catch(e){throw console.error("Failed to create key:",e),e}},A=async(e,t,s)=>{try{console.log("Form Values in teamMemberAddCall:",s);let l=await fetch("/team/member_add",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({team_id:t,member:s})});if(!l.ok){let e=await l.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let n=await l.json();return console.log("API Response:",n),n}catch(e){throw console.error("Failed to create key:",e),e}},C=async(e,t)=>{try{console.log("Form Values in userUpdateUserCall:",t);let s=await fetch("/user/update",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({user_role:"proxy_admin_viewer",...t})});if(!s.ok){let e=await s.text();throw c.ZP.error("Failed to create key: "+e),console.error("Error response from the server:",e),Error("Network response was not ok")}let l=await s.json();return console.log("API Response:",l),c.ZP.success("User role updated"),l}catch(e){throw console.error("Failed to create key:",e),e}},I=async(e,t)=>{try{let s=await fetch("/global/predict/spend/logs",{method:"POST",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"},body:JSON.stringify({data:t})});if(!s.ok){let e=await s.text();throw c.ZP.error(e),Error("Network response was not ok")}let l=await s.json();return console.log(l),l}catch(e){throw console.error("Failed to create key:",e),e}},P=async e=>{try{console.log("Checking Slack Budget Alerts service health"),c.ZP.info("Sending Test Slack alert...");let t=await fetch("/health/services?service=slack_budget_alerts",{method:"GET",headers:{Authorization:"Bearer ".concat(e),"Content-Type":"application/json"}});if(!t.ok){let e=await t.text();throw c.ZP.error("Failed Slack Alert test: "+e),Error(e)}let s=await t.json();return c.ZP.success("Test Slack Alert worked - check your Slack!"),console.log("Service Health Response:",s),s}catch(e){throw console.error("Failed to perform health check:",e),e}};var T=s(10384),E=s(46453),F=s(13810),M=s(71801),R=s(42440),O=s(17189),D=s(12143),U=s(77171),L=s(42539),z=s(88707),B=s(1861);let{Option:q}=O.default;var K=e=>{let{userID:t,teamID:s,userRole:r,accessToken:a,data:i,userModels:h,setData:m}=e,[u]=D.Z.useForm(),[x,p]=(0,n.useState)(!1),[j,g]=(0,n.useState)(null),[Z,y]=(0,n.useState)(null),f=()=>{p(!1),u.resetFields()},w=()=>{p(!1),g(null),u.resetFields()},k=async e=>{try{c.ZP.info("Making API Call"),p(!0);let s=await d(a,t,e);console.log("key create Response:",s),m(e=>e?[...e,s]:[s]),g(s.key),y(s.soft_budget),c.ZP.success("API Key Created"),u.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the key:",e)}},_=async()=>{try{console.log("Sending Slack alert...");let e=await P(a);console.log("slackBudgetAlertsHealthCheck Response:",e),console.log("Testing Slack alert successful")}catch(e){console.error("Error sending Slack alert:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>p(!0),children:"+ Create New Key"}),(0,l.jsx)(U.Z,{title:"Create Key",visible:x,width:800,footer:null,onOk:f,onCancel:w,children:(0,l.jsxs)(D.Z,{form:u,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:["App Owner"===r||"Admin"===r?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team",defaultValue:s||""})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:h.map(e=>(0,l.jsx)(q,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Soft Budget (USD) Monthly",name:"soft_budget",initialValue:50,children:(0,l.jsx)(z.Z,{step:.01,precision:2,defaultValue:50,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Reset Budget",name:"budget_duration",children:(0,l.jsxs)(O.default,{defaultValue:null,placeholder:"n/a",children:[(0,l.jsx)(O.default.Option,{value:"24h",children:"daily"}),(0,l.jsx)(O.default.Option,{value:"30d",children:"monthly"})]})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Expire Key (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})})]}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Key Name",name:"key_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Team ID (Contact Group)",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Description",name:"description",children:(0,l.jsx)(L.Z.TextArea,{placeholder:"Enter description",rows:4})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Key"})})]})}),j&&(0,l.jsx)(U.Z,{visible:x,onOk:f,onCancel:w,footer:null,children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-2 w-full",children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Save your Key"}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)("p",{children:["Please save this secret key somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret key, you will need to generate a new one."]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:null!=j?(0,l.jsxs)("div",{children:[(0,l.jsxs)(M.Z,{children:["API Key: ",j]}),(0,l.jsx)(R.Z,{className:"mt-6",children:"Budgets"}),(0,l.jsxs)(M.Z,{children:["Soft Limit Budget: $",Z]}),(0,l.jsx)(o.Z,{className:"mt-3",onClick:_,children:"Test Slack Alert"}),(0,l.jsxs)(M.Z,{className:"mt-2",children:["(LiteLLM Docs -",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/alerting",target:"_blank",className:"text-blue-500",children:"Set Up Slack Alerting)"})]})]}):(0,l.jsx)(M.Z,{children:"Key being created, this might take 30s"})})]})})})]})},V=s(33393),J=s(61244),G=s(10827),$=s(3851),H=s(2044),W=s(64167),Y=s(74480),X=s(7178),Q=s(9853),ee=s(56863),et=e=>{let{token:t,accessToken:s,keySpend:r,keyBudget:a,keyName:i}=e,[c,d]=(0,n.useState)(!1),[h,m]=(0,n.useState)(null),[u,x]=(0,n.useState)(""),[p,g]=(0,n.useState)(null),Z=async()=>{try{if(null==s||null==t)return;console.log("accessToken: ".concat(s,"; token: ").concat(t));let e=await j(s,t);console.log("Response:",e),m(e);let l=await I(s,e);console.log("Response2:",l);let n=[...e,...l.response];m(n),x(l.predicted_spend),console.log("Combined Data:",n)}catch(e){console.error("There was an error fetching the data",e)}};return t?(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>{console.log("Show Modal triggered"),d(!0),Z()},variant:"secondary",children:"View Spend Report"}),(0,l.jsxs)(U.Z,{visible:c,width:1400,onOk:()=>{d(!1)},onCancel:()=>{d(!1)},footer:null,children:[(0,l.jsxs)(R.Z,{style:{textAlign:"left"},children:["Key Name: ",i]}),(0,l.jsxs)(ee.Z,{children:["Monthly Spend $",r]}),(0,l.jsx)(R.Z,{children:u}),(0,l.jsx)(F.Z,{className:"mt-6 mb-6",children:h&&(0,l.jsx)(Q.Z,{className:"mt-6",data:h,colors:["blue","amber"],index:"date",categories:["spend","predicted_spend"],yAxisWidth:80})})]})]}):null},es=e=>{let{userID:t,accessToken:s,data:r,setData:a}=e,[i,c]=(0,n.useState)(!1),[d,h]=(0,n.useState)(!1),[u,x]=(0,n.useState)(null),p=async e=>{null!=r&&(x(e),localStorage.removeItem("userData"+t),h(!0))},j=async()=>{if(null!=u&&null!=r){try{await m(s,u);let e=r.filter(e=>e.token!==u);a(e)}catch(e){console.error("Error deleting the key:",e)}h(!1),x(null)}};if(null!=r)return console.log("RERENDER TRIGGERED"),(0,l.jsxs)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:[(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Key Alias"}),(0,l.jsx)(Y.Z,{children:"Secret Key"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Key Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"Spend Report"}),(0,l.jsx)(Y.Z,{children:"Team ID"}),(0,l.jsx)(Y.Z,{children:"Metadata"}),(0,l.jsx)(Y.Z,{children:"Models"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"}),(0,l.jsx)(Y.Z,{children:"Expires"})]})}),(0,l.jsx)($.Z,{children:r.map(e=>(console.log(e),"litellm-dashboard"===e.team_id)?null:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:null!=e.key_alias?(0,l.jsx)(M.Z,{children:e.key_alias}):(0,l.jsx)(M.Z,{children:"Not Set"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.spend})}),(0,l.jsx)(H.Z,{children:null!=e.max_budget?(0,l.jsx)(M.Z,{children:e.max_budget}):(0,l.jsx)(M.Z,{children:"Unlimited Budget"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(et,{token:e.token,accessToken:s,keySpend:e.spend,keyBudget:e.max_budget,keyName:e.key_name})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:e.team_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.metadata)})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(M.Z,{children:JSON.stringify(e.models)})}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit: ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:null!=e.expires?(0,l.jsx)(M.Z,{children:e.expires}):(0,l.jsx)(M.Z,{children:"Never expires"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{onClick:()=>p(e.token),icon:V.Z,size:"sm"})})]},e.token))})]}),d&&(0,l.jsx)("div",{className:"fixed z-10 inset-0 overflow-y-auto",children:(0,l.jsxs)("div",{className:"flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[(0,l.jsx)("div",{className:"fixed inset-0 transition-opacity","aria-hidden":"true",children:(0,l.jsx)("div",{className:"absolute inset-0 bg-gray-500 opacity-75"})}),(0,l.jsx)("span",{className:"hidden sm:inline-block sm:align-middle sm:h-screen","aria-hidden":"true",children:"​"}),(0,l.jsxs)("div",{className:"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full",children:[(0,l.jsx)("div",{className:"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4",children:(0,l.jsx)("div",{className:"sm:flex sm:items-start",children:(0,l.jsxs)("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[(0,l.jsx)("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:"Delete Key"}),(0,l.jsx)("div",{className:"mt-2",children:(0,l.jsx)("p",{className:"text-sm text-gray-500",children:"Are you sure you want to delete this key ?"})})]})})}),(0,l.jsxs)("div",{className:"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse",children:[(0,l.jsx)(o.Z,{onClick:j,color:"red",className:"ml-2",children:"Delete"}),(0,l.jsx)(o.Z,{onClick:()=>{h(!1),x(null)},children:"Cancel"})]})]})]})})]})},el=e=>{let{userID:t,userSpendData:s,userRole:r,accessToken:a}=e;console.log("User SpendData:",s);let[o,i]=(0,n.useState)(null==s?void 0:s.spend),[c,d]=(0,n.useState)((null==s?void 0:s.max_budget)||null);return(0,n.useEffect)(()=>{(async()=>{if("Admin"===r)try{let e=await _(a,"litellm-proxy-budget");console.log("Result from callSpendUsers:",e);let t=e[0];i(null==t?void 0:t.spend),d((null==t?void 0:t.max_budget)||null)}catch(e){console.error("Failed to get spend for user",e)}})()},[r,a,t]),(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(F.Z,{className:"mx-auto mb-4",children:[(0,l.jsxs)(ee.Z,{children:["$",o]}),(0,l.jsxs)(R.Z,{children:["/ ",null!==c?"$".concat(c," limit"):"No limit"]})]})})},en=s(36083),er=s(68967),ea=s(27166),eo=e=>{let{teams:t,setSelectedTeam:s}=e,{Title:r,Paragraph:a}=en.default,[o,i]=(0,n.useState)("");return(0,l.jsxs)("div",{className:"mt-10",children:[(0,l.jsx)(r,{level:4,children:"Default Team"}),(0,l.jsx)(a,{children:"If you belong to multiple teams, this setting controls which team is used by default when creating new API Keys."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>s(e),children:e.team_alias},t))}):(0,l.jsxs)(a,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]})},ei=s(37963);console.log("isLocal:",!1);var ec=e=>{let{userID:t,userRole:s,teams:a,keys:o,setUserRole:i,userEmail:c,setUserEmail:d,setTeams:h,setKeys:m}=e,[x,j]=(0,n.useState)(null),g=(0,r.useSearchParams)();g.get("viewSpend"),(0,r.useRouter)();let Z=g.get("token"),[y,f]=(0,n.useState)(null),[w,k]=(0,n.useState)([]),[_,b]=(0,n.useState)(a?a[0]:null);if(window.addEventListener("beforeunload",function(){sessionStorage.clear()}),(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),f(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),i(t)}else console.log("User role not defined");e.user_email?d(e.user_email):console.log("User Email is not set ".concat(e))}}if(t&&y&&s&&!o&&!x){let e=sessionStorage.getItem("userModels"+t);e?k(JSON.parse(e)):(async()=>{try{let e=await u(y,t,s);console.log("received teams in user dashboard: ".concat(Object.keys(e),"; team values: ").concat(Object.entries(e.teams))),j(e.user_info),m(e.keys),h(e.teams),b(e.teams?e.teams[0]:null),sessionStorage.setItem("userData"+t,JSON.stringify(e.keys)),sessionStorage.setItem("userSpendData"+t,JSON.stringify(e.user_info));let l=(await p(y,t,s)).data.map(e=>e.id);console.log("available_model_names:",l),k(l),console.log("userModels:",w),sessionStorage.setItem("userModels"+t,JSON.stringify(l))}catch(e){console.error("There was an error fetching the data",e)}})()}},[t,Z,y,o,s]),null==t||null==Z){let e="/sso/key/generate";return console.log("Full URL:",e),window.location.href=e,null}if(null==y)return null;if(null==s&&i("App Owner"),s&&"Admin Viewer"==s){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to create keys"})]})}return(0,l.jsx)("div",{children:(0,l.jsx)(E.Z,{numItems:1,className:"gap-0 p-10 h-[75vh] w-full",children:(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(el,{userID:t,userSpendData:x,userRole:s,accessToken:y}),(0,l.jsx)(es,{userID:t,accessToken:y,data:o,setData:m}),(0,l.jsx)(K,{userID:t,teamID:_?_.team_id:null,userRole:s,userModels:w,accessToken:y,data:o,setData:m}),(0,l.jsx)(eo,{teams:a,setSelectedTeam:b})]})})})},ed=s(5);let{Option:eh}=O.default;var em=e=>{let{userModels:t,accessToken:s,userID:r}=e,[a]=D.Z.useForm(),[i,d]=(0,n.useState)(!1),h=async e=>{try{c.ZP.info("Requesting access");let{selectedModel:t,accessReason:l}=e;await b(s,t,r,l),d(!0)}catch(e){console.error("Error requesting access:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{size:"xs",onClick:()=>d(!0),children:"Request Access"}),(0,l.jsx)(U.Z,{title:"Request Access",visible:i,width:800,footer:null,onOk:()=>{d(!1),a.resetFields()},onCancel:()=>{d(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:a,onFinish:h,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"Select Model",name:"selectedModel",children:(0,l.jsx)(O.default,{placeholder:"Select model",style:{width:"100%"},children:t.map(e=>(0,l.jsx)(eh,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Reason for Access",name:"accessReason",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter reason for access"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(o.Z,{children:"Request Access"})})]})})]})},eu=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[i,c]=(0,n.useState)({data:[]}),[d,h]=(0,n.useState)([]);if((0,n.useEffect)(()=>{if(!t||!s||!r||!a)return;let e=async()=>{try{let e=await x(t,a,r);if(console.log("Model data response:",e.data),c(e),"Admin"===r&&t){let e=await v(t);console.log("Pending Requests:",d),h(e.requests||[])}}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&r&&a&&e()},[t,s,r,a]),!i||!t||!s||!r||!a)return(0,l.jsx)("div",{children:"Loading..."});let m=[];for(let e=0;e(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:e.model_name})}),(0,l.jsx)(H.Z,{children:e.provider}),(0,l.jsx)(H.Z,{children:e.user_access?(0,l.jsx)(ed.Z,{color:"green",children:"Yes"}):(0,l.jsx)(em,{userModels:m,accessToken:t,userID:a})}),(0,l.jsx)(H.Z,{children:e.input_cost}),(0,l.jsx)(H.Z,{children:e.output_cost}),(0,l.jsx)(H.Z,{children:e.max_tokens})]},e.model_name))})]})}),"Admin"===r&&d&&d.length>0?(0,l.jsx)(F.Z,{children:(0,l.jsxs)(G.Z,{children:[(0,l.jsxs)(W.Z,{children:[(0,l.jsx)(R.Z,{children:"Pending Requests"}),(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"User ID"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Requested Models"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Justification"})})]})]}),(0,l.jsx)($.Z,{children:d.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.models[0]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.justification})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)("p",{children:e.user_id})}),(0,l.jsx)(o.Z,{children:"Approve"}),(0,l.jsx)(o.Z,{variant:"secondary",className:"ml-2",children:"Deny"})]},e.request_id))})]})}):null]})})},ex=s(92836),ep=s(26734),ej=s(41608),eg=s(32126),eZ=s(23682);let{Option:ey}=O.default;var ef=e=>{let{userID:t,accessToken:s}=e,[r]=D.Z.useForm(),[a,i]=(0,n.useState)(!1),[d,m]=(0,n.useState)(null),[u,x]=(0,n.useState)([]);(0,n.useEffect)(()=>{(async()=>{try{let e=await p(s,t,"any"),l=[];for(let t=0;t{i(!1),r.resetFields()},g=()=>{i(!1),m(null),r.resetFields()},Z=async e=>{try{c.ZP.info("Making API Call"),i(!0),console.log("formValues in create user:",e);let l=await h(s,t,e);console.log("user create Response:",l),m(l.key),c.ZP.success("API user Created"),r.resetFields(),localStorage.removeItem("userData"+t)}catch(e){console.error("Error creating the user:",e)}};return(0,l.jsxs)("div",{children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>i(!0),children:"+ Create New User"}),(0,l.jsx)(U.Z,{title:"Create User",visible:a,width:800,footer:null,onOk:j,onCancel:g,children:(0,l.jsxs)(D.Z,{form:r,onFinish:Z,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",children:(0,l.jsx)(L.Z,{placeholder:"Enter User ID"})}),(0,l.jsx)(D.Z.Item,{label:"Team ID",name:"team_id",children:(0,l.jsx)(L.Z,{placeholder:"ai_team"})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"},children:u.map(e=>(0,l.jsx)(ey,{value:e,children:e},e))})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Duration (eg: 30s, 30h, 30d)",name:"duration",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Metadata",name:"metadata",children:(0,l.jsx)(L.Z.TextArea,{rows:4,placeholder:"Enter metadata as JSON"})}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create User"})})]})}),d&&(0,l.jsxs)(U.Z,{title:"Save Your User",visible:a,onOk:j,onCancel:g,footer:null,children:[(0,l.jsxs)("p",{children:["Please save this secret user somewhere safe and accessible. For security reasons, ",(0,l.jsx)("b",{children:"you will not be able to view it again"})," ","through your LiteLLM account. If you lose this secret user, you will need to generate a new one."]}),(0,l.jsx)("p",{children:null!=d?"API user: ".concat(d):"User being created, this might take 30s"})]})]})},ew=e=>{let{accessToken:t,token:s,keys:r,userRole:a,userID:o,setKeys:i}=e,[c,d]=(0,n.useState)(null),[h,m]=(0,n.useState)(null),[x,p]=(0,n.useState)(1);if((0,n.useEffect)(()=>{if(!t||!s||!a||!o)return;let e=async()=>{try{let e=await u(t,null,a,!0);console.log("user data response:",e),d(e)}catch(e){console.error("There was an error fetching the model data",e)}};t&&s&&a&&o&&!c&&e();let l=async()=>{try{let e=await f(t,null);console.log("user data response:",e),m(e)}catch(e){console.error("There was an error fetching the model data",e)}};a&&("Admin"==a||"Admin Viewer"==a)&&!h&&l()},[t,s,a,o]),!c||!t||!s||!a||!o)return(0,l.jsx)("div",{children:"Loading..."});let j=async e=>{try{let s=await f(t,e);console.log("user data response:",s),m(s)}catch(e){console.error("There was an error fetching the model data",e)}};return(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(ef,{userID:o,accessToken:t}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh] mb-4",children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{variant:"line",defaultValue:"1",children:[(0,l.jsx)(ex.Z,{value:"1",children:"Key Owners"}),(0,l.jsx)(ex.Z,{value:"2",children:"End-Users"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(G.Z,{className:"mt-5",children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"User ID"}),(0,l.jsx)(Y.Z,{children:"User Role"}),(0,l.jsx)(Y.Z,{children:"User Models"}),(0,l.jsx)(Y.Z,{children:"User Spend ($ USD)"}),(0,l.jsx)(Y.Z,{children:"User Max Budget ($ USD)"})]})}),(0,l.jsx)($.Z,{children:c.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_id}),(0,l.jsx)(H.Z,{children:e.user_role?e.user_role:"app_owner"}),(0,l.jsx)(H.Z,{children:e.models&&e.models.length>0?e.models:"All Models"}),(0,l.jsx)(H.Z,{children:e.spend?e.spend:0}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"Unlimited"})]},e.user_id))})]})}),(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{className:"flex items-center",children:[(0,l.jsx)("div",{className:"flex-1"}),(0,l.jsxs)("div",{className:"flex-1 flex justify-between items-center",children:[(0,l.jsx)(M.Z,{className:"w-1/4 mr-2 text-right",children:"Key"}),(0,l.jsx)(er.Z,{defaultValue:"1",className:"w-3/4",children:null==r?void 0:r.map((e,t)=>{if(e&&null!==e.key_name&&e.key_name.length>0)return(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>j(e.token),children:e.key_name},t)})})]})]}),(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"End User"}),(0,l.jsx)(Y.Z,{children:"Spend"}),(0,l.jsx)(Y.Z,{children:"Total Events"})]})}),(0,l.jsx)($.Z,{children:null==h?void 0:h.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.end_user}),(0,l.jsx)(H.Z,{children:e.total_spend}),(0,l.jsx)(H.Z,{children:e.total_events})]},t))})]})]})]})]})}),function(){if(!c)return null;let e=Math.ceil(c.length/25),t=Math.min(25*x,c.length);return(0,l.jsxs)("div",{className:"flex justify-between items-center",children:[(0,l.jsxs)("div",{children:["Showing ",(x-1)*25+1," – ",t," of ",c.length]}),(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-l focus:outline-none",disabled:1===x,onClick:()=>p(x-1),children:"← Prev"}),(0,l.jsx)("button",{className:"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-r focus:outline-none",disabled:x===e,onClick:()=>p(x+1),children:"Next →"})]})]})}()]})})},ek=s(8510),e_=e=>{let{teams:t,searchParams:s,accessToken:r,setTeams:a}=e,[i]=D.Z.useForm(),[d]=D.Z.useForm(),{Title:h,Paragraph:m}=en.default,[u,x]=(0,n.useState)(""),[p,j]=(0,n.useState)(t?t[0]:null),[g,Z]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),w=async e=>{try{if(null!=r){c.ZP.info("Making API Call");let s=await N(r,e);null!==t?a([...t,s]):a([s]),console.log("response for team create call: ".concat(s)),Z(!1)}}catch(e){console.error("Error creating the key:",e)}},k=async e=>{try{if(null!=r&&null!=t){c.ZP.info("Making API Call");let s={role:"user",user_email:e.user_email,user_id:e.user_id},l=await A(r,p.team_id,s);console.log("response for team create call: ".concat(l.data));let n=t.findIndex(e=>(console.log("team.team_id=".concat(e.team_id,"; response.data.team_id=").concat(l.data.team_id)),e.team_id===l.data.team_id));if(console.log("foundIndex: ".concat(n)),-1!==n){let e=[...t];e[n]=l.data,a(e),j(l.data)}f(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("received teams ".concat(t)),(0,l.jsx)("div",{className:"w-full",children:(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-2 h-[75vh] w-full",children:[(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"All Teams"}),(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Team Name"}),(0,l.jsx)(Y.Z,{children:"Spend (USD)"}),(0,l.jsx)(Y.Z,{children:"Budget (USD)"}),(0,l.jsx)(Y.Z,{children:"TPM / RPM Limits"})]})}),(0,l.jsx)($.Z,{children:t&&t.length>0?t.map(e=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.team_alias}),(0,l.jsx)(H.Z,{children:e.spend}),(0,l.jsx)(H.Z,{children:e.max_budget?e.max_budget:"No limit"}),(0,l.jsx)(H.Z,{children:(0,l.jsxs)(M.Z,{children:["TPM Limit:"," ",e.tpm_limit?e.tpm_limit:"Unlimited"," ",(0,l.jsx)("br",{})," RPM Limit:"," ",e.rpm_limit?e.rpm_limit:"Unlimited"]})}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},e.team_id)):null})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto",onClick:()=>Z(!0),children:"+ Create New Team"}),(0,l.jsx)(U.Z,{title:"Create Team",visible:g,width:800,footer:null,onOk:()=>{Z(!1),i.resetFields()},onCancel:()=>{Z(!1),i.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:w,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Team Name",name:"team_alias",children:(0,l.jsx)(L.Z,{})}),(0,l.jsx)(D.Z.Item,{label:"Models",name:"models",children:(0,l.jsx)(O.default,{mode:"multiple",placeholder:"Select models",style:{width:"100%"}})}),(0,l.jsx)(D.Z.Item,{label:"Max Budget (USD)",name:"max_budget",children:(0,l.jsx)(z.Z,{step:.01,precision:2,width:200})}),(0,l.jsx)(D.Z.Item,{label:"Tokens per minute Limit (TPM)",name:"tpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})}),(0,l.jsx)(D.Z.Item,{label:"Requests per minute Limit (RPM)",name:"rpm_limit",children:(0,l.jsx)(z.Z,{step:1,width:400})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Create Team"})})]})})]}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(h,{level:4,children:"Team Members"}),(0,l.jsx)(m,{children:"If you belong to multiple teams, this setting controls which teams members you see."}),t&&t.length>0?(0,l.jsx)(er.Z,{defaultValue:"0",children:t.map((e,t)=>(0,l.jsx)(ea.Z,{value:String(t),onClick:()=>{j(e)},children:e.team_alias},t))}):(0,l.jsxs)(m,{children:["No team created. ",(0,l.jsx)("b",{children:"Defaulting to personal account."})]})]}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:p?p.members_with_roles.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>f(!0),children:"+ Add member"}),(0,l.jsx)(U.Z,{title:"Add member",visible:y,width:800,footer:null,onOk:()=>{f(!1),d.resetFields()},onCancel:()=>{f(!1),d.resetFields()},children:(0,l.jsxs)(D.Z,{form:i,onFinish:k,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})})},eb=e=>{let{searchParams:t,accessToken:s}=e,[r]=D.Z.useForm(),[a]=D.Z.useForm(),{Title:i,Paragraph:d}=en.default,[h,m]=(0,n.useState)(""),[u,x]=(0,n.useState)(null),[p,j]=(0,n.useState)(!1);(0,n.useEffect)(()=>{(async()=>{if(null!=s){let e=[],t=await S(s,"proxy_admin_viewer");t.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy viewers: ".concat(t));let l=await S(s,"proxy_admin");l.forEach(t=>{e.push({user_role:t.user_role,user_id:t.user_id,user_email:t.user_email})}),console.log("proxy admins: ".concat(l)),console.log("combinedList: ".concat(e)),x(e)}})()},[s]);let g=async e=>{try{if(null!=s&&null!=u){c.ZP.info("Making API Call"),e.user_email,e.user_id;let t=await C(s,e);console.log("response for team create call: ".concat(t));let l=u.findIndex(e=>(console.log("user.user_id=".concat(e.user_id,"; response.user_id=").concat(t.user_id)),e.user_id===t.user_id));console.log("foundIndex: ".concat(l)),-1==l&&(console.log("updates admin with new user"),u.push(t),x(u)),j(!1)}}catch(e){console.error("Error creating the key:",e)}};return console.log("admins: ".concat(null==u?void 0:u.length)),(0,l.jsxs)("div",{className:"w-full m-2",children:[(0,l.jsx)(i,{level:4,children:"Restricted Access"}),(0,l.jsxs)(d,{children:["Add other people to just view spend. They cannot create keys, teams or grant users access to new models."," ",(0,l.jsx)("a",{href:"https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access",children:"Requires SSO Setup"})]}),(0,l.jsxs)(E.Z,{numItems:1,className:"gap-2 p-0 w-full",children:[(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsx)(F.Z,{className:"w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]",children:(0,l.jsxs)(G.Z,{children:[(0,l.jsx)(W.Z,{children:(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(Y.Z,{children:"Member Name"}),(0,l.jsx)(Y.Z,{children:"Role"}),(0,l.jsx)(Y.Z,{children:"Action"})]})}),(0,l.jsx)($.Z,{children:u?u.map((e,t)=>(0,l.jsxs)(X.Z,{children:[(0,l.jsx)(H.Z,{children:e.user_email?e.user_email:e.user_id?e.user_id:null}),(0,l.jsx)(H.Z,{children:e.user_role}),(0,l.jsx)(H.Z,{children:(0,l.jsx)(J.Z,{icon:ek.Z,size:"sm"})})]},t)):null})]})})}),(0,l.jsxs)(T.Z,{numColSpan:1,children:[(0,l.jsx)(o.Z,{className:"mx-auto mb-5",onClick:()=>j(!0),children:"+ Add viewer"}),(0,l.jsx)(U.Z,{title:"Add viewer",visible:p,width:800,footer:null,onOk:()=>{j(!1),a.resetFields()},onCancel:()=>{j(!1),a.resetFields()},children:(0,l.jsxs)(D.Z,{form:r,onFinish:g,labelCol:{span:8},wrapperCol:{span:16},labelAlign:"left",children:[(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(D.Z.Item,{label:"Email",name:"user_email",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_email",className:"px-3 py-2 border rounded-md w-full"})}),(0,l.jsx)("div",{className:"text-center mb-4",children:"OR"}),(0,l.jsx)(D.Z.Item,{label:"User ID",name:"user_id",className:"mb-4",children:(0,l.jsx)(L.Z,{name:"user_id",className:"px-3 py-2 border rounded-md w-full"})})]}),(0,l.jsx)("div",{style:{textAlign:"right",marginTop:"10px"},children:(0,l.jsx)(B.ZP,{htmlType:"submit",children:"Add member"})})]})})]})]})]})},ev=s(12968),eS=s(67951);async function eN(e,t,s,l){console.log("isLocal:",!1);let n=window.location.origin,r=new ev.ZP.OpenAI({apiKey:l,baseURL:n,dangerouslyAllowBrowser:!0});for await(let l of(await r.chat.completions.create({model:s,stream:!0,messages:[{role:"user",content:e}]})))console.log(l),l.choices[0].delta.content&&t(l.choices[0].delta.content)}var eA=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,[o,i]=(0,n.useState)(""),[c,d]=(0,n.useState)([]),[h,m]=(0,n.useState)(void 0),[u,x]=(0,n.useState)(null);(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{let e=await p(t,a,r);console.log("model_info:",e),(null==e?void 0:e.data.length)>0&&(x(e.data),m(e.data[0].id))})()},[t,a,r]);let j=(e,t)=>{d(s=>{let l=s[s.length-1];return l&&l.role===e?[...s.slice(0,s.length-1),{role:e,content:l.content+t}]:[...s,{role:e,content:t}]})},g=async()=>{if(""!==o.trim()&&t&&s&&r&&a){d(e=>[...e,{role:"user",content:o}]);try{h&&await eN(o,e=>j("assistant",e),h,t)}catch(e){console.error("Error fetching model response",e),j("assistant","Error fetching model response")}i("")}};if(r&&"Admin Viewer"==r){let{Title:e,Paragraph:t}=en.default;return(0,l.jsxs)("div",{children:[(0,l.jsx)(e,{level:1,children:"Access Denied"}),(0,l.jsx)(t,{children:"Ask your proxy admin for access to test models"})]})}return(0,l.jsx)("div",{style:{width:"100%",position:"relative"},children:(0,l.jsx)(E.Z,{className:"gap-2 p-10 h-[75vh] w-full",children:(0,l.jsx)(F.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{className:"mt-4",children:[(0,l.jsx)(ex.Z,{children:"Chat"}),(0,l.jsx)(ex.Z,{children:"API Reference"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsxs)(eg.Z,{children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("label",{children:"Select Model:"}),(0,l.jsx)("select",{value:h||"",onChange:e=>m(e.target.value),children:null==u?void 0:u.map(e=>(0,l.jsx)("option",{value:e.id,children:e.id},e.id))})]}),(0,l.jsxs)(G.Z,{className:"mt-5",style:{display:"block",maxHeight:"60vh",overflowY:"auto"},children:[(0,l.jsx)(W.Z,{children:(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:(0,l.jsx)(R.Z,{children:"Chat"})})})}),(0,l.jsx)($.Z,{children:c.map((e,t)=>(0,l.jsx)(X.Z,{children:(0,l.jsx)(H.Z,{children:"".concat(e.role,": ").concat(e.content)})},t))})]}),(0,l.jsx)("div",{className:"mt-3",style:{position:"absolute",bottom:5,width:"95%"},children:(0,l.jsxs)("div",{className:"flex",children:[(0,l.jsx)("input",{type:"text",value:o,onChange:e=>i(e.target.value),className:"flex-1 p-2 border rounded-md mr-2",placeholder:"Type your message..."}),(0,l.jsx)("button",{onClick:g,className:"p-2 bg-blue-500 text-white rounded-md",children:"Send"})]})})]}),(0,l.jsx)(eg.Z,{children:(0,l.jsxs)(ep.Z,{children:[(0,l.jsxs)(ej.Z,{children:[(0,l.jsx)(ex.Z,{children:"OpenAI Python SDK"}),(0,l.jsx)(ex.Z,{children:"LlamaIndex"}),(0,l.jsx)(ex.Z,{children:"Langchain Py"})]}),(0,l.jsxs)(eZ.Z,{children:[(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport openai\nclient = openai.OpenAI(\n api_key="your_api_key",\n base_url="http://0.0.0.0:4000" # proxy base url\n)\n\nresponse = client.chat.completions.create(\n model="gpt-3.5-turbo", # model to use from Models Tab\n messages = [\n {\n "role": "user",\n "content": "this is a test request, write a short poem"\n }\n ],\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-openai-client",\n "generation_id": "openai-client-gen-id22",\n "trace_id": "openai-client-trace-id22",\n "trace_user_id": "openai-client-user-id2"\n }\n }\n)\n\nprint(response)\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nimport os, dotenv\n\nfrom llama_index.llms import AzureOpenAI\nfrom llama_index.embeddings import AzureOpenAIEmbedding\nfrom llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext\n\nllm = AzureOpenAI(\n engine="azure-gpt-3.5", # model_name on litellm proxy\n temperature=0.0,\n azure_endpoint="http://0.0.0.0:4000", # litellm proxy endpoint\n api_key="sk-1234", # litellm proxy API Key\n api_version="2023-07-01-preview",\n)\n\nembed_model = AzureOpenAIEmbedding(\n deployment_name="azure-embedding-model",\n azure_endpoint="http://0.0.0.0:4000",\n api_key="sk-1234",\n api_version="2023-07-01-preview",\n)\n\n\ndocuments = SimpleDirectoryReader("llama_index_data").load_data()\nservice_context = ServiceContext.from_defaults(llm=llm, embed_model=embed_model)\nindex = VectorStoreIndex.from_documents(documents, service_context=service_context)\n\nquery_engine = index.as_query_engine()\nresponse = query_engine.query("What did the author do growing up?")\nprint(response)\n\n '})}),(0,l.jsx)(eg.Z,{children:(0,l.jsx)(eS.Z,{language:"python",children:'\nfrom langchain.chat_models import ChatOpenAI\nfrom langchain.prompts.chat import (\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n SystemMessagePromptTemplate,\n)\nfrom langchain.schema import HumanMessage, SystemMessage\n\nchat = ChatOpenAI(\n openai_api_base="http://0.0.0.0:8000",\n model = "gpt-3.5-turbo",\n temperature=0.1,\n extra_body={\n "metadata": {\n "generation_name": "ishaan-generation-langchain-client",\n "generation_id": "langchain-client-gen-id22",\n "trace_id": "langchain-client-trace-id22",\n "trace_user_id": "langchain-client-user-id2"\n }\n }\n)\n\nmessages = [\n SystemMessage(\n content="You are a helpful assistant that im using to make a test request to."\n ),\n HumanMessage(\n content="test from litellm. tell me why it\'s amazing in 1 sentence"\n ),\n]\nresponse = chat(messages)\n\nprint(response)\n\n '})})]})]})})]})]})})})})},eC=s(33509),eI=s(30569);let{Sider:eP}=eC.default;var eT=e=>{let{setPage:t,userRole:s,defaultSelectedKey:n}=e;return"Admin Viewer"==s?(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["4"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"4"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"1")]})})}):(0,l.jsx)(eC.default,{style:{minHeight:"100vh",maxWidth:"120px"},children:(0,l.jsx)(eP,{width:120,children:(0,l.jsxs)(eI.Z,{mode:"inline",defaultSelectedKeys:n||["1"],style:{height:"100%",borderRight:0},children:[(0,l.jsx)(eI.Z.Item,{onClick:()=>t("api-keys"),children:"API Keys"},"1"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("models"),children:"Models"},"2"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("llm-playground"),children:"Chat UI"},"3"),(0,l.jsx)(eI.Z.Item,{onClick:()=>t("usage"),children:"Usage"},"4"),"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("users"),children:"Users"},"5"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("teams"),children:"Teams"},"6"):null,"Admin"==s?(0,l.jsx)(eI.Z.Item,{onClick:()=>t("admin-panel"),children:"Admin"},"7"):null]})})})},eE=e=>{let{accessToken:t,token:s,userRole:r,userID:a}=e,o=new Date,[i,c]=(0,n.useState)([]),[d,h]=(0,n.useState)([]),[m,u]=(0,n.useState)([]),[x,p]=(0,n.useState)([]),j=new Date(o.getFullYear(),o.getMonth(),1),f=new Date(o.getFullYear(),o.getMonth()+1,0),_=v(j),b=v(f);function v(e){let t=e.getFullYear(),s=e.getMonth()+1,l=e.getDate();return"".concat(t,"-").concat(s<10?"0"+s:s,"-").concat(l<10?"0"+l:l)}return console.log("Start date is ".concat(_)),console.log("End date is ".concat(b)),(0,n.useEffect)(()=>{t&&s&&r&&a&&(async()=>{try{if(console.log("user role: ".concat(r)),"Admin"==r||"Admin Viewer"==r){let e=await Z(t);c(e);let s=(await y(t)).map(e=>({key:(e.key_name||e.key_alias||e.api_key).substring(0,7),spend:e.total_spend}));h(s);let l=(await w(t)).map(e=>({key:e.model,spend:e.total_spend}));u(l)}else"App Owner"==r&&await g(t,s,r,a,_,b).then(async e=>{if(console.log("result from spend logs call",e),"daily_spend"in e){let t=e.daily_spend;console.log("daily spend",t),c(t);let s=e.top_api_keys;h(s)}else{let s=(await k(t,function(e){let t=[];e.forEach(e=>{Object.entries(e).forEach(e=>{let[s,l]=e;"spend"!==s&&"startTime"!==s&&"models"!==s&&"users"!==s&&t.push({key:s,spend:l})})}),t.sort((e,t)=>Number(t.spend)-Number(e.spend));let s=t.slice(0,5).map(e=>e.key);return console.log("topKeys: ".concat(Object.keys(s[0]))),s}(e))).info.map(e=>({key:(e.key_name||e.key_alias||e.token).substring(0,7),spend:e.spend}));h(s),p(function(e){let t={};e.forEach(e=>{Object.entries(e.users).forEach(e=>{let[s,l]=e;""!==s&&null!=s&&"None"!=s&&(t[s]||(t[s]=0),t[s]+=l)})});let s=Object.entries(t).map(e=>{let[t,s]=e;return{user_id:t,spend:s}});s.sort((e,t)=>t.spend-e.spend);let l=s.slice(0,5);return console.log("topKeys: ".concat(Object.values(l[0]))),l}(e)),c(e)}})}catch(e){console.error("There was an error fetching the data",e)}})()},[t,s,r,a,_,b]),(0,l.jsx)("div",{style:{width:"100%"},children:(0,l.jsxs)(E.Z,{numItems:2,className:"gap-2 p-10 h-[75vh] w-full",children:[(0,l.jsx)(T.Z,{numColSpan:2,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Monthly Spend"}),(0,l.jsx)(Q.Z,{data:i,index:"date",categories:["spend"],colors:["blue"],valueFormatter:e=>"$ ".concat(new Intl.NumberFormat("us").format(e).toString()),yAxisWidth:100,tickGap:5})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top API Keys"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:d,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:80,tickGap:5,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Users"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:x,index:"user_id",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})}),(0,l.jsx)(T.Z,{numColSpan:1,children:(0,l.jsxs)(F.Z,{children:[(0,l.jsx)(R.Z,{children:"Top Models"}),(0,l.jsx)(Q.Z,{className:"mt-4 h-40",data:m,index:"key",categories:["spend"],colors:["blue"],yAxisWidth:200,layout:"vertical",showXAxis:!1,showLegend:!1})]})})]})})},eF=()=>{let{Title:e,Paragraph:t}=en.default,[s,a]=(0,n.useState)(""),[o,c]=(0,n.useState)(null),[d,h]=(0,n.useState)(null),[m,u]=(0,n.useState)(null),[x,p]=(0,n.useState)(!0),j=(0,r.useSearchParams)(),g=j.get("userID"),Z=j.get("token"),[y,f]=(0,n.useState)("api-keys"),[w,k]=(0,n.useState)(null);return(0,n.useEffect)(()=>{if(Z){let e=(0,ei.o)(Z);if(e){if(console.log("Decoded token:",e),console.log("Decoded key:",e.key),k(e.key),e.user_role){let t=function(e){if(!e)return"Undefined Role";switch(console.log("Received user role: ".concat(e.toLowerCase())),console.log("Received user role length: ".concat(e.toLowerCase().length)),e.toLowerCase()){case"app_owner":case"demo_app_owner":return"App Owner";case"app_admin":case"proxy_admin":return"Admin";case"proxy_admin_viewer":return"Admin Viewer";case"app_user":return"App User";default:return"Unknown Role"}}(e.user_role);console.log("Decoded user_role:",t),a(t),"Admin Viewer"==t&&f("usage")}else console.log("User role not defined");e.user_email?c(e.user_email):console.log("User Email is not set ".concat(e)),e.login_method?p("username_password"==e.login_method):console.log("User Email is not set ".concat(e))}}},[Z]),(0,l.jsx)(n.Suspense,{fallback:(0,l.jsx)("div",{children:"Loading..."}),children:(0,l.jsxs)("div",{className:"flex flex-col min-h-screen",children:[(0,l.jsx)(i,{userID:g,userRole:s,userEmail:o,showSSOBanner:x}),(0,l.jsxs)("div",{className:"flex flex-1 overflow-auto",children:[(0,l.jsx)(eT,{setPage:f,userRole:s,defaultSelectedKey:null}),"api-keys"==y?(0,l.jsx)(ec,{userID:g,userRole:s,teams:d,keys:m,setUserRole:a,userEmail:o,setUserEmail:c,setTeams:h,setKeys:u}):"models"==y?(0,l.jsx)(eu,{userID:g,userRole:s,token:Z,accessToken:w}):"llm-playground"==y?(0,l.jsx)(eA,{userID:g,userRole:s,token:Z,accessToken:w}):"users"==y?(0,l.jsx)(ew,{userID:g,userRole:s,token:Z,keys:m,accessToken:w,setKeys:u}):"teams"==y?(0,l.jsx)(e_,{teams:d,setTeams:h,searchParams:j,accessToken:w}):"admin-panel"==y?(0,l.jsx)(eb,{setTeams:h,searchParams:j,accessToken:w}):(0,l.jsx)(eE,{userID:g,userRole:s,token:Z,accessToken:w})]})]})})}}},function(e){e.O(0,[730,971,69,744],function(){return e(e.s=20661)}),_N_E=e.O()}]); \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.html b/ui/litellm-dashboard/out/index.html index aaaaa698a..437d90aac 100644 --- a/ui/litellm-dashboard/out/index.html +++ b/ui/litellm-dashboard/out/index.html @@ -1 +1 @@ -🚅 LiteLLM \ No newline at end of file +🚅 LiteLLM \ No newline at end of file diff --git a/ui/litellm-dashboard/out/index.txt b/ui/litellm-dashboard/out/index.txt index 72b67997a..28c9282be 100644 --- a/ui/litellm-dashboard/out/index.txt +++ b/ui/litellm-dashboard/out/index.txt @@ -1,7 +1,7 @@ 2:I[77831,[],""] -3:I[56239,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-37bd7c3d0bb898a3.js"],""] +3:I[57492,["730","static/chunks/730-1411b729a1c79695.js","931","static/chunks/app/page-2ed0bc91ffef505b.js"],""] 4:I[5613,[],""] 5:I[31778,[],""] -0:["p1zjZBLDqxGf-NaFvZkeF",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] +0:["ZF-EluyKCEJoZptE3dOXT",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_c23dc8","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/ui/_next/static/css/32e93a3d13512de5.css","precedence":"next","crossOrigin":""}]],"$L6"]]]] 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"🚅 LiteLLM"}],["$","meta","3",{"name":"description","content":"LiteLLM Proxy Admin UI"}],["$","link","4",{"rel":"icon","href":"/ui/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","meta","5",{"name":"next-size-adjust"}]] 1:null From 5e93bad4af87f61542cab94bb75e56a34f77eab3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 14:11:11 -0800 Subject: [PATCH 109/304] fix(factory.py): fix prompt mapping --- litellm/llms/prompt_templates/factory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index baf2c3a2a..dec87a61c 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -829,7 +829,7 @@ def prompt_factory( if custom_llm_provider == "ollama": return ollama_pt(model=model, messages=messages) elif custom_llm_provider == "anthropic": - if model == "claude-instant-1" or model == "claude-2.1": + if model == "claude-instant-1" or model == "claude-2": return anthropic_pt(messages=messages) return anthropic_messages_pt(messages=messages) elif custom_llm_provider == "together_ai": From 0ac652a771a25f051fd3f3234aebc333184a36d3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 16:22:44 -0800 Subject: [PATCH 110/304] fix(bedrock.py): add claude 3 support --- litellm/__init__.py | 3 +- litellm/llms/bedrock.py | 85 +++++++++++++++---- ...odel_prices_and_context_window_backup.json | 9 ++ model_prices_and_context_window.json | 9 ++ 4 files changed, 90 insertions(+), 16 deletions(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index 0bc5f4f39..bdef46086 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -591,10 +591,11 @@ from .llms.bedrock import ( AmazonTitanConfig, AmazonAI21Config, AmazonAnthropicConfig, + AmazonAnthropicClaude3Config, AmazonCohereConfig, AmazonLlamaConfig, AmazonStabilityConfig, - AmazonMistralConfig + AmazonMistralConfig, ) from .llms.openai import OpenAIConfig, OpenAITextCompletionConfig from .llms.azure import AzureOpenAIConfig, AzureOpenAIError diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 1a25e167a..18920da4a 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -70,6 +70,48 @@ class AmazonTitanConfig: } +class AmazonAnthropicClaude3Config: + """ + Reference: https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=claude + + Supported Params for the Amazon / Anthropic Claude 3 models: + + - `max_tokens` (integer) max tokens, + - `anthropic_version` (string) version of anthropic for bedrock - e.g. "bedrock-2023-05-31" + """ + + max_tokens: Optional[int] = litellm.max_tokens + anthropic_version: Optional[str] = None + + def __init__( + self, + max_tokens: Optional[int] = None, + anthropic_version: Optional[str] = None, + ) -> None: + locals_ = locals() + for key, value in locals_.items(): + if key != "self" and value is not None: + setattr(self.__class__, key, value) + + @classmethod + def get_config(cls): + return { + k: v + for k, v in cls.__dict__.items() + if not k.startswith("__") + and not isinstance( + v, + ( + types.FunctionType, + types.BuiltinFunctionType, + classmethod, + staticmethod, + ), + ) + and v is not None + } + + class AmazonAnthropicConfig: """ Reference: https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=claude @@ -330,7 +372,8 @@ class AmazonMistralConfig: ) and v is not None } - + + class AmazonStabilityConfig: """ Reference: https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=stability.stable-diffusion-xl-v0 @@ -542,7 +585,9 @@ def convert_messages_to_prompt(model, messages, provider, custom_prompt_dict): model=model, messages=messages, custom_llm_provider="bedrock" ) elif provider == "mistral": - prompt = prompt_factory(model=model, messages=messages, custom_llm_provider="bedrock") + prompt = prompt_factory( + model=model, messages=messages, custom_llm_provider="bedrock" + ) else: prompt = "" for message in messages: @@ -619,14 +664,24 @@ def completion( inference_params = copy.deepcopy(optional_params) stream = inference_params.pop("stream", False) if provider == "anthropic": - ## LOAD CONFIG - config = litellm.AmazonAnthropicConfig.get_config() - for k, v in config.items(): - if ( - k not in inference_params - ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in - inference_params[k] = v - data = json.dumps({"prompt": prompt, **inference_params}) + if model == "anthropic.claude-3": + ## LOAD CONFIG + config = litellm.AmazonAnthropicClaude3Config.get_config() + for k, v in config.items(): + if ( + k not in inference_params + ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in + inference_params[k] = v + data = json.dumps({"prompt": prompt, **inference_params}) + else: + ## LOAD CONFIG + config = litellm.AmazonAnthropicConfig.get_config() + for k, v in config.items(): + if ( + k not in inference_params + ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in + inference_params[k] = v + data = json.dumps({"prompt": prompt, **inference_params}) elif provider == "ai21": ## LOAD CONFIG config = litellm.AmazonAI21Config.get_config() @@ -646,9 +701,9 @@ def completion( ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in inference_params[k] = v if optional_params.get("stream", False) == True: - inference_params[ - "stream" - ] = True # cohere requires stream = True in inference params + inference_params["stream"] = ( + True # cohere requires stream = True in inference params + ) data = json.dumps({"prompt": prompt, **inference_params}) elif provider == "meta": ## LOAD CONFIG @@ -674,7 +729,7 @@ def completion( "textGenerationConfig": inference_params, } ) - elif provider == "mistral": + elif provider == "mistral": ## LOAD CONFIG config = litellm.AmazonMistralConfig.get_config() for k, v in config.items(): @@ -1118,4 +1173,4 @@ def image_generation( image_dict = {"url": artifact["base64"]} model_response.data = image_dict - return model_response \ No newline at end of file + return model_response diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 23afaf04d..111b9f8c3 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -1266,6 +1266,15 @@ "litellm_provider": "bedrock", "mode": "completion" }, + "anthropic.claude-3-sonnet-20240229-v1:0": { + "max_tokens": 200000, + "max_input_tokens": 200000, + "max_output_tokens": 4096, + "input_cost_per_token": 0.000003, + "output_cost_per_token": 0.000015, + "litellm_provider": "bedrock", + "mode": "chat" + }, "anthropic.claude-v1": { "max_tokens": 100000, "max_output_tokens": 8191, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 23afaf04d..111b9f8c3 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -1266,6 +1266,15 @@ "litellm_provider": "bedrock", "mode": "completion" }, + "anthropic.claude-3-sonnet-20240229-v1:0": { + "max_tokens": 200000, + "max_input_tokens": 200000, + "max_output_tokens": 4096, + "input_cost_per_token": 0.000003, + "output_cost_per_token": 0.000015, + "litellm_provider": "bedrock", + "mode": "chat" + }, "anthropic.claude-v1": { "max_tokens": 100000, "max_output_tokens": 8191, From 478307d4cf5f21bd7bf9350a4e60b297243f55ad Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 17:15:35 -0800 Subject: [PATCH 111/304] fix(bedrock.py): support anthropic messages api on bedrock (claude-3) --- litellm/llms/bedrock.py | 73 ++- litellm/tests/test_amazing_s3_logs.py | 2 +- litellm/tests/test_bedrock_completion.py | 557 +++++++++--------- litellm/tests/test_caching.py | 1 - litellm/tests/test_completion.py | 4 - litellm/tests/test_completion_cost.py | 1 - litellm/tests/test_custom_callback_input.py | 3 - litellm/tests/test_embedding.py | 2 - litellm/tests/test_image_generation.py | 2 - .../tests/test_provider_specific_config.py | 1 - litellm/tests/test_proxy_server.py | 1 - litellm/tests/test_router.py | 1 - litellm/tests/test_router_timeout.py | 1 - litellm/tests/test_streaming.py | 2 - litellm/utils.py | 37 +- 15 files changed, 381 insertions(+), 307 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 18920da4a..a2d8accdf 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -5,7 +5,13 @@ import time from typing import Callable, Optional, Any, Union, List import litellm from litellm.utils import ModelResponse, get_secret, Usage, ImageResponse -from .prompt_templates.factory import prompt_factory, custom_prompt +from .prompt_templates.factory import ( + prompt_factory, + custom_prompt, + construct_tool_use_system_prompt, + extract_between_tags, + parse_xml_params, +) import httpx @@ -81,7 +87,7 @@ class AmazonAnthropicClaude3Config: """ max_tokens: Optional[int] = litellm.max_tokens - anthropic_version: Optional[str] = None + anthropic_version: Optional[str] = "bedrock-2023-05-31" def __init__( self, @@ -111,6 +117,15 @@ class AmazonAnthropicClaude3Config: and v is not None } + def get_supported_openai_params(self): + return ["max_tokens"] + + def map_openai_params(self, non_default_params: dict, optional_params: dict): + for param, value in non_default_params.items(): + if param == "max_tokens": + optional_params["max_tokens"] = value + return optional_params + class AmazonAnthropicConfig: """ @@ -165,6 +180,25 @@ class AmazonAnthropicConfig: and v is not None } + def get_supported_openai_params( + self, + ): + return ["max_tokens", "temperature", "stop", "top_p", "stream"] + + def map_openai_params(self, non_default_params: dict, optional_params: dict): + for param, value in non_default_params.items(): + if param == "max_tokens": + optional_params["max_tokens_to_sample"] = value + if param == "temperature": + optional_params["temperature"] = value + if param == "top_p": + optional_params["top_p"] = value + if param == "stop": + optional_params["stop_sequences"] = value + if param == "stream" and value == True: + optional_params["stream"] = value + return optional_params + class AmazonCohereConfig: """ @@ -664,7 +698,20 @@ def completion( inference_params = copy.deepcopy(optional_params) stream = inference_params.pop("stream", False) if provider == "anthropic": - if model == "anthropic.claude-3": + if model.startswith("anthropic.claude-3"): + # Separate system prompt from rest of message + system_prompt_idx: Optional[int] = None + for idx, message in enumerate(messages): + if message["role"] == "system": + inference_params["system"] = message["content"] + system_prompt_idx = idx + break + if system_prompt_idx is not None: + messages.pop(system_prompt_idx) + # Format rest of message according to anthropic guidelines + messages = prompt_factory( + model=model, messages=messages, custom_llm_provider="anthropic" + ) ## LOAD CONFIG config = litellm.AmazonAnthropicClaude3Config.get_config() for k, v in config.items(): @@ -672,7 +719,17 @@ def completion( k not in inference_params ): # completion(top_k=3) > anthropic_config(top_k=3) <- allows for dynamic variables to be passed in inference_params[k] = v - data = json.dumps({"prompt": prompt, **inference_params}) + ## Handle Tool Calling + if "tools" in inference_params: + tool_calling_system_prompt = construct_tool_use_system_prompt( + tools=inference_params["tools"] + ) + inference_params["system"] = ( + inference_params.get("system", "\n") + + tool_calling_system_prompt + ) # add the anthropic tool calling prompt to the system prompt + inference_params.pop("tools") + data = json.dumps({"messages": messages, **inference_params}) else: ## LOAD CONFIG config = litellm.AmazonAnthropicConfig.get_config() @@ -838,8 +895,12 @@ def completion( if provider == "ai21": outputText = response_body.get("completions")[0].get("data").get("text") elif provider == "anthropic": - outputText = response_body["completion"] - model_response["finish_reason"] = response_body["stop_reason"] + if model.startswith("anthropic.claude-3"): + outputText = response_body.get("content")[0].get("text", None) + model_response["finish_reason"] = response_body["stop_reason"] + else: + outputText = response_body["completion"] + model_response["finish_reason"] = response_body["stop_reason"] elif provider == "cohere": outputText = response_body["generations"][0]["text"] elif provider == "meta": diff --git a/litellm/tests/test_amazing_s3_logs.py b/litellm/tests/test_amazing_s3_logs.py index 74d6eb5b9..0ccc0bc15 100644 --- a/litellm/tests/test_amazing_s3_logs.py +++ b/litellm/tests/test_amazing_s3_logs.py @@ -1,4 +1,4 @@ -## @pytest.mark.skip(reason="AWS Suspended Account") +# # @pytest.mark.skip(reason="AWS Suspended Account") # import sys # import os # import io, asyncio diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index 3e3d8b6bb..684381508 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -1,293 +1,310 @@ # @pytest.mark.skip(reason="AWS Suspended Account") -# import sys, os -# import traceback -# from dotenv import load_dotenv -# -# load_dotenv() -# import os, io -# -# sys.path.insert( -# 0, os.path.abspath("../..") -# ) # Adds the parent directory to the system path -# import pytest -# import litellm -# from litellm import embedding, completion, completion_cost, Timeout, ModelResponse -# from litellm import RateLimitError -# -# # litellm.num_retries = 3 -# litellm.cache = None -# litellm.success_callback = [] -# user_message = "Write a short poem about the sky" -# messages = [{"content": user_message, "role": "user"}] -# -# -# @pytest.fixture(autouse=True) -# def reset_callbacks(): -# print("\npytest fixture - resetting callbacks") -# litellm.success_callback = [] -# litellm._async_success_callback = [] -# litellm.failure_callback = [] -# litellm.callbacks = [] +import sys, os +import traceback +from dotenv import load_dotenv + +load_dotenv() +import os, io + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +import pytest +import litellm +from litellm import embedding, completion, completion_cost, Timeout, ModelResponse +from litellm import RateLimitError + +# litellm.num_retries = 3 +litellm.cache = None +litellm.success_callback = [] +user_message = "Write a short poem about the sky" +messages = [{"content": user_message, "role": "user"}] -# def test_completion_bedrock_claude_completion_auth(): -# print("calling bedrock claude completion params auth") -# import os - -# aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] -# aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] -# aws_region_name = os.environ["AWS_REGION_NAME"] - -# os.environ.pop("AWS_ACCESS_KEY_ID", None) -# os.environ.pop("AWS_SECRET_ACCESS_KEY", None) -# os.environ.pop("AWS_REGION_NAME", None) - -# try: -# response = completion( -# model="bedrock/anthropic.claude-instant-v1", -# messages=messages, -# max_tokens=10, -# temperature=0.1, -# aws_access_key_id=aws_access_key_id, -# aws_secret_access_key=aws_secret_access_key, -# aws_region_name=aws_region_name, -# ) -# # Add any assertions here to check the response -# print(response) - -# os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id -# os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key -# os.environ["AWS_REGION_NAME"] = aws_region_name -# except RateLimitError: -# pass -# except Exception as e: -# pytest.fail(f"Error occurred: {e}") +@pytest.fixture(autouse=True) +def reset_callbacks(): + print("\npytest fixture - resetting callbacks") + litellm.success_callback = [] + litellm._async_success_callback = [] + litellm.failure_callback = [] + litellm.callbacks = [] -# # test_completion_bedrock_claude_completion_auth() +def test_completion_bedrock_claude_completion_auth(): + print("calling bedrock claude completion params auth") + import os + + aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] + aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] + aws_region_name = os.environ["AWS_REGION_NAME"] + + os.environ.pop("AWS_ACCESS_KEY_ID", None) + os.environ.pop("AWS_SECRET_ACCESS_KEY", None) + os.environ.pop("AWS_REGION_NAME", None) + + try: + response = completion( + model="bedrock/anthropic.claude-instant-v1", + messages=messages, + max_tokens=10, + temperature=0.1, + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + aws_region_name=aws_region_name, + ) + # Add any assertions here to check the response + print(response) + + os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id + os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key + os.environ["AWS_REGION_NAME"] = aws_region_name + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") -# def test_completion_bedrock_claude_2_1_completion_auth(): -# print("calling bedrock claude 2.1 completion params auth") -# import os - -# aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] -# aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] -# aws_region_name = os.environ["AWS_REGION_NAME"] - -# os.environ.pop("AWS_ACCESS_KEY_ID", None) -# os.environ.pop("AWS_SECRET_ACCESS_KEY", None) -# os.environ.pop("AWS_REGION_NAME", None) -# try: -# response = completion( -# model="bedrock/anthropic.claude-v2:1", -# messages=messages, -# max_tokens=10, -# temperature=0.1, -# aws_access_key_id=aws_access_key_id, -# aws_secret_access_key=aws_secret_access_key, -# aws_region_name=aws_region_name, -# ) -# # Add any assertions here to check the response -# print(response) - -# os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id -# os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key -# os.environ["AWS_REGION_NAME"] = aws_region_name -# except RateLimitError: -# pass -# except Exception as e: -# pytest.fail(f"Error occurred: {e}") +# test_completion_bedrock_claude_completion_auth() -# # test_completion_bedrock_claude_2_1_completion_auth() +def test_completion_bedrock_claude_2_1_completion_auth(): + print("calling bedrock claude 2.1 completion params auth") + import os + + aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] + aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] + aws_region_name = os.environ["AWS_REGION_NAME"] + + os.environ.pop("AWS_ACCESS_KEY_ID", None) + os.environ.pop("AWS_SECRET_ACCESS_KEY", None) + os.environ.pop("AWS_REGION_NAME", None) + try: + response = completion( + model="bedrock/anthropic.claude-v2:1", + messages=messages, + max_tokens=10, + temperature=0.1, + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + aws_region_name=aws_region_name, + ) + # Add any assertions here to check the response + print(response) + + os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id + os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key + os.environ["AWS_REGION_NAME"] = aws_region_name + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") -# def test_completion_bedrock_claude_external_client_auth(): -# print("\ncalling bedrock claude external client auth") -# import os - -# aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] -# aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] -# aws_region_name = os.environ["AWS_REGION_NAME"] - -# os.environ.pop("AWS_ACCESS_KEY_ID", None) -# os.environ.pop("AWS_SECRET_ACCESS_KEY", None) -# os.environ.pop("AWS_REGION_NAME", None) - -# try: -# import boto3 - -# litellm.set_verbose = True - -# bedrock = boto3.client( -# service_name="bedrock-runtime", -# region_name=aws_region_name, -# aws_access_key_id=aws_access_key_id, -# aws_secret_access_key=aws_secret_access_key, -# endpoint_url=f"https://bedrock-runtime.{aws_region_name}.amazonaws.com", -# ) - -# response = completion( -# model="bedrock/anthropic.claude-instant-v1", -# messages=messages, -# max_tokens=10, -# temperature=0.1, -# aws_bedrock_client=bedrock, -# ) -# # Add any assertions here to check the response -# print(response) - -# os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id -# os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key -# os.environ["AWS_REGION_NAME"] = aws_region_name -# except RateLimitError: -# pass -# except Exception as e: -# pytest.fail(f"Error occurred: {e}") +# test_completion_bedrock_claude_2_1_completion_auth() -# # test_completion_bedrock_claude_external_client_auth() +def test_completion_bedrock_claude_external_client_auth(): + print("\ncalling bedrock claude external client auth") + import os + + aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] + aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] + aws_region_name = os.environ["AWS_REGION_NAME"] + + os.environ.pop("AWS_ACCESS_KEY_ID", None) + os.environ.pop("AWS_SECRET_ACCESS_KEY", None) + os.environ.pop("AWS_REGION_NAME", None) + + try: + import boto3 + + litellm.set_verbose = True + + bedrock = boto3.client( + service_name="bedrock-runtime", + region_name=aws_region_name, + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=f"https://bedrock-runtime.{aws_region_name}.amazonaws.com", + ) + + response = completion( + model="bedrock/anthropic.claude-instant-v1", + messages=messages, + max_tokens=10, + temperature=0.1, + aws_bedrock_client=bedrock, + ) + # Add any assertions here to check the response + print(response) + + os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id + os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key + os.environ["AWS_REGION_NAME"] = aws_region_name + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") -# @pytest.mark.skip(reason="Expired token, need to renew") -# def test_completion_bedrock_claude_sts_client_auth(): -# print("\ncalling bedrock claude external client auth") -# import os - -# aws_access_key_id = os.environ["AWS_TEMP_ACCESS_KEY_ID"] -# aws_secret_access_key = os.environ["AWS_TEMP_SECRET_ACCESS_KEY"] -# aws_region_name = os.environ["AWS_REGION_NAME"] -# aws_role_name = os.environ["AWS_TEMP_ROLE_NAME"] - -# try: -# import boto3 - -# litellm.set_verbose = True - -# response = completion( -# model="bedrock/anthropic.claude-instant-v1", -# messages=messages, -# max_tokens=10, -# temperature=0.1, -# aws_region_name=aws_region_name, -# aws_access_key_id=aws_access_key_id, -# aws_secret_access_key=aws_secret_access_key, -# aws_role_name=aws_role_name, -# aws_session_name="my-test-session", -# ) - -# response = embedding( -# model="cohere.embed-multilingual-v3", -# input=["hello world"], -# aws_region_name="us-east-1", -# aws_access_key_id=aws_access_key_id, -# aws_secret_access_key=aws_secret_access_key, -# aws_role_name=aws_role_name, -# aws_session_name="my-test-session", -# ) - -# response = completion( -# model="gpt-3.5-turbo", -# messages=messages, -# aws_region_name="us-east-1", -# aws_access_key_id=aws_access_key_id, -# aws_secret_access_key=aws_secret_access_key, -# aws_role_name=aws_role_name, -# aws_session_name="my-test-session", -# ) -# # Add any assertions here to check the response -# print(response) -# except RateLimitError: -# pass -# except Exception as e: -# pytest.fail(f"Error occurred: {e}") +# test_completion_bedrock_claude_external_client_auth() -# # test_completion_bedrock_claude_sts_client_auth() +@pytest.mark.skip(reason="Expired token, need to renew") +def test_completion_bedrock_claude_sts_client_auth(): + print("\ncalling bedrock claude external client auth") + import os + + aws_access_key_id = os.environ["AWS_TEMP_ACCESS_KEY_ID"] + aws_secret_access_key = os.environ["AWS_TEMP_SECRET_ACCESS_KEY"] + aws_region_name = os.environ["AWS_REGION_NAME"] + aws_role_name = os.environ["AWS_TEMP_ROLE_NAME"] + + try: + import boto3 + + litellm.set_verbose = True + + response = completion( + model="bedrock/anthropic.claude-instant-v1", + messages=messages, + max_tokens=10, + temperature=0.1, + aws_region_name=aws_region_name, + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + aws_role_name=aws_role_name, + aws_session_name="my-test-session", + ) + + response = embedding( + model="cohere.embed-multilingual-v3", + input=["hello world"], + aws_region_name="us-east-1", + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + aws_role_name=aws_role_name, + aws_session_name="my-test-session", + ) + + response = completion( + model="gpt-3.5-turbo", + messages=messages, + aws_region_name="us-east-1", + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + aws_role_name=aws_role_name, + aws_session_name="my-test-session", + ) + # Add any assertions here to check the response + print(response) + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") -# def test_provisioned_throughput(): -# try: -# litellm.set_verbose = True -# import botocore, json, io -# import botocore.session -# from botocore.stub import Stubber - -# bedrock_client = botocore.session.get_session().create_client( -# "bedrock-runtime", region_name="us-east-1" -# ) - -# expected_params = { -# "accept": "application/json", -# "body": '{"prompt": "\\n\\nHuman: Hello, how are you?\\n\\nAssistant: ", ' -# '"max_tokens_to_sample": 256}', -# "contentType": "application/json", -# "modelId": "provisioned-model-arn", -# } -# response_from_bedrock = { -# "body": io.StringIO( -# json.dumps( -# { -# "completion": " Here is a short poem about the sky:", -# "stop_reason": "max_tokens", -# "stop": None, -# } -# ) -# ), -# "contentType": "contentType", -# "ResponseMetadata": {"HTTPStatusCode": 200}, -# } - -# with Stubber(bedrock_client) as stubber: -# stubber.add_response( -# "invoke_model", -# service_response=response_from_bedrock, -# expected_params=expected_params, -# ) -# response = litellm.completion( -# model="bedrock/anthropic.claude-instant-v1", -# model_id="provisioned-model-arn", -# messages=[{"content": "Hello, how are you?", "role": "user"}], -# aws_bedrock_client=bedrock_client, -# ) -# print("response stubbed", response) -# except Exception as e: -# pytest.fail(f"Error occurred: {e}") +# test_completion_bedrock_claude_sts_client_auth() -# # test_provisioned_throughput() +def test_bedrock_claude_3(): + try: + litellm.set_verbose = True + response: ModelResponse = completion( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + messages=messages, + max_tokens=10, + ) + # Add any assertions here to check the response + assert len(response.choices) > 0 + assert len(response.choices[0].message.content) > 0 + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") -# def test_completion_bedrock_mistral_completion_auth(): -# print("calling bedrock mistral completion params auth") -# import os -# -# # aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] -# # aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] -# # aws_region_name = os.environ["AWS_REGION_NAME"] -# -# # os.environ.pop("AWS_ACCESS_KEY_ID", None) -# # os.environ.pop("AWS_SECRET_ACCESS_KEY", None) -# # os.environ.pop("AWS_REGION_NAME", None) -# try: -# response:ModelResponse = completion( -# model="bedrock/mistral.mistral-7b-instruct-v0:2", -# messages=messages, -# max_tokens=10, -# temperature=0.1, -# ) -# # Add any assertions here to check the response -# assert len(response.choices) > 0 -# assert len(response.choices[0].message.content) > 0 -# -# # os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id -# # os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key -# # os.environ["AWS_REGION_NAME"] = aws_region_name -# except RateLimitError: -# pass -# except Exception as e: -# pytest.fail(f"Error occurred: {e}") -# -# -# test_completion_bedrock_mistral_completion_auth() \ No newline at end of file +def test_provisioned_throughput(): + try: + litellm.set_verbose = True + import botocore, json, io + import botocore.session + from botocore.stub import Stubber + + bedrock_client = botocore.session.get_session().create_client( + "bedrock-runtime", region_name="us-east-1" + ) + + expected_params = { + "accept": "application/json", + "body": '{"prompt": "\\n\\nHuman: Hello, how are you?\\n\\nAssistant: ", ' + '"max_tokens_to_sample": 256}', + "contentType": "application/json", + "modelId": "provisioned-model-arn", + } + response_from_bedrock = { + "body": io.StringIO( + json.dumps( + { + "completion": " Here is a short poem about the sky:", + "stop_reason": "max_tokens", + "stop": None, + } + ) + ), + "contentType": "contentType", + "ResponseMetadata": {"HTTPStatusCode": 200}, + } + + with Stubber(bedrock_client) as stubber: + stubber.add_response( + "invoke_model", + service_response=response_from_bedrock, + expected_params=expected_params, + ) + response = litellm.completion( + model="bedrock/anthropic.claude-instant-v1", + model_id="provisioned-model-arn", + messages=[{"content": "Hello, how are you?", "role": "user"}], + aws_bedrock_client=bedrock_client, + ) + print("response stubbed", response) + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +# test_provisioned_throughput() + + +def test_completion_bedrock_mistral_completion_auth(): + print("calling bedrock mistral completion params auth") + import os + + # aws_access_key_id = os.environ["AWS_ACCESS_KEY_ID"] + # aws_secret_access_key = os.environ["AWS_SECRET_ACCESS_KEY"] + # aws_region_name = os.environ["AWS_REGION_NAME"] + + # os.environ.pop("AWS_ACCESS_KEY_ID", None) + # os.environ.pop("AWS_SECRET_ACCESS_KEY", None) + # os.environ.pop("AWS_REGION_NAME", None) + try: + response: ModelResponse = completion( + model="bedrock/mistral.mistral-7b-instruct-v0:2", + messages=messages, + max_tokens=10, + temperature=0.1, + ) + # Add any assertions here to check the response + assert len(response.choices) > 0 + assert len(response.choices[0].message.content) > 0 + + # os.environ["AWS_ACCESS_KEY_ID"] = aws_access_key_id + # os.environ["AWS_SECRET_ACCESS_KEY"] = aws_secret_access_key + # os.environ["AWS_REGION_NAME"] = aws_region_name + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +# test_completion_bedrock_mistral_completion_auth() diff --git a/litellm/tests/test_caching.py b/litellm/tests/test_caching.py index 3a7f969e5..f649bff02 100644 --- a/litellm/tests/test_caching.py +++ b/litellm/tests/test_caching.py @@ -546,7 +546,6 @@ def test_redis_cache_acompletion_stream(): # test_redis_cache_acompletion_stream() -@pytest.mark.skip(reason="AWS Suspended Account") def test_redis_cache_acompletion_stream_bedrock(): import asyncio diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 1677e04cf..36ca7b8b0 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1648,7 +1648,6 @@ def test_completion_chat_sagemaker_mistral(): # test_completion_chat_sagemaker_mistral() -@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_titan_null_response(): try: response = completion( @@ -1674,7 +1673,6 @@ def test_completion_bedrock_titan_null_response(): pytest.fail(f"An error occurred - {str(e)}") -@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_titan(): try: response = completion( @@ -1696,7 +1694,6 @@ def test_completion_bedrock_titan(): # test_completion_bedrock_titan() -@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_claude(): print("calling claude") try: @@ -1718,7 +1715,6 @@ def test_completion_bedrock_claude(): # test_completion_bedrock_claude() -@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_cohere(): print("calling bedrock cohere") litellm.set_verbose = True diff --git a/litellm/tests/test_completion_cost.py b/litellm/tests/test_completion_cost.py index 034048c63..947da7166 100644 --- a/litellm/tests/test_completion_cost.py +++ b/litellm/tests/test_completion_cost.py @@ -171,7 +171,6 @@ def test_cost_openai_image_gen(): assert cost == 0.019922944 -@pytest.mark.skip(reason="AWS Suspended Account") def test_cost_bedrock_pricing(): """ - get pricing specific to region for a model diff --git a/litellm/tests/test_custom_callback_input.py b/litellm/tests/test_custom_callback_input.py index 683173b21..924933319 100644 --- a/litellm/tests/test_custom_callback_input.py +++ b/litellm/tests/test_custom_callback_input.py @@ -478,7 +478,6 @@ async def test_async_chat_azure_stream(): ## Test Bedrock + sync -@pytest.mark.skip(reason="AWS Suspended Account") def test_chat_bedrock_stream(): try: customHandler = CompletionCustomHandler() @@ -519,7 +518,6 @@ def test_chat_bedrock_stream(): ## Test Bedrock + Async -@pytest.mark.skip(reason="AWS Suspended Account") @pytest.mark.asyncio async def test_async_chat_bedrock_stream(): try: @@ -796,7 +794,6 @@ async def test_async_embedding_azure(): ## Test Bedrock + Async -@pytest.mark.skip(reason="AWS Suspended Account") @pytest.mark.asyncio async def test_async_embedding_bedrock(): try: diff --git a/litellm/tests/test_embedding.py b/litellm/tests/test_embedding.py index 2c9de496c..a2f71eb98 100644 --- a/litellm/tests/test_embedding.py +++ b/litellm/tests/test_embedding.py @@ -256,7 +256,6 @@ async def test_vertexai_aembedding(): pytest.fail(f"Error occurred: {e}") -@pytest.mark.skip(reason="AWS Suspended Account") def test_bedrock_embedding_titan(): try: # this tests if we support str input for bedrock embedding @@ -302,7 +301,6 @@ def test_bedrock_embedding_titan(): # test_bedrock_embedding_titan() -@pytest.mark.skip(reason="AWS Suspended Account") def test_bedrock_embedding_cohere(): try: litellm.set_verbose = False diff --git a/litellm/tests/test_image_generation.py b/litellm/tests/test_image_generation.py index 0672319a2..59ccaacd8 100644 --- a/litellm/tests/test_image_generation.py +++ b/litellm/tests/test_image_generation.py @@ -121,7 +121,6 @@ async def test_async_image_generation_azure(): pytest.fail(f"An exception occurred - {str(e)}") -@pytest.mark.skip(reason="AWS Suspended Account") def test_image_generation_bedrock(): try: litellm.set_verbose = True @@ -142,7 +141,6 @@ def test_image_generation_bedrock(): pytest.fail(f"An exception occurred - {str(e)}") -@pytest.mark.skip(reason="AWS Suspended Account") @pytest.mark.asyncio async def test_aimage_generation_bedrock_with_optional_params(): try: diff --git a/litellm/tests/test_provider_specific_config.py b/litellm/tests/test_provider_specific_config.py index dcb4dcb4c..08a84b560 100644 --- a/litellm/tests/test_provider_specific_config.py +++ b/litellm/tests/test_provider_specific_config.py @@ -515,7 +515,6 @@ def sagemaker_test_completion(): # Bedrock -@pytest.mark.skip(reason="AWS Suspended Account") def bedrock_test_completion(): litellm.AmazonCohereConfig(max_tokens=10) # litellm.set_verbose=True diff --git a/litellm/tests/test_proxy_server.py b/litellm/tests/test_proxy_server.py index 3db4a980a..d5e8f09c6 100644 --- a/litellm/tests/test_proxy_server.py +++ b/litellm/tests/test_proxy_server.py @@ -125,7 +125,6 @@ def test_embedding(client_no_auth): pytest.fail(f"LiteLLM Proxy test failed. Exception - {str(e)}") -@pytest.mark.skip(reason="AWS Suspended Account") def test_bedrock_embedding(client_no_auth): global headers from litellm.proxy.proxy_server import user_custom_auth diff --git a/litellm/tests/test_router.py b/litellm/tests/test_router.py index 7c182ee68..dc2076aa3 100644 --- a/litellm/tests/test_router.py +++ b/litellm/tests/test_router.py @@ -575,7 +575,6 @@ def test_azure_embedding_on_router(): # test_azure_embedding_on_router() -@pytest.mark.skip(reason="AWS Suspended Account") def test_bedrock_on_router(): litellm.set_verbose = True print("\n Testing bedrock on router\n") diff --git a/litellm/tests/test_router_timeout.py b/litellm/tests/test_router_timeout.py index 3816c649e..dff30113b 100644 --- a/litellm/tests/test_router_timeout.py +++ b/litellm/tests/test_router_timeout.py @@ -87,7 +87,6 @@ def test_router_timeouts(): print("********** TOKENS USED SO FAR = ", total_tokens_used) -@pytest.mark.skip(reason="AWS Suspended Account") @pytest.mark.asyncio async def test_router_timeouts_bedrock(): import openai diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py index 5767a944b..679413f3e 100644 --- a/litellm/tests/test_streaming.py +++ b/litellm/tests/test_streaming.py @@ -764,7 +764,6 @@ def test_completion_replicate_stream_bad_key(): # test_completion_replicate_stream_bad_key() -@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_claude_stream(): try: litellm.set_verbose = False @@ -811,7 +810,6 @@ def test_completion_bedrock_claude_stream(): # test_completion_bedrock_claude_stream() -@pytest.mark.skip(reason="AWS Suspended Account") def test_completion_bedrock_ai21_stream(): try: litellm.set_verbose = False diff --git a/litellm/utils.py b/litellm/utils.py index 1aa1d3767..8393ea64c 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4513,20 +4513,24 @@ def get_optional_params( if stream: optional_params["stream"] = stream elif "anthropic" in model: - supported_params = ["max_tokens", "temperature", "stop", "top_p", "stream"] + supported_params = get_mapped_model_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # anthropic params on bedrock # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" - if max_tokens is not None: - optional_params["max_tokens_to_sample"] = max_tokens - if temperature is not None: - optional_params["temperature"] = temperature - if top_p is not None: - optional_params["top_p"] = top_p - if stop is not None: - optional_params["stop_sequences"] = stop - if stream: - optional_params["stream"] = stream + if model.startswith("anthropic.claude-3"): + optional_params = ( + litellm.AmazonAnthropicClaude3Config.map_openai_params( + non_default_params=non_default_params, + optional_params=optional_params, + ) + ) + else: + optional_params = litellm.AmazonAnthropicConfig.map_openai_params( + non_default_params=non_default_params, + optional_params=optional_params, + ) elif "amazon" in model: # amazon titan llms supported_params = ["max_tokens", "temperature", "stop", "top_p", "stream"] _check_valid_arg(supported_params=supported_params) @@ -4991,6 +4995,17 @@ def get_optional_params( return optional_params +def get_mapped_model_params(model: str, custom_llm_provider: str): + """ + Returns the supported openai params for a given model + provider + """ + if custom_llm_provider == "bedrock": + if model.startswith("anthropic.claude-3"): + return litellm.AmazonAnthropicClaude3Config().get_supported_openai_params() + else: + return litellm.AmazonAnthropicConfig().get_supported_openai_params() + + def get_llm_provider( model: str, custom_llm_provider: Optional[str] = None, From 71c98d320087f1ce99ae0d31f9f4ab2c1ee953a4 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 17:23:28 -0800 Subject: [PATCH 112/304] =?UTF-8?q?bump:=20version=201.28.14=20=E2=86=92?= =?UTF-8?q?=201.29.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 78d4b5cea..35e628ec8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.28.14" +version = "1.29.0" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.28.14" +version = "1.29.0" version_files = [ "pyproject.toml:^version" ] From 818c29516d5778a395d2ac11b3412c4f841e78a3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 17:47:28 -0800 Subject: [PATCH 113/304] fix(bedrock.py): support bedrock anthropic claude 3 tool calling --- litellm/tests/log.txt | 118 +++++++++++++++++++++++ litellm/tests/test_bedrock_completion.py | 47 +++++++++ 2 files changed, 165 insertions(+) create mode 100644 litellm/tests/log.txt diff --git a/litellm/tests/log.txt b/litellm/tests/log.txt new file mode 100644 index 000000000..f9a0840ab --- /dev/null +++ b/litellm/tests/log.txt @@ -0,0 +1,118 @@ +============================= test session starts ============================== +platform darwin -- Python 3.11.6, pytest-7.3.1, pluggy-1.3.0 +rootdir: /Users/krrishdholakia/Documents/litellm/litellm/tests +plugins: timeout-2.2.0, asyncio-0.23.2, anyio-3.7.1, xdist-3.3.1 +asyncio: mode=Mode.STRICT +collected 1 item + +test_bedrock_completion.py . [100%] + +=============================== warnings summary =============================== +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 + /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271: PydanticDeprecatedSince20: Support for class-based `config` is deprecated, use ConfigDict instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + warnings.warn(DEPRECATION_MESSAGE, DeprecationWarning) + +../proxy/_types.py:99 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:99: PydanticDeprecatedSince20: `pydantic.config.Extra` is deprecated, use literal values instead (e.g. `extra='allow'`). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + extra = Extra.allow # Allow extra fields + +../proxy/_types.py:102 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:102: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:131 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:131: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:177 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:177: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:232 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:232: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:244 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:244: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:279 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:279: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:305 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:305: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149 + /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149: UserWarning: Field "model_max_budget" has conflict with protected namespace "model_". + + You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`. + warnings.warn( + +../proxy/_types.py:553 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:553: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:574 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:574: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../utils.py:36 + /Users/krrishdholakia/Documents/litellm/litellm/utils.py:36: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html + import pkg_resources + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: 10 warnings + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.cloud')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(parent) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.logging')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.iam')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('mpl_toolkits')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('sphinxcontrib')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../llms/prompt_templates/factory.py:6 + /Users/krrishdholakia/Documents/litellm/litellm/llms/prompt_templates/factory.py:6: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 + import imghdr, base64 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 1 passed, 43 warnings in 3.12s ======================== diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index 684381508..356bdba4c 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -224,6 +224,53 @@ def test_bedrock_claude_3(): pytest.fail(f"Error occurred: {e}") +def test_bedrock_claude_3_tool_calling(): + try: + litellm.set_verbose = True + tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": { + "type": "string", + "enum": ["celsius", "fahrenheit"], + }, + }, + "required": ["location"], + }, + }, + } + ] + messages = [ + {"role": "user", "content": "What's the weather like in Boston today?"} + ] + response: ModelResponse = completion( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + messages=messages, + tools=tools, + tool_choice="auto", + ) + print(f"response: {response}") + # Add any assertions here to check the response + assert isinstance(response.choices[0].message.tool_calls[0].function.name, str) + assert isinstance( + response.choices[0].message.tool_calls[0].function.arguments, str + ) + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + def test_provisioned_throughput(): try: litellm.set_verbose = True From caa17d484a9b9e5f27f04a025baa700197bdf3fb Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 18:12:47 -0800 Subject: [PATCH 114/304] fix(bedrock.py): working image calls to claude 3 --- litellm/llms/bedrock.py | 83 ++++++++++++++++++------ litellm/tests/test_bedrock_completion.py | 44 +++++++++++++ litellm/utils.py | 9 ++- 3 files changed, 114 insertions(+), 22 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index a2d8accdf..983fe0ec0 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -1,7 +1,7 @@ import json, copy, types import os from enum import Enum -import time +import time, uuid from typing import Callable, Optional, Any, Union, List import litellm from litellm.utils import ModelResponse, get_secret, Usage, ImageResponse @@ -118,12 +118,14 @@ class AmazonAnthropicClaude3Config: } def get_supported_openai_params(self): - return ["max_tokens"] + return ["max_tokens", "tools", "tool_choice", "stream"] def map_openai_params(self, non_default_params: dict, optional_params: dict): for param, value in non_default_params.items(): if param == "max_tokens": optional_params["max_tokens"] = value + if param == "tools": + optional_params["tools"] = value return optional_params @@ -897,7 +899,37 @@ def completion( elif provider == "anthropic": if model.startswith("anthropic.claude-3"): outputText = response_body.get("content")[0].get("text", None) + if "" in outputText: # OUTPUT PARSE FUNCTION CALL + function_name = extract_between_tags("tool_name", outputText)[0] + function_arguments_str = extract_between_tags("invoke", outputText)[ + 0 + ].strip() + function_arguments_str = ( + f"{function_arguments_str}" + ) + function_arguments = parse_xml_params(function_arguments_str) + _message = litellm.Message( + tool_calls=[ + { + "id": f"call_{uuid.uuid4()}", + "type": "function", + "function": { + "name": function_name, + "arguments": json.dumps(function_arguments), + }, + } + ], + content=None, + ) + model_response.choices[0].message = _message # type: ignore model_response["finish_reason"] = response_body["stop_reason"] + _usage = litellm.Usage( + prompt_tokens=response_body["usage"]["input_tokens"], + completion_tokens=response_body["usage"]["output_tokens"], + total_tokens=response_body["usage"]["input_tokens"] + + response_body["usage"]["output_tokens"], + ) + model_response.usage = _usage else: outputText = response_body["completion"] model_response["finish_reason"] = response_body["stop_reason"] @@ -919,8 +951,17 @@ def completion( ) else: try: - if len(outputText) > 0: + if ( + len(outputText) > 0 + and hasattr(model_response.choices[0], "message") + and model_response.choices[0].message.tool_calls is None + ): model_response["choices"][0]["message"]["content"] = outputText + elif ( + hasattr(model_response.choices[0], "message") + and model_response.choices[0].message.tool_calls is not None + ): + pass else: raise Exception() except: @@ -930,26 +971,28 @@ def completion( ) ## CALCULATING USAGE - baseten charges on time, not tokens - have some mapping of cost here. - prompt_tokens = response_metadata.get( - "x-amzn-bedrock-input-token-count", len(encoding.encode(prompt)) - ) - completion_tokens = response_metadata.get( - "x-amzn-bedrock-output-token-count", - len( - encoding.encode( - model_response["choices"][0]["message"].get("content", "") - ) - ), - ) + if getattr(model_response.usage, "total_tokens", None) is None: + prompt_tokens = response_metadata.get( + "x-amzn-bedrock-input-token-count", len(encoding.encode(prompt)) + ) + completion_tokens = response_metadata.get( + "x-amzn-bedrock-output-token-count", + len( + encoding.encode( + model_response["choices"][0]["message"].get("content", "") + ) + ), + ) + usage = Usage( + prompt_tokens=prompt_tokens, + completion_tokens=completion_tokens, + total_tokens=prompt_tokens + completion_tokens, + ) + model_response.usage = usage model_response["created"] = int(time.time()) model_response["model"] = model - usage = Usage( - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - total_tokens=prompt_tokens + completion_tokens, - ) - model_response.usage = usage + model_response._hidden_params["region_name"] = client.meta.region_name print_verbose(f"model_response._hidden_params: {model_response._hidden_params}") return model_response diff --git a/litellm/tests/test_bedrock_completion.py b/litellm/tests/test_bedrock_completion.py index 356bdba4c..8284b0515 100644 --- a/litellm/tests/test_bedrock_completion.py +++ b/litellm/tests/test_bedrock_completion.py @@ -271,6 +271,50 @@ def test_bedrock_claude_3_tool_calling(): pytest.fail(f"Error occurred: {e}") +def encode_image(image_path): + import base64 + + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") + + +@pytest.mark.skip( + reason="we already test claude-3, this is just another way to pass images" +) +def test_completion_claude_3_base64(): + try: + litellm.set_verbose = True + litellm.num_retries = 3 + image_path = "../proxy/cached_logo.jpg" + # Getting the base64 string + base64_image = encode_image(image_path) + resp = litellm.completion( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + messages=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "Whats in this image?"}, + { + "type": "image_url", + "image_url": { + "url": "data:image/jpeg;base64," + base64_image + }, + }, + ], + } + ], + ) + + prompt_tokens = resp.usage.prompt_tokens + raise Exception("it worked!") + except Exception as e: + if "500 Internal error encountered.'" in str(e): + pass + else: + pytest.fail(f"An exception occurred - {str(e)}") + + def test_provisioned_throughput(): try: litellm.set_verbose = True diff --git a/litellm/utils.py b/litellm/utils.py index 8393ea64c..684b8c6a6 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -245,10 +245,14 @@ class Message(OpenAIObject): self.role = role if function_call is not None: self.function_call = FunctionCall(**function_call) + else: + self.function_call = function_call if tool_calls is not None: self.tool_calls = [] for tool_call in tool_calls: self.tool_calls.append(ChatCompletionMessageToolCall(**tool_call)) + else: + self.tool_calls = tool_calls if logprobs is not None: self._logprobs = logprobs @@ -4111,6 +4115,7 @@ def get_optional_params( and custom_llm_provider != "together_ai" and custom_llm_provider != "mistral" and custom_llm_provider != "anthropic" + and custom_llm_provider != "bedrock" ): if custom_llm_provider == "ollama" or custom_llm_provider == "ollama_chat": # ollama actually supports json output @@ -4521,13 +4526,13 @@ def get_optional_params( # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" if model.startswith("anthropic.claude-3"): optional_params = ( - litellm.AmazonAnthropicClaude3Config.map_openai_params( + litellm.AmazonAnthropicClaude3Config().map_openai_params( non_default_params=non_default_params, optional_params=optional_params, ) ) else: - optional_params = litellm.AmazonAnthropicConfig.map_openai_params( + optional_params = litellm.AmazonAnthropicConfig().map_openai_params( non_default_params=non_default_params, optional_params=optional_params, ) From 3303236305235b29a6f0783a3f49e0dc67f7dcca Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 18:28:05 -0800 Subject: [PATCH 115/304] test(test_proxy_server.py): add back bedrock embedding tests --- litellm/proxy/proxy_cli.py | 2 + litellm/tests/log.txt | 118 ------------------ .../test_configs/test_config_no_auth.yaml | 11 +- 3 files changed, 12 insertions(+), 119 deletions(-) diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index f6034cba3..f7eba02ec 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -19,6 +19,8 @@ telemetry = None def append_query_params(url, params): + print(f"url: {url}") + print(f"params: {params}") parsed_url = urlparse.urlparse(url) parsed_query = urlparse.parse_qs(parsed_url.query) parsed_query.update(params) diff --git a/litellm/tests/log.txt b/litellm/tests/log.txt index f9a0840ab..e69de29bb 100644 --- a/litellm/tests/log.txt +++ b/litellm/tests/log.txt @@ -1,118 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.11.6, pytest-7.3.1, pluggy-1.3.0 -rootdir: /Users/krrishdholakia/Documents/litellm/litellm/tests -plugins: timeout-2.2.0, asyncio-0.23.2, anyio-3.7.1, xdist-3.3.1 -asyncio: mode=Mode.STRICT -collected 1 item - -test_bedrock_completion.py . [100%] - -=============================== warnings summary =============================== -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 - /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271: PydanticDeprecatedSince20: Support for class-based `config` is deprecated, use ConfigDict instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - warnings.warn(DEPRECATION_MESSAGE, DeprecationWarning) - -../proxy/_types.py:99 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:99: PydanticDeprecatedSince20: `pydantic.config.Extra` is deprecated, use literal values instead (e.g. `extra='allow'`). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - extra = Extra.allow # Allow extra fields - -../proxy/_types.py:102 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:102: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:131 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:131: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:177 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:177: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:232 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:232: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:244 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:244: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:279 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:279: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:305 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:305: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149 - /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149: UserWarning: Field "model_max_budget" has conflict with protected namespace "model_". - - You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`. - warnings.warn( - -../proxy/_types.py:553 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:553: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../proxy/_types.py:574 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:574: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ - @root_validator(pre=True) - -../utils.py:36 - /Users/krrishdholakia/Documents/litellm/litellm/utils.py:36: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html - import pkg_resources - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: 10 warnings - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(pkg) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.cloud')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(pkg) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(parent) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.logging')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(pkg) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.iam')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(pkg) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('mpl_toolkits')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(pkg) - -../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 - /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('sphinxcontrib')`. - Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages - declare_namespace(pkg) - -../llms/prompt_templates/factory.py:6 - /Users/krrishdholakia/Documents/litellm/litellm/llms/prompt_templates/factory.py:6: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 - import imghdr, base64 - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 1 passed, 43 warnings in 3.12s ======================== diff --git a/litellm/tests/test_configs/test_config_no_auth.yaml b/litellm/tests/test_configs/test_config_no_auth.yaml index 9cc32bb0b..1c5ddf226 100644 --- a/litellm/tests/test_configs/test_config_no_auth.yaml +++ b/litellm/tests/test_configs/test_config_no_auth.yaml @@ -115,4 +115,13 @@ model_list: model_info: description: this is a test openai model id: 34cb2419-7c63-44ae-a189-53f1d1ce5953 - model_name: test_openai_models \ No newline at end of file + model_name: test_openai_models +- litellm_params: + model: amazon.titan-embed-text-v1 + model_name: amazon-embeddings +- litellm_params: + model: gpt-3.5-turbo + model_info: + description: this is a test openai model + id: 753dca9a-898d-4ff7-9961-5acf7cdf38cf + model_name: test_openai_models From 18947f8c856b501ed69104820ed57a2bfa786ed0 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 18:31:18 -0800 Subject: [PATCH 116/304] test(test_add_function_to_prompt.py): skip as anthropic now supports tool calling --- litellm/llms/anthropic.py | 2 +- litellm/tests/test_add_function_to_prompt.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 047616cfe..5e0887901 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -227,7 +227,7 @@ def completion( else: text_content = completion_response["content"][0].get("text", None) ## TOOL CALLING - OUTPUT PARSE - if _is_function_call == True: + if text_content is not None and "invoke" in text_content: function_name = extract_between_tags("tool_name", text_content)[0] function_arguments_str = extract_between_tags("invoke", text_content)[ 0 diff --git a/litellm/tests/test_add_function_to_prompt.py b/litellm/tests/test_add_function_to_prompt.py index 93b09cd8c..d703ce849 100644 --- a/litellm/tests/test_add_function_to_prompt.py +++ b/litellm/tests/test_add_function_to_prompt.py @@ -41,10 +41,11 @@ def test_function_call_non_openai_model(): pass -test_function_call_non_openai_model() +# test_function_call_non_openai_model() ## case 2: add_function_to_prompt set +@pytest.mark.skip(reason="Anthropic now supports tool calling") def test_function_call_non_openai_model_litellm_mod_set(): litellm.add_function_to_prompt = True litellm.set_verbose = True From d0991003ec8fea9d2aa53eb4555f2813b277ba56 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 18:42:08 -0800 Subject: [PATCH 117/304] test: update tests --- litellm/tests/test_add_function_to_prompt.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litellm/tests/test_add_function_to_prompt.py b/litellm/tests/test_add_function_to_prompt.py index 93b09cd8c..d703ce849 100644 --- a/litellm/tests/test_add_function_to_prompt.py +++ b/litellm/tests/test_add_function_to_prompt.py @@ -41,10 +41,11 @@ def test_function_call_non_openai_model(): pass -test_function_call_non_openai_model() +# test_function_call_non_openai_model() ## case 2: add_function_to_prompt set +@pytest.mark.skip(reason="Anthropic now supports tool calling") def test_function_call_non_openai_model_litellm_mod_set(): litellm.add_function_to_prompt = True litellm.set_verbose = True From b2eef616799ed4195c102d5ef90621375005c20b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 20:46:21 -0800 Subject: [PATCH 118/304] fix(test_streaming.py): skip flaky test --- litellm/tests/test_streaming.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py index 679413f3e..adf93b4cc 100644 --- a/litellm/tests/test_streaming.py +++ b/litellm/tests/test_streaming.py @@ -1058,6 +1058,7 @@ def ai21_completion_call_bad_key(): # ai21_completion_call_bad_key() +@pytest.mark.skip(reason="flaky test") @pytest.mark.asyncio async def test_hf_completion_tgi_stream(): try: From 8d66d813c1051d5cc640547af9f763f88d78bd32 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:16:21 -0800 Subject: [PATCH 119/304] fix(huggingface_restapi.py): fix hf streaming issue --- litellm/llms/huggingface_restapi.py | 42 +++++++++++------------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/litellm/llms/huggingface_restapi.py b/litellm/llms/huggingface_restapi.py index 61a6ac040..293773289 100644 --- a/litellm/llms/huggingface_restapi.py +++ b/litellm/llms/huggingface_restapi.py @@ -658,36 +658,26 @@ class Huggingface(BaseLLM): message=first_chunk, ) - return self.async_streaming_generator( - first_chunk=first_chunk, - response_iterator=response_iterator, + # Create a new async generator that begins with the first_chunk and includes the remaining items + async def custom_stream_with_first_chunk(): + yield first_chunk # Yield back the first chunk + async for ( + chunk + ) in response_iterator: # Continue yielding the rest of the chunks + yield chunk + + # Creating a new completion stream that starts with the first chunk + completion_stream = custom_stream_with_first_chunk() + + streamwrapper = CustomStreamWrapper( + completion_stream=completion_stream, model=model, + custom_llm_provider="huggingface", logging_obj=logging_obj, ) - async def async_streaming_generator( - self, first_chunk, response_iterator, model, logging_obj - ): - # Create a new async generator that begins with the first_chunk and includes the remaining items - async def custom_stream_with_first_chunk(): - yield first_chunk # Yield back the first chunk - async for ( - chunk - ) in response_iterator: # Continue yielding the rest of the chunks - yield chunk - - # Creating a new completion stream that starts with the first chunk - completion_stream = custom_stream_with_first_chunk() - - streamwrapper = CustomStreamWrapper( - completion_stream=completion_stream, - model=model, - custom_llm_provider="huggingface", - logging_obj=logging_obj, - ) - - async for transformed_chunk in streamwrapper: - yield transformed_chunk + async for transformed_chunk in streamwrapper: + yield transformed_chunk def embedding( self, From ec37025e4f36a8872d6551598d0cc73ac7fdb84c Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 21:17:53 -0800 Subject: [PATCH 120/304] =?UTF-8?q?bump:=20version=201.29.0=20=E2=86=92=20?= =?UTF-8?q?1.29.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 35e628ec8..905753471 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.0" +version = "1.29.1" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.0" +version = "1.29.1" version_files = [ "pyproject.toml:^version" ] From 0f62213656ea775dc3d1f3165fe6055ab2756a0a Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:19:03 -0800 Subject: [PATCH 121/304] fix(utils.py): fix default message object values --- litellm/llms/bedrock.py | 1 + litellm/utils.py | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 983fe0ec0..37084e62b 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -959,6 +959,7 @@ def completion( model_response["choices"][0]["message"]["content"] = outputText elif ( hasattr(model_response.choices[0], "message") + and hasattr(model_response.choices[0].message, "tool_calls") and model_response.choices[0].message.tool_calls is not None ): pass diff --git a/litellm/utils.py b/litellm/utils.py index 684b8c6a6..e42ab836c 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -245,14 +245,12 @@ class Message(OpenAIObject): self.role = role if function_call is not None: self.function_call = FunctionCall(**function_call) - else: - self.function_call = function_call + if tool_calls is not None: self.tool_calls = [] for tool_call in tool_calls: self.tool_calls.append(ChatCompletionMessageToolCall(**tool_call)) - else: - self.tool_calls = tool_calls + if logprobs is not None: self._logprobs = logprobs From f277b204a324a81cbf20bcffb750aa0655dc1820 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:22:09 -0800 Subject: [PATCH 122/304] fix(init.py): expose 'get_model_params' function --- litellm/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/__init__.py b/litellm/__init__.py index bdef46086..c64dc0ea8 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -570,6 +570,7 @@ from .utils import ( _calculate_retry_after, _should_retry, get_secret, + get_mapped_model_params, ) from .llms.huggingface_restapi import HuggingfaceConfig from .llms.anthropic import AnthropicConfig From 5cb854720fa0b3448a573bf6722d2fe41299e4dd Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:27:01 -0800 Subject: [PATCH 123/304] test(test_completion.py): fix claude test --- litellm/llms/anthropic_text.py | 6 ++---- litellm/tests/test_completion.py | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/litellm/llms/anthropic_text.py b/litellm/llms/anthropic_text.py index bccc8c769..e9d504d36 100644 --- a/litellm/llms/anthropic_text.py +++ b/litellm/llms/anthropic_text.py @@ -35,9 +35,7 @@ class AnthropicTextConfig: to pass metadata to anthropic, it's {"user_id": "any-relevant-information"} """ - max_tokens_to_sample: Optional[int] = ( - litellm.max_tokens - ) # anthropic requires a default + max_tokens: Optional[int] = litellm.max_tokens # anthropic requires a default stop_sequences: Optional[list] = None temperature: Optional[int] = None top_p: Optional[int] = None @@ -46,7 +44,7 @@ class AnthropicTextConfig: def __init__( self, - max_tokens_to_sample: Optional[int] = 256, # anthropic requires a default + max_tokens: Optional[int] = 256, # anthropic requires a default stop_sequences: Optional[list] = None, temperature: Optional[int] = None, top_p: Optional[int] = None, diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index dd605d8ee..c93c816ce 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -56,7 +56,7 @@ def test_completion_custom_provider_model_name(): def test_completion_claude(): litellm.set_verbose = True litellm.cache = None - litellm.AnthropicTextConfig(max_tokens_to_sample=200, metadata={"user_id": "1224"}) + litellm.AnthropicTextConfig(max_tokens=200, metadata={"user_id": "1224"}) messages = [ { "role": "system", @@ -67,7 +67,7 @@ def test_completion_claude(): try: # test without max tokens response = completion( - model="claude-instant-1", + model="claude-instant-1.2", messages=messages, request_timeout=10, max_tokens=10, From 9069bfb645594ea78eeffbc689d5c86c37d45da9 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:27:48 -0800 Subject: [PATCH 124/304] test(test_completion.py): fix claude test --- litellm/tests/test_completion.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 36ca7b8b0..b61a865d2 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -56,7 +56,7 @@ def test_completion_custom_provider_model_name(): def test_completion_claude(): litellm.set_verbose = True litellm.cache = None - litellm.AnthropicConfig(max_tokens=200, metadata={"user_id": "1224"}) + litellm.AnthropicTextConfig(max_tokens=200, metadata={"user_id": "1224"}) messages = [ { "role": "system", @@ -70,6 +70,7 @@ def test_completion_claude(): model="claude-instant-1.2", messages=messages, request_timeout=10, + max_tokens=10, ) # Add any assertions, here to check response args print(response) From 65e9348d4eccf68fb167175a145c1fecdaf79ef8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:32:12 -0800 Subject: [PATCH 125/304] fix(bedrock.py): minor fixes --- litellm/tests/log.txt | 118 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/litellm/tests/log.txt b/litellm/tests/log.txt index e69de29bb..7b53823b0 100644 --- a/litellm/tests/log.txt +++ b/litellm/tests/log.txt @@ -0,0 +1,118 @@ +============================= test session starts ============================== +platform darwin -- Python 3.11.6, pytest-7.3.1, pluggy-1.3.0 +rootdir: /Users/krrishdholakia/Documents/litellm/litellm/tests +plugins: timeout-2.2.0, asyncio-0.23.2, anyio-3.7.1, xdist-3.3.1 +asyncio: mode=Mode.STRICT +collected 1 item + +test_custom_callback_input.py . [100%] + +=============================== warnings summary =============================== +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 + /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271: PydanticDeprecatedSince20: Support for class-based `config` is deprecated, use ConfigDict instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + warnings.warn(DEPRECATION_MESSAGE, DeprecationWarning) + +../proxy/_types.py:99 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:99: PydanticDeprecatedSince20: `pydantic.config.Extra` is deprecated, use literal values instead (e.g. `extra='allow'`). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + extra = Extra.allow # Allow extra fields + +../proxy/_types.py:102 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:102: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:131 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:131: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:177 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:177: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:232 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:232: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:244 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:244: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:279 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:279: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:305 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:305: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149 + /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149: UserWarning: Field "model_max_budget" has conflict with protected namespace "model_". + + You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`. + warnings.warn( + +../proxy/_types.py:553 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:553: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../proxy/_types.py:574 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:574: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ + @root_validator(pre=True) + +../utils.py:36 + /Users/krrishdholakia/Documents/litellm/litellm/utils.py:36: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html + import pkg_resources + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: 10 warnings + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.cloud')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2350: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(parent) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.logging')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('google.iam')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('mpl_toolkits')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../../../../../../opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871 + /opt/homebrew/lib/python3.11/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('sphinxcontrib')`. + Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages + declare_namespace(pkg) + +../llms/prompt_templates/factory.py:6 + /Users/krrishdholakia/Documents/litellm/litellm/llms/prompt_templates/factory.py:6: DeprecationWarning: 'imghdr' is deprecated and slated for removal in Python 3.13 + import imghdr, base64 + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================= 1 passed, 43 warnings in 13.05s ======================== From 6a28d0f88251c53d64c93e62158359d3faccad65 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 21:39:12 -0800 Subject: [PATCH 126/304] (fix) claude-instant-1 test --- litellm/llms/anthropic_text.py | 6 ++++-- litellm/tests/test_completion.py | 7 ++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/litellm/llms/anthropic_text.py b/litellm/llms/anthropic_text.py index e9d504d36..bccc8c769 100644 --- a/litellm/llms/anthropic_text.py +++ b/litellm/llms/anthropic_text.py @@ -35,7 +35,9 @@ class AnthropicTextConfig: to pass metadata to anthropic, it's {"user_id": "any-relevant-information"} """ - max_tokens: Optional[int] = litellm.max_tokens # anthropic requires a default + max_tokens_to_sample: Optional[int] = ( + litellm.max_tokens + ) # anthropic requires a default stop_sequences: Optional[list] = None temperature: Optional[int] = None top_p: Optional[int] = None @@ -44,7 +46,7 @@ class AnthropicTextConfig: def __init__( self, - max_tokens: Optional[int] = 256, # anthropic requires a default + max_tokens_to_sample: Optional[int] = 256, # anthropic requires a default stop_sequences: Optional[list] = None, temperature: Optional[int] = None, top_p: Optional[int] = None, diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index c93c816ce..22d8b2f6a 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -56,7 +56,7 @@ def test_completion_custom_provider_model_name(): def test_completion_claude(): litellm.set_verbose = True litellm.cache = None - litellm.AnthropicTextConfig(max_tokens=200, metadata={"user_id": "1224"}) + litellm.AnthropicTextConfig(max_tokens_to_sample=200, metadata={"user_id": "1224"}) messages = [ { "role": "system", @@ -67,10 +67,7 @@ def test_completion_claude(): try: # test without max tokens response = completion( - model="claude-instant-1.2", - messages=messages, - request_timeout=10, - max_tokens=10, + model="claude-instant-1", messages=messages, request_timeout=10 ) # Add any assertions, here to check response args print(response) From 8ba186afb628c4441786277aa9211feda12563af Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Mon, 4 Mar 2024 21:40:06 -0800 Subject: [PATCH 127/304] =?UTF-8?q?bump:=20version=201.29.1=20=E2=86=92=20?= =?UTF-8?q?1.29.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 905753471..8de9a9f10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.1" +version = "1.29.2" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.1" +version = "1.29.2" version_files = [ "pyproject.toml:^version" ] From c6d7234c97e1fbe7a2e68f37510b3110216553ba Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 21:46:00 -0800 Subject: [PATCH 128/304] fix(bedrock.py): fix conditional --- litellm/llms/bedrock.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 37084e62b..79ba04f42 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -954,13 +954,14 @@ def completion( if ( len(outputText) > 0 and hasattr(model_response.choices[0], "message") - and model_response.choices[0].message.tool_calls is None + and getattr(model_response.choices[0].message, "tool_calls", None) + is None ): model_response["choices"][0]["message"]["content"] = outputText elif ( hasattr(model_response.choices[0], "message") - and hasattr(model_response.choices[0].message, "tool_calls") - and model_response.choices[0].message.tool_calls is not None + and getattr(model_response.choices[0].message, "tool_calls", None) + is not None ): pass else: From 8845430cdb64fd1376e749e3b98487302f308f07 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 22:00:29 -0800 Subject: [PATCH 129/304] docs(anthropic.md): add proxy usage tutorial to anthropic docs --- docs/my-website/docs/providers/anthropic.md | 93 +++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/docs/my-website/docs/providers/anthropic.md b/docs/my-website/docs/providers/anthropic.md index aff3415d3..21140f29b 100644 --- a/docs/my-website/docs/providers/anthropic.md +++ b/docs/my-website/docs/providers/anthropic.md @@ -1,3 +1,6 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Anthropic LiteLLM supports @@ -45,7 +48,97 @@ for chunk in response: print(chunk["choices"][0]["delta"]["content"]) # same as openai format ``` +## OpenAI Proxy Usage +Here's how to call Anthropic with the LiteLLM Proxy Server + +### 1. Save key in your environment + +```bash +export ANTHROPIC_API_KEY="your-api-key" +``` + +### 2. Start the proxy + +```bash +$ litellm --model claude-3-opus-20240229 + +# Server running on http://0.0.0.0:8000 +``` + +### 3. Test it + + + + + +```shell +curl --location 'http://0.0.0.0:8000/chat/completions' \ +--header 'Content-Type: application/json' \ +--data ' { + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": "what llm are you" + } + ] + } +' +``` + + + +```python +import openai +client = openai.OpenAI( + api_key="anything", + base_url="http://0.0.0.0:8000" +) + +# request sent to model set on litellm proxy, `litellm --model` +response = client.chat.completions.create(model="gpt-3.5-turbo", messages = [ + { + "role": "user", + "content": "this is a test request, write a short poem" + } +]) + +print(response) + +``` + + + +```python +from langchain.chat_models import ChatOpenAI +from langchain.prompts.chat import ( + ChatPromptTemplate, + HumanMessagePromptTemplate, + SystemMessagePromptTemplate, +) +from langchain.schema import HumanMessage, SystemMessage + +chat = ChatOpenAI( + openai_api_base="http://0.0.0.0:8000", # set openai_api_base to the LiteLLM Proxy + model = "gpt-3.5-turbo", + temperature=0.1 +) + +messages = [ + SystemMessage( + content="You are a helpful assistant that im using to make a test request to." + ), + HumanMessage( + content="test from litellm. tell me why it's amazing in 1 sentence" + ), +] +response = chat(messages) + +print(response) +``` + + ## Supported Models From 7148077847453dbeac67627f2005a0d88f21588e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 22:01:20 -0800 Subject: [PATCH 130/304] test(test_completion.py): fix test --- litellm/tests/test_completion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index b61a865d2..9c7796c50 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -56,7 +56,7 @@ def test_completion_custom_provider_model_name(): def test_completion_claude(): litellm.set_verbose = True litellm.cache = None - litellm.AnthropicTextConfig(max_tokens=200, metadata={"user_id": "1224"}) + litellm.AnthropicConfig(max_tokens=200, metadata={"user_id": "1224"}) messages = [ { "role": "system", From 5f225e3a88179c8ad32a4bacc7634d9b76f89dec Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 4 Mar 2024 22:33:45 -0800 Subject: [PATCH 131/304] test(test_streaming.py): skip flaky test --- litellm/tests/test_streaming.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py index adf93b4cc..c513447b0 100644 --- a/litellm/tests/test_streaming.py +++ b/litellm/tests/test_streaming.py @@ -727,6 +727,7 @@ def test_completion_claude_stream_bad_key(): # pytest.fail(f"Error occurred: {e}") +@pytest.mark.skip(reason="Replicate changed exceptions") def test_completion_replicate_stream_bad_key(): try: api_key = "bad-key" From 5c03109b6fe8d59602aa4616fffc67e6705eef98 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 07:39:06 -0800 Subject: [PATCH 132/304] docs(configs.md): add load balancing to proxy config docs --- docs/my-website/docs/proxy/configs.md | 65 ++++++++++++++++----------- litellm/llms/aleph_alpha.py | 11 +++-- 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/docs/my-website/docs/proxy/configs.md b/docs/my-website/docs/proxy/configs.md index 0a155828b..2b3edfadb 100644 --- a/docs/my-website/docs/proxy/configs.md +++ b/docs/my-website/docs/proxy/configs.md @@ -202,7 +202,7 @@ print(response) -## Save Model-specific params (API Base, API Keys, Temperature, Max Tokens, Seed, Organization, Headers etc.) +## Save Model-specific params (API Base, Keys, Temperature, Max Tokens, Organization, Headers etc.) You can use the config to save model-specific information like api_base, api_key, temperature, max_tokens, etc. [**All input params**](https://docs.litellm.ai/docs/completion/input#input-params-1) @@ -244,6 +244,45 @@ $ litellm --config /path/to/config.yaml ``` +## Load Balancing + +Use this to call multiple instances of the same model and configure things like [routing strategy](../routing.md#advanced). + +```yaml +router_settings: + routing_strategy: "latency-based-routing" # routes to the fastest deployment in the group + +model_list: + - model_name: zephyr-beta + litellm_params: + model: huggingface/HuggingFaceH4/zephyr-7b-beta + api_base: http://0.0.0.0:8001 + - model_name: zephyr-beta + litellm_params: + model: huggingface/HuggingFaceH4/zephyr-7b-beta + api_base: http://0.0.0.0:8002 + - model_name: zephyr-beta + litellm_params: + model: huggingface/HuggingFaceH4/zephyr-7b-beta + api_base: http://0.0.0.0:8003 + - model_name: gpt-3.5-turbo + litellm_params: + model: gpt-3.5-turbo + api_key: + - model_name: gpt-3.5-turbo-16k + litellm_params: + model: gpt-3.5-turbo-16k + api_key: + +litellm_settings: + num_retries: 3 # retry call 3 times on each model_name (e.g. zephyr-beta) + request_timeout: 10 # raise Timeout error if call takes longer than 10s. Sets litellm.request_timeout + fallbacks: [{"zephyr-beta": ["gpt-3.5-turbo"]}] # fallback to gpt-3.5-turbo if call fails num_retries + context_window_fallbacks: [{"zephyr-beta": ["gpt-3.5-turbo-16k"]}, {"gpt-3.5-turbo": ["gpt-3.5-turbo-16k"]}] # fallback to gpt-3.5-turbo-16k if context window error + allowed_fails: 3 # cooldown model if it fails > 1 call in a minute. +``` + + ## Set Azure `base_model` for cost tracking **Problem**: Azure returns `gpt-4` in the response when `azure/gpt-4-1106-preview` is used. This leads to inaccurate cost tracking @@ -512,30 +551,6 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ ``` -## Router Settings - -Use this to configure things like routing strategy. - -```yaml -router_settings: - routing_strategy: "least-busy" - -model_list: # will route requests to the least busy ollama model - - model_name: ollama-models - litellm_params: - model: "ollama/mistral" - api_base: "http://127.0.0.1:8001" - - model_name: ollama-models - litellm_params: - model: "ollama/codellama" - api_base: "http://127.0.0.1:8002" - - model_name: ollama-models - litellm_params: - model: "ollama/llama2" - api_base: "http://127.0.0.1:8003" -``` - - ## Configure DB Pool Limits + Connection Timeouts ```yaml diff --git a/litellm/llms/aleph_alpha.py b/litellm/llms/aleph_alpha.py index 7168e7369..3c1bd5dde 100644 --- a/litellm/llms/aleph_alpha.py +++ b/litellm/llms/aleph_alpha.py @@ -77,9 +77,9 @@ class AlephAlphaConfig: - `control_log_additive` (boolean; default value: true): Method of applying control to attention scores. """ - maximum_tokens: Optional[ - int - ] = litellm.max_tokens # aleph alpha requires max tokens + maximum_tokens: Optional[int] = ( + litellm.max_tokens + ) # aleph alpha requires max tokens minimum_tokens: Optional[int] = None echo: Optional[bool] = None temperature: Optional[int] = None @@ -285,7 +285,10 @@ def completion( ## CALCULATING USAGE - baseten charges on time, not tokens - have some mapping of cost here. prompt_tokens = len(encoding.encode(prompt)) completion_tokens = len( - encoding.encode(model_response["choices"][0]["message"]["content"]) + encoding.encode( + model_response["choices"][0]["message"]["content"], + disallowed_special=(), + ) ) model_response["created"] = int(time.time()) From 072500e3144f89cb28d1eddb4818c7f372406d3b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 07:40:41 -0800 Subject: [PATCH 133/304] refactor(main.py): trigger new build --- litellm/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/main.py b/litellm/main.py index 60effd96f..87ec7ad07 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,6 +12,7 @@ from typing import Any, Literal, Union from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy + import httpx import litellm from ._logging import verbose_logger From 6b265bc144ec0e674d6ccf5421db6041cdbacd07 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 07:40:54 -0800 Subject: [PATCH 134/304] =?UTF-8?q?bump:=20version=201.29.2=20=E2=86=92=20?= =?UTF-8?q?1.29.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8de9a9f10..4e318afb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.2" +version = "1.29.3" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.2" +version = "1.29.3" version_files = [ "pyproject.toml:^version" ] From d362fc6eec9b34250906d12cc8936a927423abd2 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 13:37:24 -0800 Subject: [PATCH 135/304] fix(utils.py): fix logging --- litellm/utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index d4d85cad1..5937c072d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -772,10 +772,10 @@ class ImageResponse(OpenAIObject): ############################################################ -def print_verbose(print_statement): +def print_verbose(print_statement, logger_only: bool = False): try: verbose_logger.debug(print_statement) - if litellm.set_verbose: + if litellm.set_verbose == True and logger_only == False: print(print_statement) # noqa except: pass @@ -1739,7 +1739,8 @@ class Logging: ) if callable(callback): # custom logger functions print_verbose( - f"Making async function logging call for {callback}, result={result} - {self.model_call_details}" + f"Making async function logging call for {callback}, result={result} - {self.model_call_details}", + logger_only=True, ) if self.stream: if ( From 78d87a4fbd4d804c63c4577027b96820eaf1b7d1 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 15:01:03 -0800 Subject: [PATCH 136/304] fix: clean up print verbose statements --- litellm/integrations/custom_logger.py | 2 -- litellm/utils.py | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/litellm/integrations/custom_logger.py b/litellm/integrations/custom_logger.py index 40242f5c0..0556ceebb 100644 --- a/litellm/integrations/custom_logger.py +++ b/litellm/integrations/custom_logger.py @@ -124,7 +124,6 @@ class CustomLogger: # https://docs.litellm.ai/docs/observability/custom_callbac start_time, end_time, ) - print_verbose(f"Custom Logger - final response object: {response_obj}") except: # traceback.print_exc() print_verbose(f"Custom Logger Error - {traceback.format_exc()}") @@ -142,7 +141,6 @@ class CustomLogger: # https://docs.litellm.ai/docs/observability/custom_callbac start_time, end_time, ) - print_verbose(f"Custom Logger - final response object: {response_obj}") except: # traceback.print_exc() print_verbose(f"Custom Logger Error - {traceback.format_exc()}") diff --git a/litellm/utils.py b/litellm/utils.py index 5937c072d..fa3457143 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1738,10 +1738,10 @@ class Logging: end_time=end_time, ) if callable(callback): # custom logger functions - print_verbose( - f"Making async function logging call for {callback}, result={result} - {self.model_call_details}", - logger_only=True, - ) + # print_verbose( + # f"Making async function logging call for {callback}, result={result} - {self.model_call_details}", + # logger_only=True, + # ) if self.stream: if ( "async_complete_streaming_response" From b70659841527198aa08d633f3d4d3a6896934f22 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 15:27:06 -0800 Subject: [PATCH 137/304] (v0) fixes --- litellm/proxy/proxy_server.py | 13 ++++++----- litellm/proxy/utils.py | 43 +++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 47b8c1535..4ae3840cf 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -9,6 +9,10 @@ import warnings import importlib import warnings +import logging + +logging.getLogger("prisma").setLevel(logging.DEBUG) + def showwarning(message, category, filename, lineno, file=None, line=None): traceback_info = f"{filename}:{lineno}: {category.__name__}: {message}\n" @@ -1138,6 +1142,7 @@ async def update_database( ) # set cooldown on alert soft_budget_cooldown = True + # track cost per model, for the given key spend_per_model = existing_spend_obj.model_spend or {} current_model = kwargs.get("model") @@ -1153,11 +1158,7 @@ async def update_database( # Update the cost column for the given token await prisma_client.update_data( token=token, - data={ - "spend": new_spend, - "model_spend": spend_per_model, - "soft_budget_cooldown": soft_budget_cooldown, - }, + data={"spend": new_spend, "model_spend": spend_per_model}, ) valid_token = user_api_key_cache.get_cache(key=token) @@ -1211,9 +1212,9 @@ async def update_database( payload["spend"] = response_cost if prisma_client is not None: await prisma_client.insert_data(data=payload, table_name="spend") + elif custom_db_client is not None: await custom_db_client.insert_data(payload, table_name="spend") - except Exception as e: verbose_proxy_logger.info(f"Update Spend Logs DB failed to execute") diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index fc90c3b7b..f38b78cfa 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -64,7 +64,7 @@ class ProxyLogging: litellm.callbacks.append(self.max_parallel_request_limiter) litellm.callbacks.append(self.max_budget_limiter) litellm.callbacks.append(self.cache_control_check) - litellm.callbacks.append(self.response_taking_too_long_callback) + # litellm.callbacks.append(self.response_taking_too_long_callback) for callback in litellm.callbacks: if callback not in litellm.input_callback: litellm.input_callback.append(callback) @@ -362,7 +362,7 @@ class ProxyLogging: else: raise Exception("Missing SENTRY_DSN from environment") - async def failure_handler(self, original_exception): + async def failure_handler(self, original_exception, traceback_str=""): """ Log failed db read/writes @@ -373,6 +373,7 @@ class ProxyLogging: error_message = original_exception.detail else: error_message = str(original_exception) + error_message += traceback_str asyncio.create_task( self.alerting_handler( message=f"DB read/write call failed: {error_message}", @@ -706,8 +707,13 @@ class PrismaClient: ) return response except Exception as e: + import traceback + + tracback_str = traceback.format_exc() asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=tracback_str + ) ) raise e @@ -912,9 +918,10 @@ class PrismaClient: return response elif table_name == "team": if query_type == "find_unique": - response = await self.db.litellm_teamtable.find_unique( - where={"team_id": team_id} # type: ignore - ) + response = None + # response = await self.db.litellm_teamtable.find_unique( + # where={"team_id": team_id} # type: ignore + # ) elif query_type == "find_all" and user_id is not None: response = await self.db.litellm_teamtable.find_many( where={ @@ -971,8 +978,12 @@ class PrismaClient: import traceback traceback.print_exc() + # get tracback + traceback_string = traceback.format_exc() asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=traceback_string + ) ) raise e @@ -1093,8 +1104,12 @@ class PrismaClient: except Exception as e: print_verbose(f"LiteLLM Prisma Client Exception: {e}") + import traceback + + traceback_str = traceback.format_exc() + print_verbose(f"Traceback: {traceback_str}") asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler(original_exception=e, traceback_str=traceback_str) # type: ignore # noqa=traceback_str) ) raise e @@ -1277,8 +1292,12 @@ class PrismaClient: "\033[91m" + f"DB User Table Batch update succeeded" + "\033[0m" ) except Exception as e: + import traceback + asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=traceback.format_exc() + ) ) print_verbose("\033[91m" + f"DB write failed: {e}" + "\033[0m") raise e @@ -1331,8 +1350,12 @@ class PrismaClient: where={"team_id": {"in": team_id_list}} ) except Exception as e: + import traceback + asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=traceback.format_exc() + ) ) raise e From cd419eb8a5f686c65c7439206ae8bf49d318c8de Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 15:35:13 -0800 Subject: [PATCH 138/304] test(test_keys.py): add more duration for testing budget updates --- proxy_server_config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proxy_server_config.yaml b/proxy_server_config.yaml index b65cefe79..64183f216 100644 --- a/proxy_server_config.yaml +++ b/proxy_server_config.yaml @@ -40,8 +40,8 @@ litellm_settings: budget_duration: 30d general_settings: master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234) - proxy_budget_rescheduler_min_time: 3 - proxy_budget_rescheduler_max_time: 6 + proxy_budget_rescheduler_min_time: 10 + proxy_budget_rescheduler_max_time: 12 # database_url: "postgresql://:@:/" # [OPTIONAL] use for token-based auth to proxy environment_variables: From 2b595bfdc9eabf5a4af555f59252422254cfe3f1 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 15:42:19 -0800 Subject: [PATCH 139/304] test(test_keys.py): add more duration for test --- tests/test_keys.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_keys.py b/tests/test_keys.py index db21a2176..5a7b79e1c 100644 --- a/tests/test_keys.py +++ b/tests/test_keys.py @@ -469,7 +469,7 @@ async def test_key_with_budgets(): break except: i + 1 - await asyncio.sleep(5) + await asyncio.sleep(10) assert reset_at_init_value != reset_at_new_value From 387864662e8fe40b8b3f7aa8e6f279bd736d38a3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 15:50:40 -0800 Subject: [PATCH 140/304] fix(main.py): trigger new build --- litellm/main.py | 1 - litellm/proxy/utils.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index 87ec7ad07..60effd96f 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,7 +12,6 @@ from typing import Any, Literal, Union from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy - import httpx import litellm from ._logging import verbose_logger diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index fc90c3b7b..d11e1e479 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -64,7 +64,7 @@ class ProxyLogging: litellm.callbacks.append(self.max_parallel_request_limiter) litellm.callbacks.append(self.max_budget_limiter) litellm.callbacks.append(self.cache_control_check) - litellm.callbacks.append(self.response_taking_too_long_callback) + litellm.success_callback.append(self.response_taking_too_long_callback) for callback in litellm.callbacks: if callback not in litellm.input_callback: litellm.input_callback.append(callback) From 512f6814d3257bdbb3cbde73ef7e233eb55762bb Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 16:31:41 -0800 Subject: [PATCH 141/304] fix(factory.py): fix anthropic prompt template --- litellm/llms/prompt_templates/factory.py | 1 + litellm/tests/test_completion.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index dec87a61c..c78a71dba 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -575,6 +575,7 @@ def anthropic_messages_pt(messages: list): if messages[i]["role"] == "assistant": last_assistant_message_idx = i + new_messages.append(messages[-1]) if last_assistant_message_idx is not None: new_messages[last_assistant_message_idx]["content"] = new_messages[ last_assistant_message_idx diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 57b0e436f..f5e145769 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -82,6 +82,23 @@ def test_completion_claude(): # test_completion_claude() +def test_completion_claude_3_empty_response(): + messages = [ + { + "role": "system", + "content": "You are 2twNLGfqk4GMOn3ffp4p.", + }, + {"role": "user", "content": "Hi gm!"}, + {"role": "assistant", "content": "Good morning! How are you doing today?"}, + { + "role": "user", + "content": "I was hoping we could chat a bit", + }, + ] + response = litellm.completion(model="claude-3-opus-20240229", messages=messages) + print(response) + + def test_completion_claude_3(): litellm.set_verbose = True messages = [{"role": "user", "content": "Hello, world"}] From 6727b009a191771aa5d6c240c008ec8c8d0a37a5 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 16:32:06 -0800 Subject: [PATCH 142/304] =?UTF-8?q?bump:=20version=201.29.3=20=E2=86=92=20?= =?UTF-8?q?1.29.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4e318afb2..6d42edd23 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.3" +version = "1.29.4" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.3" +version = "1.29.4" version_files = [ "pyproject.toml:^version" ] From 3f7bf5c6b19e746a6609c48650d42cd74ea8ce04 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 16:46:58 -0800 Subject: [PATCH 143/304] (fix) fix batch update user db --- litellm/proxy/proxy_server.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 47b8c1535..628f55852 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1067,20 +1067,22 @@ async def update_database( ) data_list.append(existing_spend_obj) - # Update the cost column for the given user id - if prisma_client is not None: - await prisma_client.update_data( - data_list=data_list, - query_type="update_many", - table_name="user", - ) - elif custom_db_client is not None and user_id is not None: + if custom_db_client is not None and user_id is not None: new_spend = data_list[0].spend await custom_db_client.update_data( key=user_id, value={"spend": new_spend}, table_name="user" ) + # Update the cost column for the given user id + if prisma_client is not None: + await prisma_client.update_data( + data_list=data_list, + query_type="update_many", + table_name="user", + ) except Exception as e: - verbose_proxy_logger.info(f"Update User DB call failed to execute") + verbose_proxy_logger.info( + f"Update User DB call failed to execute {str(e)}" + ) ### UPDATE KEY SPEND ### async def _update_key_db(): @@ -1215,7 +1217,9 @@ async def update_database( await custom_db_client.insert_data(payload, table_name="spend") except Exception as e: - verbose_proxy_logger.info(f"Update Spend Logs DB failed to execute") + verbose_proxy_logger.info( + f"Update Spend Logs DB failed to execute - {str(e)}" + ) ### UPDATE KEY SPEND ### async def _update_team_db(): @@ -1286,7 +1290,9 @@ async def update_database( valid_token.spend = new_spend user_api_key_cache.set_cache(key=token, value=valid_token) except Exception as e: - verbose_proxy_logger.info(f"Update Team DB failed to execute") + verbose_proxy_logger.info( + f"Update Team DB failed to execute - {str(e)}" + ) asyncio.create_task(_update_user_db()) asyncio.create_task(_update_key_db()) From 0eb67e50a174c3c52eeabab26bb7c16e3afb31ee Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 16:48:37 -0800 Subject: [PATCH 144/304] fix(utils.py): handle none in tool call for mistral tool calling --- litellm/utils.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index fa3457143..33f4f1c3d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -225,9 +225,25 @@ class ChatCompletionDeltaToolCall(OpenAIObject): class ChatCompletionMessageToolCall(OpenAIObject): - id: str - function: Function - type: str + def __init__( + self, + function: Function, + id: Optional[str] = None, + type: Optional[str] = None, + **params, + ): + super(ChatCompletionMessageToolCall, self).__init__(**params) + self.function = function + + if id is not None: + self.id = id + else: + self.id = f"{uuid.uuid4()}" + + if type is not None: + self.type = type + else: + self.type = "function" class Message(OpenAIObject): @@ -6232,7 +6248,7 @@ def convert_to_model_response_object( return model_response_object except Exception as e: - raise Exception(f"Invalid response object {e}") + raise Exception(f"Invalid response object {traceback.format_exc()}") def acreate(*args, **kwargs): ## Thin client to handle the acreate langchain call From d0953a13499dc69f4ea27c85e2707ce2b5a98eee Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 17:04:25 -0800 Subject: [PATCH 145/304] (fix) chore --- litellm/proxy/proxy_server.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 4ae3840cf..17a213f51 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -9,10 +9,6 @@ import warnings import importlib import warnings -import logging - -logging.getLogger("prisma").setLevel(logging.DEBUG) - def showwarning(message, category, filename, lineno, file=None, line=None): traceback_info = f"{filename}:{lineno}: {category.__name__}: {message}\n" @@ -1142,7 +1138,6 @@ async def update_database( ) # set cooldown on alert soft_budget_cooldown = True - # track cost per model, for the given key spend_per_model = existing_spend_obj.model_spend or {} current_model = kwargs.get("model") @@ -1158,7 +1153,11 @@ async def update_database( # Update the cost column for the given token await prisma_client.update_data( token=token, - data={"spend": new_spend, "model_spend": spend_per_model}, + data={ + "spend": new_spend, + "model_spend": spend_per_model, + "soft_budget_cooldown": soft_budget_cooldown, + }, ) valid_token = user_api_key_cache.get_cache(key=token) @@ -1212,7 +1211,6 @@ async def update_database( payload["spend"] = response_cost if prisma_client is not None: await prisma_client.insert_data(data=payload, table_name="spend") - elif custom_db_client is not None: await custom_db_client.insert_data(payload, table_name="spend") except Exception as e: From 3df618bf048e6ef3e39cc724c780aaa9042af5d6 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 17:05:01 -0800 Subject: [PATCH 146/304] (fix) cleanup --- litellm/proxy/proxy_server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 17a213f51..47b8c1535 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1213,6 +1213,7 @@ async def update_database( await prisma_client.insert_data(data=payload, table_name="spend") elif custom_db_client is not None: await custom_db_client.insert_data(payload, table_name="spend") + except Exception as e: verbose_proxy_logger.info(f"Update Spend Logs DB failed to execute") From f95458dad8ad5ad8709e711c2be45ccff324d695 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 18:10:43 -0800 Subject: [PATCH 147/304] fix(utils.py): handle dict object for chatcompletionmessagetoolcall --- litellm/utils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 33f4f1c3d..68dc137af 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -227,13 +227,16 @@ class ChatCompletionDeltaToolCall(OpenAIObject): class ChatCompletionMessageToolCall(OpenAIObject): def __init__( self, - function: Function, + function: Union[Dict, Function], id: Optional[str] = None, type: Optional[str] = None, **params, ): super(ChatCompletionMessageToolCall, self).__init__(**params) - self.function = function + if isinstance(function, Dict): + self.function = Function(**function) + else: + self.function = function if id is not None: self.id = id From 735728c4ddada72b388ff2abc8122f175dfe19a2 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 18:16:59 -0800 Subject: [PATCH 148/304] (feat) add better debugging when DB read/write fails --- litellm/proxy/tests/load_test_completion.py | 6 ++- litellm/proxy/utils.py | 57 +++++++++++++++------ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/litellm/proxy/tests/load_test_completion.py b/litellm/proxy/tests/load_test_completion.py index b5d711d81..d708f3036 100644 --- a/litellm/proxy/tests/load_test_completion.py +++ b/litellm/proxy/tests/load_test_completion.py @@ -4,7 +4,9 @@ import uuid import traceback -litellm_client = AsyncOpenAI(base_url="http://0.0.0.0:8000", api_key="any") +litellm_client = AsyncOpenAI( + base_url="http://0.0.0.0:4000", api_key="sk-iNwH_oOtAQ6syi_2gkEOpQ" +) async def litellm_completion(): @@ -27,7 +29,7 @@ async def litellm_completion(): async def main(): for i in range(150): start = time.time() - n = 150 # Number of concurrent tasks + n = 2000 # Number of concurrent tasks tasks = [litellm_completion() for _ in range(n)] chat_completions = await asyncio.gather(*tasks) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index f38b78cfa..959f2b714 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -373,7 +373,8 @@ class ProxyLogging: error_message = original_exception.detail else: error_message = str(original_exception) - error_message += traceback_str + if isinstance(traceback_str, str): + error_message += traceback_str[:1000] asyncio.create_task( self.alerting_handler( message=f"DB read/write call failed: {error_message}", @@ -709,10 +710,12 @@ class PrismaClient: except Exception as e: import traceback - tracback_str = traceback.format_exc() + error_msg = f"LiteLLM Prisma Client Exception get_generic_data: {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( self.proxy_logging_obj.failure_handler( - original_exception=e, traceback_str=tracback_str + original_exception=e, traceback_str=error_traceback ) ) raise e @@ -974,15 +977,14 @@ class PrismaClient: response.expires = response.expires.isoformat() return response except Exception as e: - print_verbose(f"LiteLLM Prisma Client Exception: {e}") import traceback - traceback.print_exc() - # get tracback - traceback_string = traceback.format_exc() + error_msg = f"LiteLLM Prisma Client Exception get_data: {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( self.proxy_logging_obj.failure_handler( - original_exception=e, traceback_str=traceback_string + original_exception=e, traceback_str=error_traceback ) ) raise e @@ -1103,13 +1105,15 @@ class PrismaClient: return new_user_notification_row except Exception as e: - print_verbose(f"LiteLLM Prisma Client Exception: {e}") import traceback - traceback_str = traceback.format_exc() - print_verbose(f"Traceback: {traceback_str}") + error_msg = f"LiteLLM Prisma Client Exception in insert_data: {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e, traceback_str=traceback_str) # type: ignore # noqa=traceback_str) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=error_traceback + ) ) raise e @@ -1294,12 +1298,14 @@ class PrismaClient: except Exception as e: import traceback + error_msg = f"LiteLLM Prisma Client Exception - update_data: {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( self.proxy_logging_obj.failure_handler( - original_exception=e, traceback_str=traceback.format_exc() + original_exception=e, traceback_str=error_traceback ) ) - print_verbose("\033[91m" + f"DB write failed: {e}" + "\033[0m") raise e # Define a retrying strategy with exponential backoff @@ -1352,9 +1358,12 @@ class PrismaClient: except Exception as e: import traceback + error_msg = f"LiteLLM Prisma Client Exception - delete_data: {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( self.proxy_logging_obj.failure_handler( - original_exception=e, traceback_str=traceback.format_exc() + original_exception=e, traceback_str=error_traceback ) ) raise e @@ -1378,8 +1387,15 @@ class PrismaClient: ) await self.db.connect() except Exception as e: + import traceback + + error_msg = f"LiteLLM Prisma Client Exception connect(): {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=error_traceback + ) ) raise e @@ -1395,8 +1411,15 @@ class PrismaClient: try: await self.db.disconnect() except Exception as e: + import traceback + + error_msg = f"LiteLLM Prisma Client Exception disconnect(): {e}" + print_verbose(error_msg) + error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( - self.proxy_logging_obj.failure_handler(original_exception=e) + self.proxy_logging_obj.failure_handler( + original_exception=e, traceback_str=error_traceback + ) ) raise e From a7094b0a3ca8cac7b590a7c09f280de3046a1a2d Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 18:29:09 -0800 Subject: [PATCH 149/304] (v0) fix pydantic warnings --- litellm/proxy/_types.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 83b4e0935..7ae67bdc6 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -33,6 +33,9 @@ class LiteLLMBase(BaseModel): # if using pydantic v1 return self.__fields_set__ + class Config: + protected_namespaces = () + ######### Request Class Definition ###### class ProxyChatCompletionRequest(LiteLLMBase): @@ -328,6 +331,7 @@ class TeamRequest(LiteLLMBase): class LiteLLM_BudgetTable(LiteLLMBase): """Represents user-controllable params for a LiteLLM_BudgetTable record""" + soft_budget: Optional[float] = None max_budget: Optional[float] = None max_parallel_requests: Optional[int] = None @@ -367,7 +371,7 @@ class OrganizationRequest(LiteLLMBase): class BudgetRequest(LiteLLMBase): budgets: List[str] - + class KeyManagementSystem(enum.Enum): GOOGLE_KMS = "google_kms" AZURE_KEY_VAULT = "azure_key_vault" From c6e6afd125a32d1f36123b43114f6f6ed042d1dd Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 18:41:39 -0800 Subject: [PATCH 150/304] (fix) bug importing litellm --- litellm/llms/bedrock.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 79ba04f42..89d1bf16f 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -376,7 +376,7 @@ class AmazonMistralConfig: temperature: Optional[float] = None top_p: Optional[float] = None top_k: Optional[float] = None - stop: Optional[list[str]] = None + stop: Optional[List[str]] = None def __init__( self, @@ -384,7 +384,7 @@ class AmazonMistralConfig: temperature: Optional[float] = None, top_p: Optional[int] = None, top_k: Optional[float] = None, - stop: Optional[list[str]] = None, + stop: Optional[List[str]] = None, ) -> None: locals_ = locals() for key, value in locals_.items(): From bbdac823f48b3b5b483b1584dac0a2d08da32240 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 18:45:47 -0800 Subject: [PATCH 151/304] (fix) using litellm on python 3.8 --- litellm/llms/prompt_templates/factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index c78a71dba..b49cae5f3 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -2,7 +2,7 @@ from enum import Enum import requests, traceback import json, re, xml.etree.ElementTree as ET from jinja2 import Template, exceptions, Environment, meta -from typing import Optional, Any +from typing import Optional, Any, List import imghdr, base64 @@ -586,7 +586,7 @@ def anthropic_messages_pt(messages: list): return new_messages -def extract_between_tags(tag: str, string: str, strip: bool = False) -> list[str]: +def extract_between_tags(tag: str, string: str, strip: bool = False) -> List[str]: ext_list = re.findall(f"<{tag}>(.+?)", string, re.DOTALL) if strip: ext_list = [e.strip() for e in ext_list] From 00666566c20b3c5b63e6078acc5cd533e8a1f191 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 18:54:04 -0800 Subject: [PATCH 152/304] (fix) chore --- litellm/proxy/utils.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 9e3a374ec..6946904c7 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -921,10 +921,9 @@ class PrismaClient: return response elif table_name == "team": if query_type == "find_unique": - response = None - # response = await self.db.litellm_teamtable.find_unique( - # where={"team_id": team_id} # type: ignore - # ) + response = await self.db.litellm_teamtable.find_unique( + where={"team_id": team_id} # type: ignore + ) elif query_type == "find_all" and user_id is not None: response = await self.db.litellm_teamtable.find_many( where={ From 52e59e050c02dc234c61946c061d46e23e8a5b71 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 18:57:26 -0800 Subject: [PATCH 153/304] (fix) use str(e) --- litellm/proxy/utils.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 6946904c7..527b66f8c 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -710,7 +710,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception get_generic_data: {e}" + error_msg = f"LiteLLM Prisma Client Exception get_generic_data: {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( @@ -978,7 +978,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception get_data: {e}" + error_msg = f"LiteLLM Prisma Client Exception get_data: {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( @@ -1106,7 +1106,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception in insert_data: {e}" + error_msg = f"LiteLLM Prisma Client Exception in insert_data: {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( @@ -1297,7 +1297,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception - update_data: {e}" + error_msg = f"LiteLLM Prisma Client Exception - update_data: {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( @@ -1357,7 +1357,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception - delete_data: {e}" + error_msg = f"LiteLLM Prisma Client Exception - delete_data: {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( @@ -1388,7 +1388,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception connect(): {e}" + error_msg = f"LiteLLM Prisma Client Exception connect(): {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( @@ -1412,7 +1412,7 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception disconnect(): {e}" + error_msg = f"LiteLLM Prisma Client Exception disconnect(): {str(e)}" print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() asyncio.create_task( From ad55f4dbb5dee960d341ca2470e1e615b9255ecc Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 19:00:03 -0800 Subject: [PATCH 154/304] feat(proxy_server.py): retry if virtual key is rate limited currently for chat completions --- .../proxy/hooks/parallel_request_limiter.py | 8 ++++- litellm/proxy/proxy_server.py | 19 ++++++++++++ proxy_server_config.yaml | 2 ++ tests/test_keys.py | 29 +++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/hooks/parallel_request_limiter.py b/litellm/proxy/hooks/parallel_request_limiter.py index 4221b064e..8982e4e2b 100644 --- a/litellm/proxy/hooks/parallel_request_limiter.py +++ b/litellm/proxy/hooks/parallel_request_limiter.py @@ -71,7 +71,9 @@ class _PROXY_MaxParallelRequestsHandler(CustomLogger): ): self.print_verbose(f"Inside Max Parallel Request Pre-Call Hook") api_key = user_api_key_dict.api_key - max_parallel_requests = user_api_key_dict.max_parallel_requests or sys.maxsize + max_parallel_requests = user_api_key_dict.max_parallel_requests + if max_parallel_requests is None: + max_parallel_requests = sys.maxsize tpm_limit = getattr(user_api_key_dict, "tpm_limit", sys.maxsize) if tpm_limit is None: tpm_limit = sys.maxsize @@ -105,6 +107,10 @@ class _PROXY_MaxParallelRequestsHandler(CustomLogger): and rpm_limit == sys.maxsize ): pass + elif max_parallel_requests == 0 or tpm_limit == 0 or rpm_limit == 0: + raise HTTPException( + status_code=429, detail="Max parallel request limit reached." + ) elif current is None: new_val = { "current_requests": 1, diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 628f55852..ef54f29bd 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -8,6 +8,7 @@ import hashlib, uuid import warnings import importlib import warnings +import backoff def showwarning(message, category, filename, lineno, file=None, line=None): @@ -2298,6 +2299,11 @@ def parse_cache_control(cache_control): return cache_dict +def on_backoff(details): + # The 'tries' key in the details dictionary contains the number of completed tries + verbose_proxy_logger.debug(f"Backing off... this was attempt #{details['tries']}") + + @router.on_event("startup") async def startup_event(): global prisma_client, master_key, use_background_health_checks, llm_router, llm_model_list, general_settings, proxy_budget_rescheduler_min_time, proxy_budget_rescheduler_max_time, litellm_proxy_admin_name @@ -2613,6 +2619,19 @@ async def completion( dependencies=[Depends(user_api_key_auth)], tags=["chat/completions"], ) # azure compatible endpoint +@backoff.on_exception( + backoff.expo, + Exception, # base exception to catch for the backoff + max_tries=litellm.num_retries or 3, # maximum number of retries + max_time=litellm.request_timeout or 60, # maximum total time to retry for + on_backoff=on_backoff, # specifying the function to call on backoff + giveup=lambda e: not ( + isinstance(e, ProxyException) + and getattr(e, "message", None) is not None + and isinstance(e.message, str) + and "Max parallel request limit reached" in e.message + ), # the result of the logical expression is on the second position +) async def chat_completion( request: Request, fastapi_response: Response, diff --git a/proxy_server_config.yaml b/proxy_server_config.yaml index 64183f216..4b454f5bd 100644 --- a/proxy_server_config.yaml +++ b/proxy_server_config.yaml @@ -38,6 +38,8 @@ litellm_settings: drop_params: True max_budget: 100 budget_duration: 30d + num_retries: 5 + request_timeout: 600 general_settings: master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234) proxy_budget_rescheduler_min_time: 10 diff --git a/tests/test_keys.py b/tests/test_keys.py index 5a7b79e1c..413c24bc1 100644 --- a/tests/test_keys.py +++ b/tests/test_keys.py @@ -6,6 +6,7 @@ import asyncio, time import aiohttp from openai import AsyncOpenAI import sys, os +from typing import Optional sys.path.insert( 0, os.path.abspath("../") @@ -19,6 +20,7 @@ async def generate_key( budget=None, budget_duration=None, models=["azure-models", "gpt-4", "dall-e-3"], + max_parallel_requests: Optional[int] = None, ): url = "http://0.0.0.0:4000/key/generate" headers = {"Authorization": "Bearer sk-1234", "Content-Type": "application/json"} @@ -28,6 +30,7 @@ async def generate_key( "duration": None, "max_budget": budget, "budget_duration": budget_duration, + "max_parallel_requests": max_parallel_requests, } print(f"data: {data}") @@ -524,3 +527,29 @@ async def test_key_info_spend_values_sagemaker(): rounded_key_info_spend = round(key_info["info"]["spend"], 8) assert rounded_key_info_spend > 0 # assert rounded_response_cost == rounded_key_info_spend + + +@pytest.mark.asyncio +async def test_key_rate_limit(): + """ + Tests backoff/retry logic on parallel request error. + - Create key with max parallel requests 0 + - run 2 requests -> both fail + - Create key with max parallel request 1 + - run 2 requests + - both should succeed + """ + async with aiohttp.ClientSession() as session: + key_gen = await generate_key(session=session, i=0, max_parallel_requests=0) + new_key = key_gen["key"] + try: + await chat_completion(session=session, key=new_key) + pytest.fail(f"Expected this call to fail") + except Exception as e: + pass + key_gen = await generate_key(session=session, i=0, max_parallel_requests=1) + new_key = key_gen["key"] + try: + await chat_completion(session=session, key=new_key) + except Exception as e: + pytest.fail(f"Expected this call to work - {str(e)}") From 10ef40faae0cbe6794d30b64518c49bbfd2fc36b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 19:01:40 -0800 Subject: [PATCH 155/304] test(test_completion.py): handle anthropic internal server error --- litellm/tests/test_completion.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index f5e145769..eca0cd934 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -151,6 +151,8 @@ def test_completion_claude_3_function_call(): assert isinstance( response.choices[0].message.tool_calls[0].function.arguments, str ) + except litellm.ServiceUnavailableError as e: + pass except Exception as e: pytest.fail(f"Error occurred: {e}") From 92753f558cfb737f0c73286e8315e8a2590ab254 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 19:03:27 -0800 Subject: [PATCH 156/304] (fix) _update_team_db --- litellm/proxy/proxy_server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 628f55852..edb5c6970 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1247,6 +1247,11 @@ async def update_database( # Calculate the new cost by adding the existing cost and response_cost new_spend = existing_spend + response_cost + if existing_spend_obj is None: + spend_per_model = {} + else: + spend_per_model = existing_spend_obj.model_spend or {} + # track cost per model, for the given team spend_per_model = existing_spend_obj.model_spend or {} current_model = kwargs.get("model") From ea303b0f61d88ca6001458b35421bfbf94b7e589 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 19:06:24 -0800 Subject: [PATCH 157/304] fix(replicate.py): handle model endpoint --- litellm/llms/replicate.py | 9 +++--- litellm/tests/log.txt | 51 ++++++++++++++------------------ litellm/tests/test_completion.py | 4 +-- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/litellm/llms/replicate.py b/litellm/llms/replicate.py index bc296bfd0..2e1f1b607 100644 --- a/litellm/llms/replicate.py +++ b/litellm/llms/replicate.py @@ -104,7 +104,8 @@ def start_prediction( version_id = version_id.replace("deployments/", "") base_url = f"https://api.replicate.com/v1/deployments/{version_id}" print_verbose(f"Deployment base URL: {base_url}\n") - + else: # assume it's a model + base_url = f"https://api.replicate.com/v1/models/{version_id}" headers = { "Authorization": f"Token {api_token}", "Content-Type": "application/json", @@ -306,9 +307,9 @@ def completion( result, logs = handle_prediction_response( prediction_url, api_key, print_verbose ) - model_response[ - "ended" - ] = time.time() # for pricing this must remain right after calling api + model_response["ended"] = ( + time.time() + ) # for pricing this must remain right after calling api ## LOGGING logging_obj.post_call( input=prompt, diff --git a/litellm/tests/log.txt b/litellm/tests/log.txt index 7b53823b0..03b5c605e 100644 --- a/litellm/tests/log.txt +++ b/litellm/tests/log.txt @@ -5,7 +5,7 @@ plugins: timeout-2.2.0, asyncio-0.23.2, anyio-3.7.1, xdist-3.3.1 asyncio: mode=Mode.STRICT collected 1 item -test_custom_callback_input.py . [100%] +test_completion.py . [100%] =============================== warnings summary =============================== ../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 @@ -15,54 +15,49 @@ test_custom_callback_input.py . [100%] ../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 ../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 ../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 +../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 ../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271 /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_config.py:271: PydanticDeprecatedSince20: Support for class-based `config` is deprecated, use ConfigDict instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ warnings.warn(DEPRECATION_MESSAGE, DeprecationWarning) -../proxy/_types.py:99 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:99: PydanticDeprecatedSince20: `pydantic.config.Extra` is deprecated, use literal values instead (e.g. `extra='allow'`). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:102 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:102: PydanticDeprecatedSince20: `pydantic.config.Extra` is deprecated, use literal values instead (e.g. `extra='allow'`). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ extra = Extra.allow # Allow extra fields -../proxy/_types.py:102 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:102: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:105 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:105: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:131 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:131: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:134 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:134: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:177 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:177: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:180 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:180: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:232 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:232: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:235 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:235: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:244 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:244: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:247 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:247: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:279 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:279: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:282 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:282: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:305 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:305: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:308 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:308: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../../../../../../opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149 - /opt/homebrew/lib/python3.11/site-packages/pydantic/_internal/_fields.py:149: UserWarning: Field "model_max_budget" has conflict with protected namespace "model_". - - You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`. - warnings.warn( - -../proxy/_types.py:553 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:553: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:557 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:557: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) -../proxy/_types.py:574 - /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:574: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ +../proxy/_types.py:578 + /Users/krrishdholakia/Documents/litellm/litellm/proxy/_types.py:578: PydanticDeprecatedSince20: Pydantic V1 style `@root_validator` validators are deprecated. You should migrate to Pydantic V2 style `@model_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @root_validator(pre=True) ../utils.py:36 @@ -115,4 +110,4 @@ test_custom_callback_input.py . [100%] import imghdr, base64 -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================= 1 passed, 43 warnings in 13.05s ======================== +======================== 1 passed, 43 warnings in 4.47s ======================== diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index eca0cd934..1423c7c43 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1406,9 +1406,9 @@ def test_completion_replicate_vicuna(): def test_replicate_custom_prompt_dict(): litellm.set_verbose = True - model_name = "replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0" + model_name = "replicate/mistralai/mixtral-8x7b-instruct-v0.1" litellm.register_prompt_template( - model="replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0", + model="replicate/mistralai/mixtral-8x7b-instruct-v0.1", initial_prompt_value="You are a good assistant", # [OPTIONAL] roles={ "system": { From c4e7c45c3a4850c85df0cf46a2be416b4626c8dc Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 19:09:19 -0800 Subject: [PATCH 158/304] (fix) update team_id --- litellm/proxy/proxy_server.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index edb5c6970..409cf63d5 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1241,17 +1241,16 @@ async def update_database( f"_update_team_db: existing spend: {existing_spend_obj}" ) if existing_spend_obj is None: - existing_spend = 0 + # the team does not exist in the db - return + verbose_proxy_logger.debug( + "team_id does not exist in db, not tracking spend for team" + ) + return else: existing_spend = existing_spend_obj.spend # Calculate the new cost by adding the existing cost and response_cost new_spend = existing_spend + response_cost - - if existing_spend_obj is None: - spend_per_model = {} - else: - spend_per_model = existing_spend_obj.model_spend or {} - + spend_per_model = getattr(existing_spend_obj, "model_spend", {}) # track cost per model, for the given team spend_per_model = existing_spend_obj.model_spend or {} current_model = kwargs.get("model") From 656e300b83917842b9701af49b9df1d1eb50765a Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Tue, 5 Mar 2024 20:38:43 -0800 Subject: [PATCH 159/304] =?UTF-8?q?bump:=20version=201.29.4=20=E2=86=92=20?= =?UTF-8?q?1.29.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6d42edd23..781d18cb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.4" +version = "1.29.5" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.4" +version = "1.29.5" version_files = [ "pyproject.toml:^version" ] From a3a751ce6213bf2907fc3d4c45a9f8903e566662 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 20:45:16 -0800 Subject: [PATCH 160/304] fix(utils.py): fix mistral api exception mapping --- litellm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index 68dc137af..ba40cdcf5 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -6658,7 +6658,7 @@ def exception_type( message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, - response=httpx.Response(status_code=500, request=_request), + request=_request, ) elif hasattr(original_exception, "status_code"): exception_mapping_worked = True From 8a4a14cc95df7cb99745fb17110fe69ae1fb8ee8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 21:12:50 -0800 Subject: [PATCH 161/304] test(test_caching.py): fix test to check on id --- litellm/tests/test_caching.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/litellm/tests/test_caching.py b/litellm/tests/test_caching.py index f649bff02..0e5a7ab5f 100644 --- a/litellm/tests/test_caching.py +++ b/litellm/tests/test_caching.py @@ -438,11 +438,10 @@ def test_redis_cache_completion_stream(): temperature=0.2, stream=True, ) - response_1_content = "" + response_1_id = "" for chunk in response1: print(chunk) - response_1_content += chunk.choices[0].delta.content or "" - print(response_1_content) + response_1_id = chunk.id time.sleep(0.5) response2 = completion( model="gpt-3.5-turbo", @@ -451,15 +450,13 @@ def test_redis_cache_completion_stream(): temperature=0.2, stream=True, ) - response_2_content = "" + response_2_id = "" for chunk in response2: print(chunk) - response_2_content += chunk.choices[0].delta.content or "" - print("\nresponse 1", response_1_content) - print("\nresponse 2", response_2_content) + response_2_id += chunk.id assert ( - response_1_content == response_2_content - ), f"Response 1 != Response 2. Same params, Response 1{response_1_content} != Response 2{response_2_content}" + response_1_id == response_2_id + ), f"Response 1 != Response 2. Same params, Response 1{response_1_id} != Response 2{response_2_id}" litellm.success_callback = [] litellm.cache = None litellm.success_callback = [] From 688b903d195bd0c33d87617f2e899069c136993b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 21:34:42 -0800 Subject: [PATCH 162/304] docs(bedrock.md): add anthropic function calling to docs --- docs/my-website/docs/providers/anthropic.md | 84 +++++++++ docs/my-website/docs/providers/bedrock.md | 188 +++++++++++++++++++- 2 files changed, 271 insertions(+), 1 deletion(-) diff --git a/docs/my-website/docs/providers/anthropic.md b/docs/my-website/docs/providers/anthropic.md index 21140f29b..6aa4b1979 100644 --- a/docs/my-website/docs/providers/anthropic.md +++ b/docs/my-website/docs/providers/anthropic.md @@ -153,6 +153,90 @@ print(response) ## Advanced +## Usage - Function Calling + +```python +from litellm import completion + +# set env +os.environ["ANTHROPIC_API_KEY"] = "your-api-key" + +tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, + }, + "required": ["location"], + }, + }, + } +] +messages = [{"role": "user", "content": "What's the weather like in Boston today?"}] + +response = completion( + model="anthropic/claude-3-opus-20240229", + messages=messages, + tools=tools, + tool_choice="auto", +) +# Add any assertions, here to check response args +print(response) +assert isinstance(response.choices[0].message.tool_calls[0].function.name, str) +assert isinstance( + response.choices[0].message.tool_calls[0].function.arguments, str +) + +``` + + +## Usage - Vision + +```python +from litellm import completion + +# set env +os.environ["ANTHROPIC_API_KEY"] = "your-api-key" + +def encode_image(image_path): + import base64 + + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") + + +image_path = "../proxy/cached_logo.jpg" +# Getting the base64 string +base64_image = encode_image(image_path) +resp = litellm.completion( + model="anthropic/claude-3-opus-20240229", + messages=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "Whats in this image?"}, + { + "type": "image_url", + "image_url": { + "url": "data:image/jpeg;base64," + base64_image + }, + }, + ], + } + ], +) +print(f"\nResponse: {resp}") +``` + ### Usage - "Assistant Pre-fill" You can "put words in Claude's mouth" by including an `assistant` role message as the last item in the `messages` array. diff --git a/docs/my-website/docs/providers/bedrock.md b/docs/my-website/docs/providers/bedrock.md index d744596c4..c5b12d4c4 100644 --- a/docs/my-website/docs/providers/bedrock.md +++ b/docs/my-website/docs/providers/bedrock.md @@ -1,3 +1,6 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # AWS Bedrock Anthropic, Amazon Titan, A121 LLMs are Supported on Bedrock @@ -29,11 +32,193 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "" os.environ["AWS_REGION_NAME"] = "" response = completion( - model="bedrock/anthropic.claude-instant-v1", + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", messages=[{ "content": "Hello, how are you?","role": "user"}] ) ``` +## OpenAI Proxy Usage + +Here's how to call Anthropic with the LiteLLM Proxy Server + +### 1. Save key in your environment + +```bash +export AWS_ACCESS_KEY_ID="" +export AWS_SECRET_ACCESS_KEY="" +export AWS_REGION_NAME="" +``` + +### 2. Start the proxy + +```bash +$ litellm --model anthropic.claude-3-sonnet-20240229-v1:0 + +# Server running on http://0.0.0.0:8000 +``` + +### 3. Test it + + + + + +```shell +curl --location 'http://0.0.0.0:8000/chat/completions' \ +--header 'Content-Type: application/json' \ +--data ' { + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": "what llm are you" + } + ] + } +' +``` + + + +```python +import openai +client = openai.OpenAI( + api_key="anything", + base_url="http://0.0.0.0:8000" +) + +# request sent to model set on litellm proxy, `litellm --model` +response = client.chat.completions.create(model="gpt-3.5-turbo", messages = [ + { + "role": "user", + "content": "this is a test request, write a short poem" + } +]) + +print(response) + +``` + + + +```python +from langchain.chat_models import ChatOpenAI +from langchain.prompts.chat import ( + ChatPromptTemplate, + HumanMessagePromptTemplate, + SystemMessagePromptTemplate, +) +from langchain.schema import HumanMessage, SystemMessage + +chat = ChatOpenAI( + openai_api_base="http://0.0.0.0:8000", # set openai_api_base to the LiteLLM Proxy + model = "gpt-3.5-turbo", + temperature=0.1 +) + +messages = [ + SystemMessage( + content="You are a helpful assistant that im using to make a test request to." + ), + HumanMessage( + content="test from litellm. tell me why it's amazing in 1 sentence" + ), +] +response = chat(messages) + +print(response) +``` + + + +## Usage - Function Calling + +```python +from litellm import completion + +# set env +os.environ["AWS_ACCESS_KEY_ID"] = "" +os.environ["AWS_SECRET_ACCESS_KEY"] = "" +os.environ["AWS_REGION_NAME"] = "" + +tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, + }, + "required": ["location"], + }, + }, + } +] +messages = [{"role": "user", "content": "What's the weather like in Boston today?"}] + +response = completion( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + messages=messages, + tools=tools, + tool_choice="auto", +) +# Add any assertions, here to check response args +print(response) +assert isinstance(response.choices[0].message.tool_calls[0].function.name, str) +assert isinstance( + response.choices[0].message.tool_calls[0].function.arguments, str +) +``` + + +## Usage - Vision + +```python +from litellm import completion + +# set env +os.environ["AWS_ACCESS_KEY_ID"] = "" +os.environ["AWS_SECRET_ACCESS_KEY"] = "" +os.environ["AWS_REGION_NAME"] = "" + + +def encode_image(image_path): + import base64 + + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") + + +image_path = "../proxy/cached_logo.jpg" +# Getting the base64 string +base64_image = encode_image(image_path) +resp = litellm.completion( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + messages=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "Whats in this image?"}, + { + "type": "image_url", + "image_url": { + "url": "data:image/jpeg;base64," + base64_image + }, + }, + ], + } + ], +) +print(f"\nResponse: {resp}") +``` + ## Usage - "Assistant Pre-fill" If you're using Anthropic's Claude with Bedrock, you can "put words in Claude's mouth" by including an `assistant` role message as the last item in the `messages` array. @@ -288,6 +473,7 @@ Here's an example of using a bedrock model with LiteLLM | Model Name | Command | |----------------------------|------------------------------------------------------------------| +| Anthropic Claude-V3 | `completion(model='bedrock/anthropic.claude-3-sonnet-20240229-v1:0', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | | Anthropic Claude-V2.1 | `completion(model='bedrock/anthropic.claude-v2:1', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | | Anthropic Claude-V2 | `completion(model='bedrock/anthropic.claude-v2', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | | Anthropic Claude-Instant V1 | `completion(model='bedrock/anthropic.claude-instant-v1', messages=messages)` | `os.environ['ANTHROPIC_ACCESS_KEY_ID']`, `os.environ['ANTHROPIC_SECRET_ACCESS_KEY']` | From 7d824225a5fcccbc5887c081f2ef2566d8f4c61c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 5 Mar 2024 21:37:59 -0800 Subject: [PATCH 163/304] fix(utils.py): set status code for api error --- litellm/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/utils.py b/litellm/utils.py index ba40cdcf5..c2b1a730f 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -6655,6 +6655,7 @@ def exception_type( method="POST", url="https://api.openai.com/v1" ) raise APIError( + status_code=500, message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, From 2313f5f90a4f56d01406105bfe0e4adbf3d7bc8f Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 10:21:25 -0800 Subject: [PATCH 164/304] (feat) handle litellm circular ref error --- litellm/proxy/utils.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 527b66f8c..ddce2b221 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -507,6 +507,18 @@ class PrismaClient: return hashed_token + def handle_circular_references(obj: Any): + try: + # Try to serialize the object using default serialization + return json.dumps(obj) + except Exception as e: + # If a TypeError is raised, return an error message JSON + error_message: dict = { + "error": "Error converting to JSON", + "error_message": str(e), + } + return json.dumps(error_message) + def jsonify_object(self, data: dict) -> dict: db_data = copy.deepcopy(data) @@ -1641,10 +1653,27 @@ def get_logging_payload(kwargs, response_obj, start_time, end_time): if api_key is not None and isinstance(api_key, str) and api_key.startswith("sk-"): # hash the api_key api_key = hash_token(api_key) - if "headers" in metadata and "authorization" in metadata["headers"]: - metadata["headers"].pop( - "authorization" - ) # do not store the original `sk-..` api key in the db + + # clean up litellm metadata + if isinstance(metadata, dict): + clean_metadata = {} + verbose_proxy_logger.debug( + f"getting payload for SpendLogs, available keys in metadata: " + + str(list(metadata.keys())) + ) + for key in metadata: + if key in [ + "headers", + "endpoint", + "model_group", + "deployment", + "model_info", + "caching_groups", + ]: + continue + else: + clean_metadata[key] = metadata[key] + if litellm.cache is not None: cache_key = litellm.cache.get_cache_key(**kwargs) else: @@ -1668,7 +1697,7 @@ def get_logging_payload(kwargs, response_obj, start_time, end_time): "team_id": kwargs.get("litellm_params", {}) .get("metadata", {}) .get("user_api_key_team_id", ""), - "metadata": metadata, + "metadata": clean_metadata, "cache_key": cache_key, "spend": kwargs.get("response_cost", 0), "total_tokens": usage.get("total_tokens", 0), From 81b92f3434e8ae8cb1837643720cb794dbbd5aa4 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 11:09:50 -0800 Subject: [PATCH 165/304] fix(factory.py): support image url requests for anthropic --- litellm/llms/prompt_templates/factory.py | 57 +++++++++++++++++++----- litellm/tests/test_completion.py | 55 +++++++++++++++++++++-- 2 files changed, 97 insertions(+), 15 deletions(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index b49cae5f3..e776bee50 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -2,7 +2,7 @@ from enum import Enum import requests, traceback import json, re, xml.etree.ElementTree as ET from jinja2 import Template, exceptions, Environment, meta -from typing import Optional, Any, List +from typing import Optional, Any import imghdr, base64 @@ -481,6 +481,34 @@ def construct_tool_use_system_prompt( return tool_use_system_prompt +def convert_url_to_base64(url): + import requests + import base64 + + response = requests.get(url) + if response.status_code == 200: + image_bytes = response.content + base64_image = base64.b64encode(image_bytes).decode("utf-8") + + img_type = url.split(".")[-1].lower() + if img_type == "jpg" or img_type == "jpeg": + img_type = "image/jpeg" + elif img_type == "png": + img_type = "image/png" + elif img_type == "gif": + img_type = "image/gif" + elif img_type == "webp": + img_type = "image/webp" + else: + raise Exception( + f"Error: Unsupported image format. Format={img_type}. Supported types = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']" + ) + + return f"data:{img_type};base64,{base64_image}" + else: + raise Exception(f"Error: Unable to fetch image from URL. url={url}") + + def convert_to_anthropic_image_obj(openai_image_url: str): """ Input: @@ -493,17 +521,24 @@ def convert_to_anthropic_image_obj(openai_image_url: str): "data": {base64_image}, } """ - # Extract the base64 image data - base64_data = openai_image_url.split("data:image/")[1].split(";base64,")[1] + try: + if openai_image_url.startswith("http"): + openai_image_url = convert_url_to_base64(url=openai_image_url) + # Extract the base64 image data + base64_data = openai_image_url.split("data:image/")[1].split(";base64,")[1] - # Infer image format from the URL - image_format = openai_image_url.split("data:image/")[1].split(";base64,")[0] + # Infer image format from the URL + image_format = openai_image_url.split("data:image/")[1].split(";base64,")[0] - return { - "type": "base64", - "media_type": f"image/{image_format}", - "data": base64_data, - } + return { + "type": "base64", + "media_type": f"image/{image_format}", + "data": base64_data, + } + except Exception as e: + raise Exception( + """Image url not in expected format. Example Expected input - "image_url": "data:image/jpeg;base64,{base64_image}". Supported formats - ['image/jpeg', 'image/png', 'image/gif', 'image/webp'] """ + ) def anthropic_messages_pt(messages: list): @@ -586,7 +621,7 @@ def anthropic_messages_pt(messages: list): return new_messages -def extract_between_tags(tag: str, string: str, strip: bool = False) -> List[str]: +def extract_between_tags(tag: str, string: str, strip: bool = False) -> list[str]: ext_list = re.findall(f"<{tag}>(.+?)", string, re.DOTALL) if strip: ext_list = [e.strip() for e in ext_list] diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 1423c7c43..af00275d3 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -151,8 +151,6 @@ def test_completion_claude_3_function_call(): assert isinstance( response.choices[0].message.tool_calls[0].function.arguments, str ) - except litellm.ServiceUnavailableError as e: - pass except Exception as e: pytest.fail(f"Error occurred: {e}") @@ -221,6 +219,55 @@ def test_completion_claude_3_base64(): pytest.fail(f"An exception occurred - {str(e)}") +def test_completion_claude_3_function_plus_image(): + litellm.set_verbose = True + + image_content = [ + {"type": "text", "text": "What’s in this image?"}, + { + "type": "image_url", + "image_url": { + "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" + }, + }, + ] + image_message = {"role": "user", "content": image_content} + + tools = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get the current weather in a given location", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "text", + "description": "The city and state, e.g. San Francisco, CA", + }, + "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, + }, + "required": ["location"], + }, + }, + } + ] + + tool_choice = {"type": "function", "function": {"name": "get_current_weather"}} + messages = [{"role": "user", "content": "What's the weather like in Boston today?"}] + + response = completion( + model="claude-3-sonnet-20240229", + messages=[image_message], + tool_choice=tool_choice, + tools=tools, + stream=False, + ) + + print(response) + + def test_completion_mistral_api(): try: litellm.set_verbose = True @@ -1406,9 +1453,9 @@ def test_completion_replicate_vicuna(): def test_replicate_custom_prompt_dict(): litellm.set_verbose = True - model_name = "replicate/mistralai/mixtral-8x7b-instruct-v0.1" + model_name = "replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0" litellm.register_prompt_template( - model="replicate/mistralai/mixtral-8x7b-instruct-v0.1", + model="replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0", initial_prompt_value="You are a good assistant", # [OPTIONAL] roles={ "system": { From c17789f170321ab3800e4b0a036daa7a9879a140 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 12:02:44 -0800 Subject: [PATCH 166/304] (fix) circular ref error h --- litellm/proxy/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index ddce2b221..9a2752148 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -1669,6 +1669,7 @@ def get_logging_payload(kwargs, response_obj, start_time, end_time): "deployment", "model_info", "caching_groups", + "previous_models", ]: continue else: From ee468a4e05b710cb44fffc61ff7c75f090b4f5a5 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 12:08:22 -0800 Subject: [PATCH 167/304] (feat) circular ref error on prisa --- litellm/proxy/utils.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 9a2752148..1e701515e 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -507,24 +507,16 @@ class PrismaClient: return hashed_token - def handle_circular_references(obj: Any): - try: - # Try to serialize the object using default serialization - return json.dumps(obj) - except Exception as e: - # If a TypeError is raised, return an error message JSON - error_message: dict = { - "error": "Error converting to JSON", - "error_message": str(e), - } - return json.dumps(error_message) - def jsonify_object(self, data: dict) -> dict: db_data = copy.deepcopy(data) for k, v in db_data.items(): if isinstance(v, dict): - db_data[k] = json.dumps(v) + try: + db_data[k] = json.dumps(v) + except: + # This avoids Prisma retrying this 5 times, and making 5 clients + db_data[k] = "failed-to-serialize-json" return db_data @backoff.on_exception( From 74e50d9d351526c8b14d2d974f94804aa2103ef0 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 12:17:59 -0800 Subject: [PATCH 168/304] (fix) high traffic langfuse logging --- litellm/integrations/langfuse.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/litellm/integrations/langfuse.py b/litellm/integrations/langfuse.py index bb8b62b50..8d135e849 100644 --- a/litellm/integrations/langfuse.py +++ b/litellm/integrations/langfuse.py @@ -265,8 +265,14 @@ class LangFuseLogger: cost = kwargs.get("response_cost", None) print_verbose(f"trace: {cost}") - if supports_tags: + + # Clean Metadata before logging - never log raw metadata + # the raw metadata can contain circular references which leads to infinite recursion + # we clean out all extra litellm metadata params before logging + clean_metadata = {} + if isinstance(metadata, dict): for key, value in metadata.items(): + # generate langfuse tags if key in [ "user_api_key", "user_api_key_user_id", @@ -274,6 +280,22 @@ class LangFuseLogger: "semantic-similarity", ]: tags.append(f"{key}:{value}") + + # clean litellm metadata before logging + if key in [ + "headers", + "endpoint", + "model_group", + "deployment", + "model_info", + "caching_groups", + "previous_models", + ]: + continue + else: + clean_metadata[key] = value + + if supports_tags: if "cache_hit" in kwargs: if kwargs["cache_hit"] is None: kwargs["cache_hit"] = False @@ -301,7 +323,7 @@ class LangFuseLogger: "input": input, "output": output, "usage": usage, - "metadata": metadata, + "metadata": clean_metadata, "level": level, } From c4079b2548e93b0f9d9e1b74ad22d7f1094152cb Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 12:22:52 -0800 Subject: [PATCH 169/304] (fix) high traffic langfuse, s3 --- litellm/integrations/langfuse.py | 3 --- litellm/integrations/s3.py | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/litellm/integrations/langfuse.py b/litellm/integrations/langfuse.py index 8d135e849..efb5b29fe 100644 --- a/litellm/integrations/langfuse.py +++ b/litellm/integrations/langfuse.py @@ -285,9 +285,6 @@ class LangFuseLogger: if key in [ "headers", "endpoint", - "model_group", - "deployment", - "model_info", "caching_groups", "previous_models", ]: diff --git a/litellm/integrations/s3.py b/litellm/integrations/s3.py index e25b39777..dc35430bc 100644 --- a/litellm/integrations/s3.py +++ b/litellm/integrations/s3.py @@ -104,6 +104,23 @@ class S3Logger: usage = response_obj["usage"] id = response_obj.get("id", str(uuid.uuid4())) + # Clean Metadata before logging - never log raw metadata + # the raw metadata can contain circular references which leads to infinite recursion + # we clean out all extra litellm metadata params before logging + clean_metadata = {} + if isinstance(metadata, dict): + for key, value in metadata.items(): + # clean litellm metadata before logging + if key in [ + "headers", + "endpoint", + "caching_groups", + "previous_models", + ]: + continue + else: + clean_metadata[key] = value + # Build the initial payload payload = { "id": id, @@ -117,7 +134,7 @@ class S3Logger: "messages": messages, "response": response_obj, "usage": usage, - "metadata": metadata, + "metadata": clean_metadata, } # Ensure everything in the payload is converted to str From 929489111d24ad0ddac6f92db2f0a1067a298a17 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 12:59:09 -0800 Subject: [PATCH 170/304] (feat) admin UI show model avg latency, num requests --- .../src/components/model_dashboard.tsx | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/ui/litellm-dashboard/src/components/model_dashboard.tsx b/ui/litellm-dashboard/src/components/model_dashboard.tsx index f18d76e6a..18bb8776a 100644 --- a/ui/litellm-dashboard/src/components/model_dashboard.tsx +++ b/ui/litellm-dashboard/src/components/model_dashboard.tsx @@ -208,13 +208,26 @@ const ModelDashboard: React.FC = ({ - Model Statistics (Number Requests, Latency) + Model Statistics (Number Requests) + + + Model Statistics (Latency) + From cdb960eb342a63434170745763fb01def778f408 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 14:00:20 -0800 Subject: [PATCH 171/304] fix(vertex_ai.py): correctly parse optional params and pass vertex ai project --- litellm/llms/vertex_ai.py | 7 ++++ litellm/main.py | 1 + .../tests/test_amazing_vertex_completion.py | 28 +++++++++++++ litellm/tests/test_embedding.py | 25 ----------- .../test_get_optional_params_embeddings.py | 42 +++++++++++++++++++ 5 files changed, 78 insertions(+), 25 deletions(-) create mode 100644 litellm/tests/test_get_optional_params_embeddings.py diff --git a/litellm/llms/vertex_ai.py b/litellm/llms/vertex_ai.py index 5b99683ca..0a7980fda 100644 --- a/litellm/llms/vertex_ai.py +++ b/litellm/llms/vertex_ai.py @@ -1047,6 +1047,7 @@ def embedding( vertex_project=None, vertex_location=None, aembedding=False, + print_verbose=None, ): # logic for parsing in - calling - parsing out model embedding calls try: @@ -1062,7 +1063,13 @@ def embedding( ## Load credentials with the correct quota project ref: https://github.com/googleapis/python-aiplatform/issues/2557#issuecomment-1709284744 try: + print_verbose( + f"VERTEX AI: vertex_project={vertex_project}; vertex_location={vertex_location}" + ) creds, _ = google.auth.default(quota_project_id=vertex_project) + print_verbose( + f"VERTEX AI: creds={creds}; google application credentials: {os.getenv('GOOGLE_APPLICATION_CREDENTIALS')}" + ) vertexai.init( project=vertex_project, location=vertex_location, credentials=creds ) diff --git a/litellm/main.py b/litellm/main.py index 60effd96f..63649844a 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -2617,6 +2617,7 @@ def embedding( vertex_project=vertex_ai_project, vertex_location=vertex_ai_location, aembedding=aembedding, + print_verbose=print_verbose, ) elif custom_llm_provider == "oobabooga": response = oobabooga.embedding( diff --git a/litellm/tests/test_amazing_vertex_completion.py b/litellm/tests/test_amazing_vertex_completion.py index 8ed15db65..67db9b61c 100644 --- a/litellm/tests/test_amazing_vertex_completion.py +++ b/litellm/tests/test_amazing_vertex_completion.py @@ -451,6 +451,34 @@ async def test_gemini_pro_async_function_calling(): # asyncio.run(gemini_pro_async_function_calling()) + +def test_vertexai_embedding(): + try: + load_vertex_ai_credentials() + # litellm.set_verbose=True + response = embedding( + model="textembedding-gecko@001", + input=["good morning from litellm", "this is another item"], + ) + print(f"response:", response) + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +@pytest.mark.asyncio +async def test_vertexai_aembedding(): + try: + load_vertex_ai_credentials() + # litellm.set_verbose=True + response = await litellm.aembedding( + model="textembedding-gecko@001", + input=["good morning from litellm", "this is another item"], + ) + print(f"response: {response}") + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + # Extra gemini Vision tests for completion + stream, async, async + stream # if we run into issues with gemini, we will also add these to our ci/cd pipeline # def test_gemini_pro_vision_stream(): diff --git a/litellm/tests/test_embedding.py b/litellm/tests/test_embedding.py index a2f71eb98..c32a55353 100644 --- a/litellm/tests/test_embedding.py +++ b/litellm/tests/test_embedding.py @@ -231,31 +231,6 @@ def test_cohere_embedding3(): # test_cohere_embedding3() -def test_vertexai_embedding(): - try: - # litellm.set_verbose=True - response = embedding( - model="textembedding-gecko@001", - input=["good morning from litellm", "this is another item"], - ) - print(f"response:", response) - except Exception as e: - pytest.fail(f"Error occurred: {e}") - - -@pytest.mark.asyncio -async def test_vertexai_aembedding(): - try: - # litellm.set_verbose=True - response = await litellm.aembedding( - model="textembedding-gecko@001", - input=["good morning from litellm", "this is another item"], - ) - print(f"response: {response}") - except Exception as e: - pytest.fail(f"Error occurred: {e}") - - def test_bedrock_embedding_titan(): try: # this tests if we support str input for bedrock embedding diff --git a/litellm/tests/test_get_optional_params_embeddings.py b/litellm/tests/test_get_optional_params_embeddings.py new file mode 100644 index 000000000..41396b531 --- /dev/null +++ b/litellm/tests/test_get_optional_params_embeddings.py @@ -0,0 +1,42 @@ +# What is this? +## This tests the `get_optional_params_embeddings` function +import sys, os +import traceback +from dotenv import load_dotenv + +load_dotenv() +import os, io + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +import pytest +import litellm +from litellm import embedding +from litellm.utils import get_optional_params_embeddings, get_llm_provider + + +def test_vertex_projects(): + litellm.drop_params = True + model, custom_llm_provider, _, _ = get_llm_provider( + model="vertex_ai/textembedding-gecko" + ) + optional_params = get_optional_params_embeddings( + model=model, + user="test-litellm-user-5", + dimensions=None, + encoding_format="base64", + custom_llm_provider=custom_llm_provider, + **{ + "vertex_ai_project": "my-test-project", + "vertex_ai_location": "us-east-1", + }, + ) + + print(f"received optional_params: {optional_params}") + + assert "vertex_ai_project" in optional_params + assert "vertex_ai_location" in optional_params + + +# test_vertex_projects() From ac5137f442c4e6bd09896bc7e5ecbfa3fbb667ed Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 14:01:39 -0800 Subject: [PATCH 172/304] (fix) admin UI swagger --- litellm/proxy/proxy_server.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 409cf63d5..0d14b5f52 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -4357,25 +4357,21 @@ async def view_daily_metrics( ) async def new_user(data: NewUserRequest): """ - Use this to create a new user with a budget. + Use this to create a new user with a budget. This creates a new user and generates a new api key for the new user. The new api key is returned. Returns user id, budget + new key. Parameters: - user_id: Optional[str] - Specify a user id. If not set, a unique id will be generated. - user_email: Optional[str] - Specify a user email. - - user_role: Optional[str] - Specify a user role - "proxy_admin", "app_owner", "app_user" + - user_role: Optional[str] - Specify a user role - "admin", "app_owner", "app_user" - max_budget: Optional[float] - Specify max budget for a given user. - - duration: Optional[str] - Specify the length of time the token is valid for. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"). **(Default is set to 1 hour.)** - models: Optional[list] - Model_name's a user is allowed to call. (if empty, key is allowed to call all models) - - aliases: Optional[dict] - Any alias mappings, on top of anything in the config.yaml model list. - https://docs.litellm.ai/docs/proxy/virtual_keys#managing-auth---upgradedowngrade-models - - config: Optional[dict] - any key-specific configs, overrides config in config.yaml - - spend: Optional[int] - Amount spent by key. Default is 0. Will be updated by proxy whenever key is used. https://docs.litellm.ai/docs/proxy/virtual_keys#managing-auth---tracking-spend - - max_parallel_requests: Optional[int] - Rate limit a user based on the number of parallel requests. Raises 429 error, if user's parallel requests > x. - - metadata: Optional[dict] - Metadata for key, store information for key. Example metadata = {"team": "core-infra", "app": "app2", "email": "ishaan@berri.ai" } + - tpm_limit: Optional[int] - Specify tpm limit for a given user (Tokens per minute) + - rpm_limit: Optional[int] - Specify rpm limit for a given user (Requests per minute) Returns: - - key: (str) The generated api key + - key: (str) The generated api key for the user - expires: (datetime) Datetime object for when key expires. - user_id: (str) Unique user id - used for tracking spend across multiple keys for same user id. - max_budget: (float|None) Max budget for given user. From 6aadfb347244e5d6b9ce41d793649cd2a2ece71f Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 15:40:22 -0800 Subject: [PATCH 173/304] (fix) remove unuse endpoint --- litellm/proxy/proxy_server.py | 112 ---------------------------------- 1 file changed, 112 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 0d14b5f52..2a8aa8037 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3918,59 +3918,6 @@ async def view_spend_logs( -H "Authorization: Bearer sk-1234" ``` """ - if os.getenv("CLICKHOUSE_HOST") is not None: - # gettting spend logs from clickhouse - from litellm.proxy.enterprise.utils import view_spend_logs_from_clickhouse - - daily_metrics = await view_daily_metrics( - start_date=start_date, - end_date=end_date, - ) - - # get the top api keys across all daily_metrics - top_api_keys = {} # type: ignore - - # make this compatible with the admin UI - for response in daily_metrics.get("daily_spend", {}): - response["startTime"] = response["day"] - response["spend"] = response["daily_spend"] - response["models"] = response["spend_per_model"] - response["users"] = {"ishaan": 0.0} - spend_per_api_key = response["spend_per_api_key"] - - # insert spend_per_api_key key, values in response - for key, value in spend_per_api_key.items(): - response[key] = value - top_api_keys[key] = top_api_keys.get(key, 0.0) + value - - del response["day"] - del response["daily_spend"] - del response["spend_per_model"] - del response["spend_per_api_key"] - - # get top 5 api keys - top_api_keys = sorted(top_api_keys.items(), key=lambda x: x[1], reverse=True) # type: ignore - top_api_keys = top_api_keys[:5] # type: ignore - top_api_keys = dict(top_api_keys) # type: ignore - """ - set it like this - { - "key" : key, - "spend:" : spend - } - """ - # we need this to show on the Admin UI - response_keys = [] - for key in top_api_keys.items(): - response_keys.append( - { - "key": key[0], - "spend": key[1], - } - ) - daily_metrics["top_api_keys"] = response_keys - - return daily_metrics global prisma_client try: verbose_proxy_logger.debug("inside view_spend_logs") @@ -4289,65 +4236,6 @@ async def global_predict_spend_logs(request: Request): return _forecast_daily_cost(data) -@router.get( - "/daily_metrics", - summary="Get daily spend metrics", - tags=["budget & spend Tracking"], - dependencies=[Depends(user_api_key_auth)], -) -async def view_daily_metrics( - start_date: Optional[str] = fastapi.Query( - default=None, - description="Time from which to start viewing key spend", - ), - end_date: Optional[str] = fastapi.Query( - default=None, - description="Time till which to view key spend", - ), -): - """ - [BETA] This is a beta endpoint. It might change without notice. - - Please give feedback - https://github.com/BerriAI/litellm/issues - """ - try: - if os.getenv("CLICKHOUSE_HOST") is not None: - # gettting spend logs from clickhouse - from litellm.integrations import clickhouse - - return clickhouse.build_daily_metrics() - - # create a response object - """ - { - "date": "2022-01-01", - "spend": 0.0, - "users": {}, - "models": {}, - } - """ - else: - raise Exception( - "Clickhouse: Clickhouse host not set. Required for viewing /daily/metrics" - ) - except Exception as e: - if isinstance(e, HTTPException): - raise ProxyException( - message=getattr(e, "detail", f"/spend/logs Error({str(e)})"), - type="internal_error", - param=getattr(e, "param", "None"), - code=getattr(e, "status_code", status.HTTP_500_INTERNAL_SERVER_ERROR), - ) - elif isinstance(e, ProxyException): - raise e - raise ProxyException( - message="/spend/logs Error" + str(e), - type="internal_error", - param=getattr(e, "param", "None"), - code=status.HTTP_500_INTERNAL_SERVER_ERROR, - ) - - #### USER MANAGEMENT #### @router.post( "/user/new", From 8a3941ad277870a7c3ff4b885ba2b3e73e5dda31 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 15:42:09 -0800 Subject: [PATCH 174/304] =?UTF-8?q?bump:=20version=201.29.5=20=E2=86=92=20?= =?UTF-8?q?1.29.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 781d18cb1..c74cf9ad5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.5" +version = "1.29.6" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.5" +version = "1.29.6" version_files = [ "pyproject.toml:^version" ] From 32adb4e80d0980075121987fe47141b5417800d0 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 15:42:11 -0800 Subject: [PATCH 175/304] =?UTF-8?q?bump:=20version=201.29.6=20=E2=86=92=20?= =?UTF-8?q?1.29.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c74cf9ad5..2daa57b91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.6" +version = "1.29.7" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.6" +version = "1.29.7" version_files = [ "pyproject.toml:^version" ] From c50b0e315a632fa79e16befb86e1a36c315188c9 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 16:31:32 -0800 Subject: [PATCH 176/304] (feat) don't use --detailed_debug on all default litellm images --- Dockerfile | 5 ++++- Dockerfile.database | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index bcb4ee692..24c11c513 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,4 +61,7 @@ RUN chmod +x entrypoint.sh EXPOSE 4000/tcp ENTRYPOINT ["litellm"] -CMD ["--port", "4000", "--config", "./proxy_server_config.yaml", "--detailed_debug", "--run_gunicorn"] \ No newline at end of file + +# Append "--detailed_debug" to the end of CMD to view detailed debug logs +# CMD ["--port", "4000", "--config", "./proxy_server_config.yaml", "--run_gunicorn", "--detailed_debug"] +CMD ["--port", "4000", "--config", "./proxy_server_config.yaml", "--run_gunicorn"] \ No newline at end of file diff --git a/Dockerfile.database b/Dockerfile.database index 1206aba88..9e2d1637b 100644 --- a/Dockerfile.database +++ b/Dockerfile.database @@ -65,4 +65,7 @@ EXPOSE 4000/tcp # # Set your entrypoint and command ENTRYPOINT ["litellm"] + +# Append "--detailed_debug" to the end of CMD to view detailed debug logs +# CMD ["--port", "4000","--run_gunicorn", "--detailed_debug"] CMD ["--port", "4000", "--run_gunicorn"] From 547f0a023d1adb73e0e822966e45900baf4951af Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 16:36:35 -0800 Subject: [PATCH 177/304] (docs) best practices for high traffic --- docs/my-website/docs/proxy/deploy.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index e07d59b91..8ffc2adf5 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -183,6 +183,10 @@ Your OpenAI proxy server is now running on `http://127.0.0.1:8000`. +## Best Practices for Deploying to Production +### 1. Switch of debug logs in production +don't use [`--detailed-debug`, `--debug`](https://docs.litellm.ai/docs/proxy/debugging#detailed-debug) or `litellm.set_verbose=True`. We found using debug logs can add 5-10% latency per LLM API call + ## Advanced Deployment Settings ### Customization of the server root path From ca97ea8acdb74c84b72bfb689a1909bc1670fcf4 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 17:42:08 -0800 Subject: [PATCH 178/304] feat(proxy_server.py): team based model aliases allow setting model aliases at a team level (e.g. route all 'gpt-3.5-turbo' requests from team-1 to model-deployment-group-2) --- litellm/proxy/_types.py | 17 +++++++++++++++-- litellm/proxy/proxy_server.py | 28 ++++++++++++++++++++++++++-- litellm/proxy/schema.prisma | 13 +++++++++++++ litellm/proxy/utils.py | 15 ++++++++++++--- schema.prisma | 13 +++++++++++++ 5 files changed, 79 insertions(+), 7 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 7ae67bdc6..fd85280dd 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -212,6 +212,12 @@ class KeyRequest(LiteLLMBase): keys: List[str] +class LiteLLM_ModelTable(LiteLLMBase): + model_aliases: Optional[str] = None # json dump the dict + created_by: str + updated_by: str + + class NewUserRequest(GenerateKeyRequest): max_budget: Optional[float] = None user_email: Optional[str] = None @@ -251,7 +257,7 @@ class Member(LiteLLMBase): return values -class NewTeamRequest(LiteLLMBase): +class TeamBase(LiteLLMBase): team_alias: Optional[str] = None team_id: Optional[str] = None organization_id: Optional[str] = None @@ -265,6 +271,10 @@ class NewTeamRequest(LiteLLMBase): models: list = [] +class NewTeamRequest(TeamBase): + model_aliases: Optional[dict] = None + + class GlobalEndUsersSpend(LiteLLMBase): api_key: Optional[str] = None @@ -299,11 +309,12 @@ class DeleteTeamRequest(LiteLLMBase): team_ids: List[str] # required -class LiteLLM_TeamTable(NewTeamRequest): +class LiteLLM_TeamTable(TeamBase): spend: Optional[float] = None max_parallel_requests: Optional[int] = None budget_duration: Optional[str] = None budget_reset_at: Optional[datetime] = None + model_id: Optional[int] = None @root_validator(pre=True) def set_model_info(cls, values): @@ -313,6 +324,7 @@ class LiteLLM_TeamTable(NewTeamRequest): "config", "permissions", "model_max_budget", + "model_aliases", ] for field in dict_fields: value = values.get(field) @@ -542,6 +554,7 @@ class LiteLLM_VerificationTokenView(LiteLLM_VerificationToken): team_rpm_limit: Optional[int] = None team_max_budget: Optional[float] = None soft_budget: Optional[float] = None + team_model_aliases: Optional[Dict] = None class UserAPIKeyAuth( diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 409cf63d5..5ee3b751f 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -405,7 +405,15 @@ async def user_api_key_auth( ) # request data, used across all checks. Making this easily available # Check 1. If token can call model - litellm.model_alias_map = valid_token.aliases + _model_alias_map = {} + if valid_token.team_model_aliases is not None: + _model_alias_map = { + **valid_token.aliases, + **valid_token.team_model_aliases, + } + else: + _model_alias_map = {**valid_token.aliases} + litellm.model_alias_map = _model_alias_map config = valid_token.config if config != {}: model_list = config.get("model_list", []) @@ -5020,11 +5028,27 @@ async def new_team( Member(role="admin", user_id=user_api_key_dict.user_id) ) + ## ADD TO MODEL TABLE + _model_id = None + if data.model_aliases is not None and isinstance(data.model_aliases, dict): + litellm_modeltable = LiteLLM_ModelTable( + model_aliases=json.dumps(data.model_aliases), + created_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + updated_by=user_api_key_dict.user_id or litellm_proxy_admin_name, + ) + model_dict = await prisma_client.db.litellm_modeltable.create( + {**litellm_modeltable.json(exclude_none=True)} # type: ignore + ) # type: ignore + + _model_id = model_dict.id + + ## ADD TO TEAM TABLE complete_team_data = LiteLLM_TeamTable( **data.json(), max_parallel_requests=user_api_key_dict.max_parallel_requests, budget_duration=user_api_key_dict.budget_duration, budget_reset_at=user_api_key_dict.budget_reset_at, + model_id=_model_id, ) team_row = await prisma_client.insert_data( @@ -5495,7 +5519,7 @@ async def new_organization( - `organization_alias`: *str* = The name of the organization. - `models`: *List* = The models the organization has access to. - `budget_id`: *Optional[str]* = The id for a budget (tpm/rpm/max budget) for the organization. - ### IF NO BUDGET - CREATE ONE WITH THESE PARAMS ### + ### IF NO BUDGET ID - CREATE ONE WITH THESE PARAMS ### - `max_budget`: *Optional[float]* = Max budget for org - `tpm_limit`: *Optional[int]* = Max tpm limit for org - `rpm_limit`: *Optional[int]* = Max rpm limit for org diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 265bf32c0..d8c8faf16 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -42,6 +42,17 @@ model LiteLLM_OrganizationTable { teams LiteLLM_TeamTable[] } +// Model info for teams, just has model aliases for now. +model LiteLLM_ModelTable { + id Int @id @default(autoincrement()) + model_aliases Json? @map("aliases") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + team LiteLLM_TeamTable? +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { team_id String @id @default(uuid()) @@ -63,7 +74,9 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + model_id Int? @unique litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) } // Track spend, rate limit, budget Users diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 1e701515e..ee5e323e8 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -965,12 +965,21 @@ class PrismaClient: ) sql_query = f""" - SELECT * - FROM "LiteLLM_VerificationTokenView" - WHERE token = '{token}' + SELECT + v.*, + t.spend AS team_spend, + t.max_budget AS team_max_budget, + t.tpm_limit AS team_tpm_limit, + t.rpm_limit AS team_rpm_limit, + m.aliases as team_model_aliases + FROM "LiteLLM_VerificationToken" AS v + INNER JOIN "LiteLLM_TeamTable" AS t ON v.team_id = t.team_id + LEFT JOIN "LiteLLM_ModelTable" m ON t.model_id = m.id + WHERE v.token = '{token}' """ response = await self.db.query_first(query=sql_query) + if response is not None: response = LiteLLM_VerificationTokenView(**response) # for prisma we need to cast the expires time to str diff --git a/schema.prisma b/schema.prisma index 265bf32c0..d8c8faf16 100644 --- a/schema.prisma +++ b/schema.prisma @@ -42,6 +42,17 @@ model LiteLLM_OrganizationTable { teams LiteLLM_TeamTable[] } +// Model info for teams, just has model aliases for now. +model LiteLLM_ModelTable { + id Int @id @default(autoincrement()) + model_aliases Json? @map("aliases") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + team LiteLLM_TeamTable? +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { team_id String @id @default(uuid()) @@ -63,7 +74,9 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + model_id Int? @unique litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) } // Track spend, rate limit, budget Users From d3818713adeacfe9c7c53e64d67725d09434ac2e Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 17:53:01 -0800 Subject: [PATCH 179/304] (fix) dict changed size during iteration --- litellm/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index 68dc137af..3d86ef84a 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1127,7 +1127,7 @@ class Logging: self.model_call_details["cache_hit"] = cache_hit ## if model in model cost map - log the response cost ## else set cost to None - verbose_logger.debug(f"Model={self.model}; result={result}") + verbose_logger.debug(f"Model={self.model};") if ( result is not None and ( From 726dad57560888c619943dc4fc73aa83cf34a38e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 18:07:28 -0800 Subject: [PATCH 180/304] fix(caching.py): add s3 path as a top-level param --- litellm/caching.py | 3 +++ litellm/tests/test_caching.py | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/litellm/caching.py b/litellm/caching.py index ac9d559dc..bf11f4c39 100644 --- a/litellm/caching.py +++ b/litellm/caching.py @@ -572,6 +572,7 @@ class S3Cache(BaseCache): self.bucket_name = s3_bucket_name self.key_prefix = s3_path.rstrip("/") + "/" if s3_path else "" # Create an S3 client with custom endpoint URL + self.s3_client = boto3.client( "s3", region_name=s3_region_name, @@ -776,6 +777,7 @@ class Cache: s3_aws_secret_access_key: Optional[str] = None, s3_aws_session_token: Optional[str] = None, s3_config: Optional[Any] = None, + s3_path: Optional[str] = None, redis_semantic_cache_use_async=False, redis_semantic_cache_embedding_model="text-embedding-ada-002", **kwargs, @@ -825,6 +827,7 @@ class Cache: s3_aws_secret_access_key=s3_aws_secret_access_key, s3_aws_session_token=s3_aws_session_token, s3_config=s3_config, + s3_path=s3_path, **kwargs, ) if "cache" not in litellm.input_callback: diff --git a/litellm/tests/test_caching.py b/litellm/tests/test_caching.py index f649bff02..3518b4cd8 100644 --- a/litellm/tests/test_caching.py +++ b/litellm/tests/test_caching.py @@ -698,7 +698,6 @@ def test_s3_cache_acompletion_stream_azure(): @pytest.mark.asyncio -@pytest.mark.skip(reason="AWS Suspended Account") async def test_s3_cache_acompletion_azure(): import asyncio import logging @@ -717,7 +716,9 @@ async def test_s3_cache_acompletion_azure(): } ] litellm.cache = Cache( - type="s3", s3_bucket_name="cache-bucket-litellm", s3_region_name="us-west-2" + type="s3", + s3_bucket_name="litellm-my-test-bucket-2", + s3_region_name="us-east-1", ) print("s3 Cache: test for caching, streaming + completion") From 6123e349f253624a6845d53b45c6e14d04cc9768 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 18:12:24 -0800 Subject: [PATCH 181/304] (test) fix replicate test --- litellm/tests/test_completion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index af00275d3..0643a8bef 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1453,9 +1453,9 @@ def test_completion_replicate_vicuna(): def test_replicate_custom_prompt_dict(): litellm.set_verbose = True - model_name = "replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0" + model_name = "replicate/meta/llama-2-7b-chat" litellm.register_prompt_template( - model="replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0", + model="replicate/meta/llama-2-7b-chat", initial_prompt_value="You are a good assistant", # [OPTIONAL] roles={ "system": { From c3c0727366ffb6ac562c9636e3322005240dff0e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 18:53:30 -0800 Subject: [PATCH 182/304] fix(factory.py): retry failed get request --- litellm/llms/prompt_templates/factory.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index e776bee50..616833a2e 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -485,7 +485,12 @@ def convert_url_to_base64(url): import requests import base64 - response = requests.get(url) + for _ in range(3): + try: + response = requests.get(url) + break + except: + pass if response.status_code == 200: image_bytes = response.content base64_image = base64.b64encode(image_bytes).decode("utf-8") @@ -536,6 +541,8 @@ def convert_to_anthropic_image_obj(openai_image_url: str): "data": base64_data, } except Exception as e: + if "Error: Unable to fetch image from URL" in str(e): + raise e raise Exception( """Image url not in expected format. Example Expected input - "image_url": "data:image/jpeg;base64,{base64_image}". Supported formats - ['image/jpeg', 'image/png', 'image/gif', 'image/webp'] """ ) From fc16b6650e8e97ee2f4693a40f56c657c165b41c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 18:55:40 -0800 Subject: [PATCH 183/304] build(schema.prisma): add support for team-based model aliases --- litellm/proxy/schema.prisma | 15 ++++++++++++++- schema.prisma | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 265bf32c0..031db99d1 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -42,6 +42,17 @@ model LiteLLM_OrganizationTable { teams LiteLLM_TeamTable[] } +// Model info for teams, just has model aliases for now. +model LiteLLM_ModelTable { + id Int @id @default(autoincrement()) + model_aliases Json? @map("aliases") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + team LiteLLM_TeamTable? +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { team_id String @id @default(uuid()) @@ -63,7 +74,9 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + model_id Int? @unique litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) } // Track spend, rate limit, budget Users @@ -149,4 +162,4 @@ model LiteLLM_UserNotifications { models String[] justification String status String // approved, disapproved, pending -} +} \ No newline at end of file diff --git a/schema.prisma b/schema.prisma index 265bf32c0..031db99d1 100644 --- a/schema.prisma +++ b/schema.prisma @@ -42,6 +42,17 @@ model LiteLLM_OrganizationTable { teams LiteLLM_TeamTable[] } +// Model info for teams, just has model aliases for now. +model LiteLLM_ModelTable { + id Int @id @default(autoincrement()) + model_aliases Json? @map("aliases") + created_at DateTime @default(now()) @map("created_at") + created_by String + updated_at DateTime @default(now()) @updatedAt @map("updated_at") + updated_by String + team LiteLLM_TeamTable? +} + // Assign prod keys to groups, not individuals model LiteLLM_TeamTable { team_id String @id @default(uuid()) @@ -63,7 +74,9 @@ model LiteLLM_TeamTable { updated_at DateTime @default(now()) @updatedAt @map("updated_at") model_spend Json @default("{}") model_max_budget Json @default("{}") + model_id Int? @unique litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) + litellm_model_table LiteLLM_ModelTable? @relation(fields: [model_id], references: [id]) } // Track spend, rate limit, budget Users @@ -149,4 +162,4 @@ model LiteLLM_UserNotifications { models String[] justification String status String // approved, disapproved, pending -} +} \ No newline at end of file From 7e3734d037dbde3538d207082d5e03a8211dbea7 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 19:05:39 -0800 Subject: [PATCH 184/304] test(test_completion.py): handle gemini timeout error --- litellm/tests/test_completion.py | 2 ++ litellm/utils.py | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index f5e145769..8e695f3f7 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -2139,6 +2139,8 @@ async def test_acompletion_gemini(): response = await litellm.acompletion(model=model_name, messages=messages) # Add any assertions here to check the response print(f"response: {response}") + except litellm.Timeout as e: + pass except litellm.APIError as e: pass except Exception as e: diff --git a/litellm/utils.py b/litellm/utils.py index c2b1a730f..d09f330a1 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -7105,7 +7105,10 @@ def exception_type( llm_provider="palm", response=original_exception.response, ) - if "504 Deadline expired before operation could complete." in error_str: + if ( + "504 Deadline expired before operation could complete." in error_str + or "504 Deadline Exceeded" in error_str + ): exception_mapping_worked = True raise Timeout( message=f"PalmException - {original_exception.message}", From f1aa400d91f1483113b25a1bd218ccc5275ba2c6 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 19:07:38 -0800 Subject: [PATCH 185/304] test(test_completion.py): temporary patch for wikipedia get image issue --- litellm/tests/test_completion.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index af00275d3..d2d74bba5 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -219,6 +219,7 @@ def test_completion_claude_3_base64(): pytest.fail(f"An exception occurred - {str(e)}") +@pytest.mark.skip(reason="issue getting wikipedia images in ci/cd") def test_completion_claude_3_function_plus_image(): litellm.set_verbose = True From 2163e43b9a97a58c56b61a196e4f4160aed44f07 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 19:21:57 -0800 Subject: [PATCH 186/304] test(test_parallel_request_limiter.py): add more verbose logging --- litellm/tests/test_parallel_request_limiter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/tests/test_parallel_request_limiter.py b/litellm/tests/test_parallel_request_limiter.py index bd5185a23..627e395cf 100644 --- a/litellm/tests/test_parallel_request_limiter.py +++ b/litellm/tests/test_parallel_request_limiter.py @@ -647,6 +647,7 @@ async def test_streaming_router_tpm_limit(): @pytest.mark.asyncio async def test_bad_router_call(): + litellm.set_verbose = True model_list = [ { "model_name": "azure-model", From d1d8adfb115095701bbd158a9224a4e499f0ad45 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 19:41:12 -0800 Subject: [PATCH 187/304] fix(proxy_server.py): fix sql query --- litellm/proxy/proxy_server.py | 5 ++++- litellm/proxy/utils.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 5ee3b751f..bb4bfe47a 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -831,7 +831,10 @@ async def user_api_key_auth( raise Exception( f"This key is made for LiteLLM UI, Tried to access route: {route}. Not allowed" ) - return UserAPIKeyAuth(api_key=api_key, **valid_token_dict) + if valid_token_dict is not None: + return UserAPIKeyAuth(api_key=api_key, **valid_token_dict) + else: + raise Exception() except Exception as e: # verbose_proxy_logger.debug(f"An exception occurred - {traceback.format_exc()}") traceback.print_exc() diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index ee5e323e8..81130787d 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -973,7 +973,7 @@ class PrismaClient: t.rpm_limit AS team_rpm_limit, m.aliases as team_model_aliases FROM "LiteLLM_VerificationToken" AS v - INNER JOIN "LiteLLM_TeamTable" AS t ON v.team_id = t.team_id + LEFT JOIN "LiteLLM_TeamTable" AS t ON v.team_id = t.team_id LEFT JOIN "LiteLLM_ModelTable" m ON t.model_id = m.id WHERE v.token = '{token}' """ From be6674f5e0715102aba56168508d67bdfe5ea054 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 20:13:09 -0800 Subject: [PATCH 188/304] test(test_completion.py): fix test --- litellm/tests/test_completion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index af00275d3..0643a8bef 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1453,9 +1453,9 @@ def test_completion_replicate_vicuna(): def test_replicate_custom_prompt_dict(): litellm.set_verbose = True - model_name = "replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0" + model_name = "replicate/meta/llama-2-7b-chat" litellm.register_prompt_template( - model="replicate/meta/llama-2-7b-chat:13c3cdee13ee059ab779f0291d29054dab00a47dad8261375654de5540165fb0", + model="replicate/meta/llama-2-7b-chat", initial_prompt_value="You are a good assistant", # [OPTIONAL] roles={ "system": { From 0ee02e1ab98d1269f503865000b42f2a70feac2a Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 20:33:25 -0800 Subject: [PATCH 189/304] (fix) vertex_ai test_vertex_projects optional params embedding --- litellm/utils.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/litellm/utils.py b/litellm/utils.py index e7c95db67..078e677c3 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4006,6 +4006,7 @@ def get_optional_params_embeddings( for k, v in passed_params.items() if (k in default_params and v != default_params[k]) } + ## raise exception if non-default value passed for non-openai/azure embedding calls if custom_llm_provider == "openai": # 'dimensions` is only supported in `text-embedding-3` and later models @@ -4019,6 +4020,18 @@ def get_optional_params_embeddings( status_code=500, message=f"Setting dimensions is not supported for OpenAI `text-embedding-3` and later models. To drop it from the call, set `litellm.drop_params = True`.", ) + if custom_llm_provider == "vertex_ai": + if len(non_default_params.keys()) > 0: + if litellm.drop_params is True: # drop the unsupported non-default values + keys = list(non_default_params.keys()) + for k in keys: + non_default_params.pop(k, None) + final_params = {**non_default_params, **kwargs} + return final_params + raise UnsupportedParamsError( + status_code=500, + message=f"Setting user/encoding format is not supported by {custom_llm_provider}. To drop it from the call, set `litellm.drop_params = True`.", + ) if ( custom_llm_provider != "openai" From 2e130fb662c0ccb704d0c6e09f83258982f2fddc Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Wed, 6 Mar 2024 20:40:27 -0800 Subject: [PATCH 190/304] (test) ci/cd run again --- litellm/tests/test_completion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index ba57945f2..4db664dde 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1490,7 +1490,7 @@ def test_replicate_custom_prompt_dict(): # test_replicate_custom_prompt_dict() -# commenthing this out since we won't be always testing a custom replicate deployment +# commenthing this out since we won't be always testing a custom, replicate deployment # def test_completion_replicate_deployments(): # print("TESTING REPLICATE") # litellm.set_verbose=False From c0c3117dec426696a98d8c93ae0614c9629de7fc Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 20:47:05 -0800 Subject: [PATCH 191/304] fix(utils.py): fix get optional param embeddings --- litellm/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 68dc137af..a1f1bb374 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4030,11 +4030,11 @@ def get_optional_params_embeddings( keys = list(non_default_params.keys()) for k in keys: non_default_params.pop(k, None) - return non_default_params - raise UnsupportedParamsError( - status_code=500, - message=f"Setting user/encoding format is not supported by {custom_llm_provider}. To drop it from the call, set `litellm.drop_params = True`.", - ) + else: + raise UnsupportedParamsError( + status_code=500, + message=f"Setting user/encoding format is not supported by {custom_llm_provider}. To drop it from the call, set `litellm.drop_params = True`.", + ) final_params = {**non_default_params, **kwargs} return final_params From f79ce63f05779beb0b1f5bc640b0bec1a9d2ee67 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 21:04:46 -0800 Subject: [PATCH 192/304] =?UTF-8?q?bump:=20version=201.29.7=20=E2=86=92=20?= =?UTF-8?q?1.30.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2daa57b91..bde24c5cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.29.7" +version = "1.30.0" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.29.7" +version = "1.30.0" version_files = [ "pyproject.toml:^version" ] From ec7948261242f53579a73560531aab8fed6c0259 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 21:12:04 -0800 Subject: [PATCH 193/304] fix(utils.py): fix google ai studio timeout error raising --- litellm/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index 8f6e57776..4c48c5516 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -7127,7 +7127,6 @@ def exception_type( message=f"PalmException - {original_exception.message}", model=model, llm_provider="palm", - request=original_exception.request, ) if "400 Request payload size exceeds" in error_str: exception_mapping_worked = True From 0273410310a45a87285bae16dc4561bfabd138e1 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 21:38:30 -0800 Subject: [PATCH 194/304] fix(lowest_tpm_rpm.py): handle async scenarios --- litellm/router_strategy/lowest_tpm_rpm.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/litellm/router_strategy/lowest_tpm_rpm.py b/litellm/router_strategy/lowest_tpm_rpm.py index e97d81aa1..9f0b9eb22 100644 --- a/litellm/router_strategy/lowest_tpm_rpm.py +++ b/litellm/router_strategy/lowest_tpm_rpm.py @@ -200,9 +200,8 @@ class LowestTPMLoggingHandler(CustomLogger): if item_tpm == 0: deployment = _deployment break - elif ( - item_tpm + input_tokens > _deployment_tpm - or rpm_dict[item] + 1 > _deployment_rpm + elif item_tpm + input_tokens > _deployment_tpm or ( + item in rpm_dict and rpm_dict[item] + 1 > _deployment_rpm ): # if user passed in tpm / rpm in the model_list continue elif item_tpm < lowest_tpm: From b9854a99d23c38d8d451c18b9d8dc4d0f0540eaf Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 6 Mar 2024 22:16:59 -0800 Subject: [PATCH 195/304] test: increase time before checking budget reset - avoid deadlocking --- litellm/main.py | 1 + proxy_server_config.yaml | 4 ++-- tests/test_keys.py | 2 +- tests/test_users.py | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index 63649844a..dfe6c5f31 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -10,6 +10,7 @@ import os, openai, sys, json, inspect, uuid, datetime, threading from typing import Any, Literal, Union from functools import partial + import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy import httpx diff --git a/proxy_server_config.yaml b/proxy_server_config.yaml index 4b454f5bd..83bcc0626 100644 --- a/proxy_server_config.yaml +++ b/proxy_server_config.yaml @@ -42,8 +42,8 @@ litellm_settings: request_timeout: 600 general_settings: master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234) - proxy_budget_rescheduler_min_time: 10 - proxy_budget_rescheduler_max_time: 12 + proxy_budget_rescheduler_min_time: 60 + proxy_budget_rescheduler_max_time: 64 # database_url: "postgresql://:@:/" # [OPTIONAL] use for token-based auth to proxy environment_variables: diff --git a/tests/test_keys.py b/tests/test_keys.py index 413c24bc1..cba960aca 100644 --- a/tests/test_keys.py +++ b/tests/test_keys.py @@ -461,8 +461,8 @@ async def test_key_with_budgets(): reset_at_init_value = key_info["info"]["budget_reset_at"] reset_at_new_value = None i = 0 - await asyncio.sleep(20) for i in range(3): + await asyncio.sleep(70) key_info = await retry_request( get_key_info, session=session, get_key=key, call_key=key ) diff --git a/tests/test_users.py b/tests/test_users.py index 898274467..cccc6dd4c 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -126,7 +126,7 @@ async def test_users_budgets_reset(): i = 0 reset_at_new_value = None while i < 3: - await asyncio.sleep(15) + await asyncio.sleep(70) user_info = await get_user_info( session=session, get_user=get_user, call_user=key ) From dd78a1956a591aadd32193289f5a53e21f1bc0f2 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 7 Mar 2024 07:56:51 -0800 Subject: [PATCH 196/304] fix(proxy_server.py): fix model alias map + add back testing --- litellm/proxy/proxy_server.py | 24 ++++++++++++++++ tests/test_team.py | 53 +++++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 95570d7fa..19ac5c961 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -2541,6 +2541,12 @@ async def completion( if user_api_base: data["api_base"] = user_api_base + ### MODEL ALIAS MAPPING ### + # check if model name in model alias map + # get the actual model name + if data["model"] in litellm.model_alias_map: + data["model"] = litellm.model_alias_map[data["model"]] + ### CALL HOOKS ### - modify incoming data before calling the model data = await proxy_logging_obj.pre_call_hook( user_api_key_dict=user_api_key_dict, data=data, call_type="completion" @@ -2740,6 +2746,12 @@ async def chat_completion( if user_api_base: data["api_base"] = user_api_base + ### MODEL ALIAS MAPPING ### + # check if model name in model alias map + # get the actual model name + if data["model"] in litellm.model_alias_map: + data["model"] = litellm.model_alias_map[data["model"]] + ### CALL HOOKS ### - modify incoming data before calling the model data = await proxy_logging_obj.pre_call_hook( user_api_key_dict=user_api_key_dict, data=data, call_type="completion" @@ -2948,6 +2960,12 @@ async def embeddings( **data, } # add the team-specific configs to the completion call + ### MODEL ALIAS MAPPING ### + # check if model name in model alias map + # get the actual model name + if data["model"] in litellm.model_alias_map: + data["model"] = litellm.model_alias_map[data["model"]] + router_model_names = ( [m["model_name"] for m in llm_model_list] if llm_model_list is not None @@ -3119,6 +3137,12 @@ async def image_generation( **data, } # add the team-specific configs to the completion call + ### MODEL ALIAS MAPPING ### + # check if model name in model alias map + # get the actual model name + if data["model"] in litellm.model_alias_map: + data["model"] = litellm.model_alias_map[data["model"]] + router_model_names = ( [m["model_name"] for m in llm_model_list] if llm_model_list is not None diff --git a/tests/test_team.py b/tests/test_team.py index 15303331a..f0ef0bb22 100644 --- a/tests/test_team.py +++ b/tests/test_team.py @@ -7,11 +7,13 @@ import time, uuid from openai import AsyncOpenAI -async def new_user(session, i, user_id=None, budget=None, budget_duration=None): +async def new_user( + session, i, user_id=None, budget=None, budget_duration=None, models=["azure-models"] +): url = "http://0.0.0.0:4000/user/new" headers = {"Authorization": "Bearer sk-1234", "Content-Type": "application/json"} data = { - "models": ["azure-models"], + "models": models, "aliases": {"mistral-7b": "gpt-3.5-turbo"}, "duration": None, "max_budget": budget, @@ -125,17 +127,22 @@ async def chat_completion(session, key, model="gpt-4"): pass -async def new_team(session, i, user_id=None, member_list=None): +async def new_team(session, i, user_id=None, member_list=None, model_aliases=None): + import json + url = "http://0.0.0.0:4000/team/new" headers = {"Authorization": "Bearer sk-1234", "Content-Type": "application/json"} - data = { - "team_alias": "my-new-team", - } + data = {"team_alias": "my-new-team"} if user_id is not None: data["members_with_roles"] = [{"role": "user", "user_id": user_id}] elif member_list is not None: data["members_with_roles"] = member_list + if model_aliases is not None: + data["model_aliases"] = model_aliases + + print(f"data: {data}") + async with session.post(url, headers=headers, json=data) as response: status = response.status response_text = await response.text() @@ -351,3 +358,37 @@ async def test_member_delete(): member_id_list.append(member["user_id"]) assert normal_user not in member_id_list + + +@pytest.mark.asyncio +async def test_team_alias(): + """ + - Create team w/ model alias + - Create key for team + - Check if key works + """ + async with aiohttp.ClientSession() as session: + ## Create admin + admin_user = f"{uuid.uuid4()}" + await new_user(session=session, i=0, user_id=admin_user) + ## Create normal user + normal_user = f"{uuid.uuid4()}" + await new_user(session=session, i=0, user_id=normal_user) + ## Create team with 1 admin and 1 user + member_list = [ + {"role": "admin", "user_id": admin_user}, + {"role": "user", "user_id": normal_user}, + ] + team_data = await new_team( + session=session, + i=0, + member_list=member_list, + model_aliases={"cheap-model": "gpt-3.5-turbo"}, + ) + ## Create key + key_gen = await generate_key( + session=session, i=0, team_id=team_data["team_id"], models=["gpt-3.5-turbo"] + ) + key = key_gen["key"] + ## Test key + response = await chat_completion(session=session, key=key, model="cheap-model") From 0d8bed0acfe8ecfdd25c7a06a3168759d6008b2c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 7 Mar 2024 07:57:13 -0800 Subject: [PATCH 197/304] =?UTF-8?q?bump:=20version=201.30.0=20=E2=86=92=20?= =?UTF-8?q?1.30.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bde24c5cb..5880791ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.0" +version = "1.30.1" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.0" +version = "1.30.1" version_files = [ "pyproject.toml:^version" ] From 4508b4ede01965d2ab0e5c89c93009cda569c570 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 7 Mar 2024 08:14:46 -0800 Subject: [PATCH 198/304] docs(team_based_routing.md): add docs on team based routing --- .../docs/proxy/team_based_routing.md | 71 +++++++++++++++++++ docs/my-website/sidebars.js | 1 + 2 files changed, 72 insertions(+) create mode 100644 docs/my-website/docs/proxy/team_based_routing.md diff --git a/docs/my-website/docs/proxy/team_based_routing.md b/docs/my-website/docs/proxy/team_based_routing.md new file mode 100644 index 000000000..4b057cdf3 --- /dev/null +++ b/docs/my-website/docs/proxy/team_based_routing.md @@ -0,0 +1,71 @@ +# 👥 Team-based Routing + +Route calls to different model groups based on the team-id + +## Config with model group + +Create a config.yaml with 2 model groups + connected postgres db + +```yaml +model_list: + - model_name: gpt-3.5-turbo-eu # 👈 Model Group 1 + litellm_params: + model: azure/chatgpt-v-2 + api_base: os.environ/AZURE_API_BASE_EU + api_key: os.environ/AZURE_API_KEY_EU + api_version: "2023-07-01-preview" + - model_name: gpt-3.5-turbo-worldwide # 👈 Model Group 2 + litellm_params: + model: azure/chatgpt-v-2 + api_base: os.environ/AZURE_API_BASE + api_key: os.environ/AZURE_API_KEY + api_version: "2023-07-01-preview" + +general_settings: + master_key: sk-1234 + database_url: "postgresql://..." # 👈 Connect proxy to DB +``` + +Start proxy + +```bash +litellm --config /path/to/config.yaml +``` + +## Create Team with Model Alias + +```bash +curl --location 'http://0.0.0.0:4000/team/new' \ +--header 'Authorization: Bearer sk-1234' \ # 👈 Master Key +--header 'Content-Type: application/json' \ +--data '{ + "team_alias": "my-new-team_4", + "model_aliases": {"gpt-3.5-turbo": "gpt-3.5-turbo-eu"} +}' + +# Returns team_id: my-team-id +``` + +## Create Team Key + +```bash +curl --location 'http://localhost:4000/key/generate' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data '{ + "team_id": "my-team-id", # 👈 YOUR TEAM ID +}' +``` + +## Call Model with alias + +```bash +curl --location 'http://0.0.0.0:4000/v1/chat/completions' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer sk-A1L0C3Px2LJl53sF_kTF9A' \ +--data '{ + "model": "gpt-3.5-turbo", # 👈 MODEL + "messages": [{"role": "system", "content": "You'\''re an expert at writing poems"}, {"role": "user", "content": "Write me a poem"}, {"role": "user", "content": "What'\''s your name?"}], + "user": "usha" +}' +``` \ No newline at end of file diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index d50e31c79..7aaf2e114 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -39,6 +39,7 @@ const sidebars = { "proxy/user_keys", "proxy/virtual_keys", "proxy/users", + "proxy/team_based_routing", "proxy/ui", "proxy/budget_alerts", "proxy/model_management", From a89d0db625d5d5fba38425f62c7437d6dff1f714 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 7 Mar 2024 08:37:00 -0800 Subject: [PATCH 199/304] test(test_router_caching.py): add more verbose logs --- litellm/tests/test_router_caching.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_router_caching.py b/litellm/tests/test_router_caching.py index 74a572c46..1fb699c17 100644 --- a/litellm/tests/test_router_caching.py +++ b/litellm/tests/test_router_caching.py @@ -149,7 +149,7 @@ async def test_acompletion_caching_with_ttl_on_router(): async def test_acompletion_caching_on_router_caching_groups(): # tests acompletion + caching on router try: - # litellm.set_verbose = True + litellm.set_verbose = True model_list = [ { "model_name": "openai-gpt-3.5-turbo", From 4885bff9e3d2c30a9434b84856ebd6a4f17de8d8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 7 Mar 2024 08:56:59 -0800 Subject: [PATCH 200/304] test: reintegrate s3 testing --- litellm/tests/test_amazing_s3_logs.py | 416 +++++++++--------- litellm/tests/test_caching.py | 4 +- ...st_cloudflare_azure_with_cache_config.yaml | 4 +- litellm/tests/test_load_test_router_s3.py | 2 +- 4 files changed, 215 insertions(+), 211 deletions(-) diff --git a/litellm/tests/test_amazing_s3_logs.py b/litellm/tests/test_amazing_s3_logs.py index 0ccc0bc15..e4a6c31ec 100644 --- a/litellm/tests/test_amazing_s3_logs.py +++ b/litellm/tests/test_amazing_s3_logs.py @@ -1,254 +1,256 @@ -# # @pytest.mark.skip(reason="AWS Suspended Account") -# import sys -# import os -# import io, asyncio +import sys +import os +import io, asyncio -# # import logging -# # logging.basicConfig(level=logging.DEBUG) -# sys.path.insert(0, os.path.abspath("../..")) +# import logging +# logging.basicConfig(level=logging.DEBUG) +sys.path.insert(0, os.path.abspath("../..")) -# from litellm import completion -# import litellm +from litellm import completion +import litellm -# litellm.num_retries = 3 +litellm.num_retries = 3 -# import time, random -# import pytest +import time, random +import pytest -# def test_s3_logging(): -# # all s3 requests need to be in one test function -# # since we are modifying stdout, and pytests runs tests in parallel -# # on circle ci - we only test litellm.acompletion() -# try: -# # redirect stdout to log_file -# litellm.cache = litellm.Cache( -# type="s3", s3_bucket_name="cache-bucket-litellm", s3_region_name="us-west-2" -# ) +def test_s3_logging(): + # all s3 requests need to be in one test function + # since we are modifying stdout, and pytests runs tests in parallel + # on circle ci - we only test litellm.acompletion() + try: + # redirect stdout to log_file + litellm.cache = litellm.Cache( + type="s3", + s3_bucket_name="litellm-my-test-bucket-2", + s3_region_name="us-east-1", + ) -# litellm.success_callback = ["s3"] -# litellm.s3_callback_params = { -# "s3_bucket_name": "litellm-logs", -# "s3_aws_secret_access_key": "os.environ/AWS_SECRET_ACCESS_KEY", -# "s3_aws_access_key_id": "os.environ/AWS_ACCESS_KEY_ID", -# } -# litellm.set_verbose = True + litellm.success_callback = ["s3"] + litellm.s3_callback_params = { + "s3_bucket_name": "litellm-logs-2", + "s3_aws_secret_access_key": "os.environ/AWS_SECRET_ACCESS_KEY", + "s3_aws_access_key_id": "os.environ/AWS_ACCESS_KEY_ID", + } + litellm.set_verbose = True -# print("Testing async s3 logging") + print("Testing async s3 logging") -# expected_keys = [] + expected_keys = [] -# import time + import time -# curr_time = str(time.time()) + curr_time = str(time.time()) -# async def _test(): -# return await litellm.acompletion( -# model="gpt-3.5-turbo", -# messages=[{"role": "user", "content": f"This is a test {curr_time}"}], -# max_tokens=10, -# temperature=0.7, -# user="ishaan-2", -# ) + async def _test(): + return await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": f"This is a test {curr_time}"}], + max_tokens=10, + temperature=0.7, + user="ishaan-2", + ) -# response = asyncio.run(_test()) -# print(f"response: {response}") -# expected_keys.append(response.id) + response = asyncio.run(_test()) + print(f"response: {response}") + expected_keys.append(response.id) -# async def _test(): -# return await litellm.acompletion( -# model="gpt-3.5-turbo", -# messages=[{"role": "user", "content": f"This is a test {curr_time}"}], -# max_tokens=10, -# temperature=0.7, -# user="ishaan-2", -# ) + async def _test(): + return await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": f"This is a test {curr_time}"}], + max_tokens=10, + temperature=0.7, + user="ishaan-2", + ) -# response = asyncio.run(_test()) -# expected_keys.append(response.id) -# print(f"response: {response}") -# time.sleep(5) # wait 5s for logs to land + response = asyncio.run(_test()) + expected_keys.append(response.id) + print(f"response: {response}") + time.sleep(5) # wait 5s for logs to land -# import boto3 + import boto3 -# s3 = boto3.client("s3") -# bucket_name = "litellm-logs" -# # List objects in the bucket -# response = s3.list_objects(Bucket=bucket_name) + s3 = boto3.client("s3") + bucket_name = "litellm-logs-2" + # List objects in the bucket + response = s3.list_objects(Bucket=bucket_name) -# # Sort the objects based on the LastModified timestamp -# objects = sorted( -# response["Contents"], key=lambda x: x["LastModified"], reverse=True -# ) -# # Get the keys of the most recent objects -# most_recent_keys = [obj["Key"] for obj in objects] -# print(most_recent_keys) -# # for each key, get the part before "-" as the key. Do it safely -# cleaned_keys = [] -# for key in most_recent_keys: -# split_key = key.split("_") -# if len(split_key) < 2: -# continue -# cleaned_keys.append(split_key[1]) -# print("\n most recent keys", most_recent_keys) -# print("\n cleaned keys", cleaned_keys) -# print("\n Expected keys: ", expected_keys) -# matches = 0 -# for key in expected_keys: -# key += ".json" -# assert key in cleaned_keys + # Sort the objects based on the LastModified timestamp + objects = sorted( + response["Contents"], key=lambda x: x["LastModified"], reverse=True + ) + # Get the keys of the most recent objects + most_recent_keys = [obj["Key"] for obj in objects] + print(most_recent_keys) + # for each key, get the part before "-" as the key. Do it safely + cleaned_keys = [] + for key in most_recent_keys: + split_key = key.split("_") + if len(split_key) < 2: + continue + cleaned_keys.append(split_key[1]) + print("\n most recent keys", most_recent_keys) + print("\n cleaned keys", cleaned_keys) + print("\n Expected keys: ", expected_keys) + matches = 0 + for key in expected_keys: + key += ".json" + assert key in cleaned_keys -# if key in cleaned_keys: -# matches += 1 -# # remove the match key -# cleaned_keys.remove(key) -# # this asserts we log, the first request + the 2nd cached request -# print("we had two matches ! passed ", matches) -# assert matches == 2 -# try: -# # cleanup s3 bucket in test -# for key in most_recent_keys: -# s3.delete_object(Bucket=bucket_name, Key=key) -# except: -# # don't let cleanup fail a test -# pass -# except Exception as e: -# pytest.fail(f"An exception occurred - {e}") -# finally: -# # post, close log file and verify -# # Reset stdout to the original value -# print("Passed! Testing async s3 logging") + if key in cleaned_keys: + matches += 1 + # remove the match key + cleaned_keys.remove(key) + # this asserts we log, the first request + the 2nd cached request + print("we had two matches ! passed ", matches) + assert matches == 2 + try: + # cleanup s3 bucket in test + for key in most_recent_keys: + s3.delete_object(Bucket=bucket_name, Key=key) + except: + # don't let cleanup fail a test + pass + except Exception as e: + pytest.fail(f"An exception occurred - {e}") + finally: + # post, close log file and verify + # Reset stdout to the original value + print("Passed! Testing async s3 logging") -# # test_s3_logging() +# test_s3_logging() -# def test_s3_logging_async(): -# # this tests time added to make s3 logging calls, vs just acompletion calls -# try: -# litellm.set_verbose = True -# # Make 5 calls with an empty success_callback -# litellm.success_callback = [] -# start_time_empty_callback = asyncio.run(make_async_calls()) -# print("done with no callback test") +def test_s3_logging_async(): + # this tests time added to make s3 logging calls, vs just acompletion calls + try: + litellm.set_verbose = True + # Make 5 calls with an empty success_callback + litellm.success_callback = [] + start_time_empty_callback = asyncio.run(make_async_calls()) + print("done with no callback test") -# print("starting s3 logging load test") -# # Make 5 calls with success_callback set to "langfuse" -# litellm.success_callback = ["s3"] -# litellm.s3_callback_params = { -# "s3_bucket_name": "litellm-logs", -# "s3_aws_secret_access_key": "os.environ/AWS_SECRET_ACCESS_KEY", -# "s3_aws_access_key_id": "os.environ/AWS_ACCESS_KEY_ID", -# } -# start_time_s3 = asyncio.run(make_async_calls()) -# print("done with s3 test") + print("starting s3 logging load test") + # Make 5 calls with success_callback set to "langfuse" + litellm.success_callback = ["s3"] + litellm.s3_callback_params = { + "s3_bucket_name": "litellm-logs-2", + "s3_aws_secret_access_key": "os.environ/AWS_SECRET_ACCESS_KEY", + "s3_aws_access_key_id": "os.environ/AWS_ACCESS_KEY_ID", + } + start_time_s3 = asyncio.run(make_async_calls()) + print("done with s3 test") -# # Compare the time for both scenarios -# print(f"Time taken with success_callback='s3': {start_time_s3}") -# print(f"Time taken with empty success_callback: {start_time_empty_callback}") + # Compare the time for both scenarios + print(f"Time taken with success_callback='s3': {start_time_s3}") + print(f"Time taken with empty success_callback: {start_time_empty_callback}") -# # assert the diff is not more than 1 second -# assert abs(start_time_s3 - start_time_empty_callback) < 1 + # assert the diff is not more than 1 second + assert abs(start_time_s3 - start_time_empty_callback) < 1 -# except litellm.Timeout as e: -# pass -# except Exception as e: -# pytest.fail(f"An exception occurred - {e}") + except litellm.Timeout as e: + pass + except Exception as e: + pytest.fail(f"An exception occurred - {e}") -# async def make_async_calls(): -# tasks = [] -# for _ in range(5): -# task = asyncio.create_task( -# litellm.acompletion( -# model="azure/chatgpt-v-2", -# messages=[{"role": "user", "content": "This is a test"}], -# max_tokens=5, -# temperature=0.7, -# timeout=5, -# user="langfuse_latency_test_user", -# mock_response="It's simple to use and easy to get started", -# ) -# ) -# tasks.append(task) +async def make_async_calls(): + tasks = [] + for _ in range(5): + task = asyncio.create_task( + litellm.acompletion( + model="azure/chatgpt-v-2", + messages=[{"role": "user", "content": "This is a test"}], + max_tokens=5, + temperature=0.7, + timeout=5, + user="langfuse_latency_test_user", + mock_response="It's simple to use and easy to get started", + ) + ) + tasks.append(task) -# # Measure the start time before running the tasks -# start_time = asyncio.get_event_loop().time() + # Measure the start time before running the tasks + start_time = asyncio.get_event_loop().time() -# # Wait for all tasks to complete -# responses = await asyncio.gather(*tasks) + # Wait for all tasks to complete + responses = await asyncio.gather(*tasks) -# # Print the responses when tasks return -# for idx, response in enumerate(responses): -# print(f"Response from Task {idx + 1}: {response}") + # Print the responses when tasks return + for idx, response in enumerate(responses): + print(f"Response from Task {idx + 1}: {response}") -# # Calculate the total time taken -# total_time = asyncio.get_event_loop().time() - start_time + # Calculate the total time taken + total_time = asyncio.get_event_loop().time() - start_time -# return total_time + return total_time -# def test_s3_logging_r2(): -# # all s3 requests need to be in one test function -# # since we are modifying stdout, and pytests runs tests in parallel -# # on circle ci - we only test litellm.acompletion() -# try: -# # redirect stdout to log_file -# # litellm.cache = litellm.Cache( -# # type="s3", s3_bucket_name="litellm-r2-bucket", s3_region_name="us-west-2" -# # ) -# litellm.set_verbose = True -# from litellm._logging import verbose_logger -# import logging +@pytest.mark.skip(reason="flaky test on ci/cd") +def test_s3_logging_r2(): + # all s3 requests need to be in one test function + # since we are modifying stdout, and pytests runs tests in parallel + # on circle ci - we only test litellm.acompletion() + try: + # redirect stdout to log_file + # litellm.cache = litellm.Cache( + # type="s3", s3_bucket_name="litellm-r2-bucket", s3_region_name="us-west-2" + # ) + litellm.set_verbose = True + from litellm._logging import verbose_logger + import logging -# verbose_logger.setLevel(level=logging.DEBUG) + verbose_logger.setLevel(level=logging.DEBUG) -# litellm.success_callback = ["s3"] -# litellm.s3_callback_params = { -# "s3_bucket_name": "litellm-r2-bucket", -# "s3_aws_secret_access_key": "os.environ/R2_S3_ACCESS_KEY", -# "s3_aws_access_key_id": "os.environ/R2_S3_ACCESS_ID", -# "s3_endpoint_url": "os.environ/R2_S3_URL", -# "s3_region_name": "os.environ/R2_S3_REGION_NAME", -# } -# print("Testing async s3 logging") + litellm.success_callback = ["s3"] + litellm.s3_callback_params = { + "s3_bucket_name": "litellm-r2-bucket", + "s3_aws_secret_access_key": "os.environ/R2_S3_ACCESS_KEY", + "s3_aws_access_key_id": "os.environ/R2_S3_ACCESS_ID", + "s3_endpoint_url": "os.environ/R2_S3_URL", + "s3_region_name": "os.environ/R2_S3_REGION_NAME", + } + print("Testing async s3 logging") -# expected_keys = [] + expected_keys = [] -# import time + import time -# curr_time = str(time.time()) + curr_time = str(time.time()) -# async def _test(): -# return await litellm.acompletion( -# model="gpt-3.5-turbo", -# messages=[{"role": "user", "content": f"This is a test {curr_time}"}], -# max_tokens=10, -# temperature=0.7, -# user="ishaan-2", -# ) + async def _test(): + return await litellm.acompletion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": f"This is a test {curr_time}"}], + max_tokens=10, + temperature=0.7, + user="ishaan-2", + ) -# response = asyncio.run(_test()) -# print(f"response: {response}") -# expected_keys.append(response.id) + response = asyncio.run(_test()) + print(f"response: {response}") + expected_keys.append(response.id) -# import boto3 + import boto3 -# s3 = boto3.client( -# "s3", -# endpoint_url=os.getenv("R2_S3_URL"), -# region_name=os.getenv("R2_S3_REGION_NAME"), -# aws_access_key_id=os.getenv("R2_S3_ACCESS_ID"), -# aws_secret_access_key=os.getenv("R2_S3_ACCESS_KEY"), -# ) + s3 = boto3.client( + "s3", + endpoint_url=os.getenv("R2_S3_URL"), + region_name=os.getenv("R2_S3_REGION_NAME"), + aws_access_key_id=os.getenv("R2_S3_ACCESS_ID"), + aws_secret_access_key=os.getenv("R2_S3_ACCESS_KEY"), + ) -# bucket_name = "litellm-r2-bucket" -# # List objects in the bucket -# response = s3.list_objects(Bucket=bucket_name) + bucket_name = "litellm-r2-bucket" + # List objects in the bucket + response = s3.list_objects(Bucket=bucket_name) -# except Exception as e: -# pytest.fail(f"An exception occurred - {e}") -# finally: -# # post, close log file and verify -# # Reset stdout to the original value -# print("Passed! Testing async s3 logging") + except Exception as e: + pytest.fail(f"An exception occurred - {e}") + finally: + # post, close log file and verify + # Reset stdout to the original value + print("Passed! Testing async s3 logging") diff --git a/litellm/tests/test_caching.py b/litellm/tests/test_caching.py index 665246730..07d39b086 100644 --- a/litellm/tests/test_caching.py +++ b/litellm/tests/test_caching.py @@ -626,7 +626,9 @@ def test_s3_cache_acompletion_stream_azure(): } ] litellm.cache = Cache( - type="s3", s3_bucket_name="cache-bucket-litellm", s3_region_name="us-west-2" + type="s3", + s3_bucket_name="litellm-my-test-bucket-2", + s3_region_name="us-east-1", ) print("s3 Cache: test for caching, streaming + completion") response_1_content = "" diff --git a/litellm/tests/test_configs/test_cloudflare_azure_with_cache_config.yaml b/litellm/tests/test_configs/test_cloudflare_azure_with_cache_config.yaml index c19caaf48..c3c3cb1c3 100644 --- a/litellm/tests/test_configs/test_cloudflare_azure_with_cache_config.yaml +++ b/litellm/tests/test_configs/test_cloudflare_azure_with_cache_config.yaml @@ -11,7 +11,7 @@ litellm_settings: cache: True # set cache responses to True cache_params: # set cache params for s3 type: s3 - s3_bucket_name: cache-bucket-litellm # AWS Bucket Name for S3 - s3_region_name: us-west-2 # AWS Region Name for S3 + s3_bucket_name: litellm-my-test-bucket-2 # AWS Bucket Name for S3 + s3_region_name: us-east-1 # AWS Region Name for S3 s3_aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID # AWS Access Key ID for S3 s3_aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY # AWS Secret Access Key for S3 \ No newline at end of file diff --git a/litellm/tests/test_load_test_router_s3.py b/litellm/tests/test_load_test_router_s3.py index ed3df5f5d..7b2683367 100644 --- a/litellm/tests/test_load_test_router_s3.py +++ b/litellm/tests/test_load_test_router_s3.py @@ -14,7 +14,7 @@ # import litellm # litellm.cache = Cache( -# type="s3", s3_bucket_name="cache-bucket-litellm", s3_region_name="us-west-2" +# type="s3", s3_bucket_name="litellm-my-test-bucket-2", s3_region_name="us-west-2" # ) # ### Test calling router with s3 Cache From 3b86375782393248fa430f6d03f4c6e00e239c2b Mon Sep 17 00:00:00 2001 From: Daniel Chico Date: Thu, 7 Mar 2024 12:26:03 -0500 Subject: [PATCH 201/304] feat: add realease details to discord notification message --- .github/workflows/ghcr_deploy.yml | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ghcr_deploy.yml b/.github/workflows/ghcr_deploy.yml index a367ae2b8..d7cf4271c 100644 --- a/.github/workflows/ghcr_deploy.yml +++ b/.github/workflows/ghcr_deploy.yml @@ -146,9 +146,29 @@ jobs: } catch (error) { core.setFailed(error.message); } + - name: Fetch Release Notes + id: release-notes + uses: actions/github-script@v6 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + script: | + try { + const response = await github.rest.repos.getRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: process.env.RELEASE_ID, + }); + return response.data.body; + } catch (error) { + core.setFailed(error.message); + } + env: + RELEASE_ID: ${{ env.RELEASE_ID }} - name: Github Releases To Discord env: WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }} + REALEASE_TAG: ${{ env.RELEASE_TAG }} + RELEASE_NOTES: ${{ steps.release-notes.outputs.result }} run: | curl -H "Content-Type: application/json" -X POST -d '{ "content": "||@everyone||", @@ -156,8 +176,8 @@ jobs: "avatar_url": "https://cdn.discordapp.com/avatars/487431320314576937/bd64361e4ba6313d561d54e78c9e7171.png", "embeds": [ { - "title": "Changelog", - "description": "This is the changelog for the latest release.", + "title": "Changelog for ${RELEASE_TAG}", + "description": "${RELEASE_NOTES}", "color": 2105893 } ] From 3baa55210a890e11ba91122b52cfbcb1848fd6f8 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 12:22:39 -0800 Subject: [PATCH 202/304] (docs) setting load balancing config --- docs/my-website/docs/proxy/configs.md | 31 +++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/my-website/docs/proxy/configs.md b/docs/my-website/docs/proxy/configs.md index 2b3edfadb..5745685de 100644 --- a/docs/my-website/docs/proxy/configs.md +++ b/docs/my-website/docs/proxy/configs.md @@ -248,31 +248,46 @@ $ litellm --config /path/to/config.yaml Use this to call multiple instances of the same model and configure things like [routing strategy](../routing.md#advanced). -```yaml -router_settings: - routing_strategy: "latency-based-routing" # routes to the fastest deployment in the group +For optimal performance: +- Set `tpm/rpm` per model deployment. Weighted picks are then based on the established tpm/rpm. +- Select your optimal routing strategy in `router_settings:routing_strategy`. +LiteLLM supports +```python +["simple-shuffle", "least-busy", "usage-based-routing","latency-based-routing"], default="simple-shuffle"` +``` + +When `tpm/rpm` is set + `routing_strategy==simple-shuffle` litellm will use a weighted pick based on set tpm/rpm. **In our load tests setting tpm/rpm for all deployments + `routing_strategy==simple-shuffle` maximized throughput** +- When using multiple LiteLLM Servers / Kubernetes set redis settings `router_settings:redis_host` etc + +```yaml model_list: - model_name: zephyr-beta litellm_params: model: huggingface/HuggingFaceH4/zephyr-7b-beta api_base: http://0.0.0.0:8001 + rpm: 60 # Optional[int]: When rpm/tpm set - litellm uses weighted pick for load balancing. rpm = Rate limit for this deployment: in requests per minute (rpm). + tpm: 1000 # Optional[int]: tpm = Tokens Per Minute - model_name: zephyr-beta litellm_params: model: huggingface/HuggingFaceH4/zephyr-7b-beta api_base: http://0.0.0.0:8002 + rpm: 600 - model_name: zephyr-beta litellm_params: model: huggingface/HuggingFaceH4/zephyr-7b-beta api_base: http://0.0.0.0:8003 + rpm: 60000 - model_name: gpt-3.5-turbo litellm_params: model: gpt-3.5-turbo api_key: + rpm: 200 - model_name: gpt-3.5-turbo-16k litellm_params: model: gpt-3.5-turbo-16k api_key: + rpm: 100 litellm_settings: num_retries: 3 # retry call 3 times on each model_name (e.g. zephyr-beta) @@ -280,8 +295,16 @@ litellm_settings: fallbacks: [{"zephyr-beta": ["gpt-3.5-turbo"]}] # fallback to gpt-3.5-turbo if call fails num_retries context_window_fallbacks: [{"zephyr-beta": ["gpt-3.5-turbo-16k"]}, {"gpt-3.5-turbo": ["gpt-3.5-turbo-16k"]}] # fallback to gpt-3.5-turbo-16k if context window error allowed_fails: 3 # cooldown model if it fails > 1 call in a minute. -``` +router_settings: # router_settings are optional + routing_strategy: simple-shuffle # Literal["simple-shuffle", "least-busy", "usage-based-routing","latency-based-routing"], default="simple-shuffle" + model_group_alias: {"gpt-4": "gpt-3.5-turbo"} # all requests with `gpt-4` will be routed to models with `gpt-3.5-turbo` + num_retries: 2 + timeout: 30 # 30 seconds + redis_host: # set this when using multiple litellm proxy deployments, load balancing state stored in redis + redis_password: + redis_port: 1992 +``` ## Set Azure `base_model` for cost tracking From b64e4c3e6ff8f1d6e26896bb6367097ac9215378 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 13:42:54 -0800 Subject: [PATCH 203/304] (feat) better debugging when reading prisma --- litellm/proxy/utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 81130787d..26ed35604 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -693,6 +693,9 @@ class PrismaClient: """ Generic implementation of get data """ + verbose_proxy_logger.debug( + f"PrismaClient: get_generic_data: {key}, table_name: {table_name}" + ) try: if table_name == "users": response = await self.db.litellm_usertable.find_first( @@ -758,6 +761,9 @@ class PrismaClient: int ] = None, # pagination, number of rows to getch when find_all==True ): + verbose_proxy_logger.debug( + f"PrismaClient: get_data: table_name: {table_name}, query_type: {query_type}, user_id: {user_id}, user_id_list: {user_id_list}, team_id: {team_id}, team_id_list: {team_id_list}, key_val: {key_val}" + ) try: response: Any = None if (token is not None and table_name is None) or ( @@ -1020,6 +1026,7 @@ class PrismaClient: Add a key to the database. If it already exists, do nothing. """ try: + verbose_proxy_logger.debug(f"PrismaClient: insert_data: {data}") if table_name == "key": token = data["token"] hashed_token = self.hash_token(token=token) @@ -1152,6 +1159,9 @@ class PrismaClient: """ Update existing data """ + verbose_proxy_logger.debug( + f"PrismaClient: update_data, table_name: {table_name}" + ) try: db_data = self.jsonify_object(data=data) if update_key_values is not None: From 5217e800c4ba6c5d4884983dd1e12c277e98673f Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 14:04:02 -0800 Subject: [PATCH 204/304] (fix) better prisma debug logs --- litellm/proxy/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 26ed35604..0f0097ff6 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -762,7 +762,7 @@ class PrismaClient: ] = None, # pagination, number of rows to getch when find_all==True ): verbose_proxy_logger.debug( - f"PrismaClient: get_data: table_name: {table_name}, query_type: {query_type}, user_id: {user_id}, user_id_list: {user_id_list}, team_id: {team_id}, team_id_list: {team_id_list}, key_val: {key_val}" + f"PrismaClient: get_data: token={token}, table_name: {table_name}, query_type: {query_type}, user_id: {user_id}, user_id_list: {user_id_list}, team_id: {team_id}, team_id_list: {team_id_list}, key_val: {key_val}" ) try: response: Any = None From 8c3ec15856d87d3689bd87f86bc485f711ade8a0 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 15:44:03 -0800 Subject: [PATCH 205/304] (fix) improve improve prisma alerting/debug --- litellm/proxy/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 0f0097ff6..32f799360 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -997,9 +997,11 @@ class PrismaClient: except Exception as e: import traceback - error_msg = f"LiteLLM Prisma Client Exception get_data: {str(e)}" + prisma_query_info = f"LiteLLM Prisma Client Exception: get_data: token={token}, table_name: {table_name}, query_type: {query_type}, user_id: {user_id}, user_id_list: {user_id_list}, team_id: {team_id}, team_id_list: {team_id_list}, key_val: {key_val}" + error_msg = prisma_query_info + str(e) print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() + verbose_proxy_logger.debug(error_traceback) asyncio.create_task( self.proxy_logging_obj.failure_handler( original_exception=e, traceback_str=error_traceback From dec967f647bd3d865383f011b82275491ce3ba36 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Thu, 7 Mar 2024 16:31:23 -0800 Subject: [PATCH 206/304] Update model_prices_and_context_window.json --- model_prices_and_context_window.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 111b9f8c3..d56450b23 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -108,7 +108,7 @@ }, "gpt-3.5-turbo": { "max_tokens": 4097, - "max_input_tokens": 4097, + "max_input_tokens": 16385, "max_output_tokens": 4096, "input_cost_per_token": 0.0000015, "output_cost_per_token": 0.000002, @@ -2259,4 +2259,4 @@ "mode": "embedding" } -} \ No newline at end of file +} From da4b150398f9e7790ed9c33e831441f1ddcf32a0 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 16:49:39 -0800 Subject: [PATCH 207/304] (feat) init cloud form stack --- deploy/just_ec2.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 deploy/just_ec2.yaml diff --git a/deploy/just_ec2.yaml b/deploy/just_ec2.yaml new file mode 100644 index 000000000..5c51233dd --- /dev/null +++ b/deploy/just_ec2.yaml @@ -0,0 +1,8 @@ +--- +Resources: + MyEC2Instance: + Type: "AWS::EC2::Instance" + Properties: + AvailabilityZone: "us-east-1a" + ImageId: "ami-0f403e3180720dd7e" # Replace with your desired AMI ID + InstanceType: "t2.micro" From 702e46b53d4f7a130eab4d0e6480291037896290 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 17:50:14 -0800 Subject: [PATCH 208/304] (build) stack with db --- deploy/just_ec2.yaml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/deploy/just_ec2.yaml b/deploy/just_ec2.yaml index 5c51233dd..3097b6be0 100644 --- a/deploy/just_ec2.yaml +++ b/deploy/just_ec2.yaml @@ -1,8 +1,17 @@ --- Resources: - MyEC2Instance: + LiteLLMServer: Type: "AWS::EC2::Instance" Properties: AvailabilityZone: "us-east-1a" ImageId: "ami-0f403e3180720dd7e" # Replace with your desired AMI ID InstanceType: "t2.micro" + LiteLLMDB: + Type: "AWS::RDS::DBInstance" + Properties: + AllocatedStorage: 5 + Engine: "postgres" + MasterUsername: "litellmAdmin" # Replace with your desired master username + MasterUserPassword: "litellmPassword" # Replace with your desired secure password + DBInstanceClass: "db.t3.micro" + AvailabilityZone: "us-east-1a" From 2f960a965123b7bb73bffd5a86c3c9c3a36a2847 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 17:51:12 -0800 Subject: [PATCH 209/304] (feat) auto-scale --- deploy/just_ec2.yaml | 49 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/deploy/just_ec2.yaml b/deploy/just_ec2.yaml index 3097b6be0..97060b6c3 100644 --- a/deploy/just_ec2.yaml +++ b/deploy/just_ec2.yaml @@ -1,17 +1,44 @@ ---- Resources: LiteLLMServer: - Type: "AWS::EC2::Instance" + Type: AWS::EC2::Instance Properties: - AvailabilityZone: "us-east-1a" - ImageId: "ami-0f403e3180720dd7e" # Replace with your desired AMI ID - InstanceType: "t2.micro" + AvailabilityZone: us-east-1a + ImageId: ami-0f403e3180720dd7e + InstanceType: t2.micro + + LiteLLMServerAutoScalingGroup: + Type: AWS::AutoScaling::AutoScalingGroup + Properties: + AvailabilityZones: + - us-east-1a + LaunchConfigurationName: !Ref LiteLLMServerLaunchConfig + MinSize: 1 + MaxSize: 3 + DesiredCapacity: 1 + HealthCheckGracePeriod: 300 + + LiteLLMServerLaunchConfig: + Type: AWS::AutoScaling::LaunchConfiguration + Properties: + ImageId: ami-0f403e3180720dd7e # Replace with your desired AMI ID + InstanceType: t2.micro + + LiteLLMServerScalingPolicy: + Type: AWS::AutoScaling::ScalingPolicy + Properties: + AutoScalingGroupName: !Ref LiteLLMServerAutoScalingGroup + PolicyType: TargetTrackingScaling + TargetTrackingConfiguration: + PredefinedMetricSpecification: + PredefinedMetricType: ASGCPUUtilization + TargetValue: 60.0 + LiteLLMDB: - Type: "AWS::RDS::DBInstance" + Type: AWS::RDS::DBInstance Properties: AllocatedStorage: 5 - Engine: "postgres" - MasterUsername: "litellmAdmin" # Replace with your desired master username - MasterUserPassword: "litellmPassword" # Replace with your desired secure password - DBInstanceClass: "db.t3.micro" - AvailabilityZone: "us-east-1a" + Engine: postgres + MasterUsername: litellmAdmin + MasterUserPassword: litellmPassword + DBInstanceClass: db.t3.micro + AvailabilityZone: us-east-1a \ No newline at end of file From 323f15aa2f6146f80e826019c431cf687e13091b Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 18:06:59 -0800 Subject: [PATCH 210/304] (fix) litellm cloud formation stack --- .../cloudformation_stack/litellm.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename deploy/just_ec2.yaml => enterprise/cloudformation_stack/litellm.yaml (93%) diff --git a/deploy/just_ec2.yaml b/enterprise/cloudformation_stack/litellm.yaml similarity index 93% rename from deploy/just_ec2.yaml rename to enterprise/cloudformation_stack/litellm.yaml index 97060b6c3..c30956b94 100644 --- a/deploy/just_ec2.yaml +++ b/enterprise/cloudformation_stack/litellm.yaml @@ -30,13 +30,13 @@ Resources: PolicyType: TargetTrackingScaling TargetTrackingConfiguration: PredefinedMetricSpecification: - PredefinedMetricType: ASGCPUUtilization + PredefinedMetricType: ASGAverageCPUUtilization TargetValue: 60.0 LiteLLMDB: Type: AWS::RDS::DBInstance Properties: - AllocatedStorage: 5 + AllocatedStorage: 20 Engine: postgres MasterUsername: litellmAdmin MasterUserPassword: litellmPassword From 6f0faca85b1a2be0cb36ad5dcc072ed1a4fbaefb Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 18:33:09 -0800 Subject: [PATCH 211/304] (feat) print debug info per deployment --- litellm/proxy/proxy_config.yaml | 59 ++------------------- litellm/proxy/tests/load_test_completion.py | 6 +-- litellm/router.py | 45 ++++++++++++++++ 3 files changed, 51 insertions(+), 59 deletions(-) diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index 6b4b7a8f6..654a50b2f 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -5,63 +5,12 @@ model_list: api_base: os.environ/AZURE_API_BASE api_key: os.environ/AZURE_API_KEY api_version: "2023-07-01-preview" - model_info: - mode: chat - max_tokens: 4096 - base_model: azure/gpt-4-1106-preview - access_groups: ["public"] - - model_name: openai-gpt-3.5 + - model_name: azure-gpt-3.5 litellm_params: model: gpt-3.5-turbo api_key: os.environ/OPENAI_API_KEY model_info: access_groups: ["public"] - - model_name: anthropic-claude-v2.1 - litellm_params: - model: bedrock/anthropic.claude-v2:1 - timeout: 300 # sets a 5 minute timeout - model_info: - access_groups: ["private"] - - model_name: anthropic-claude-v2 - litellm_params: - model: bedrock/anthropic.claude-v2 - - model_name: bedrock-cohere - litellm_params: - model: bedrock/cohere.command-text-v14 - timeout: 0.0001 - - model_name: gpt-4 - litellm_params: - model: azure/chatgpt-v-2 - api_base: https://openai-gpt-4-test-v-1.openai.azure.com/ - api_version: "2023-05-15" - api_key: os.environ/AZURE_API_KEY # The `os.environ/` prefix tells litellm to read this from the env. See https://docs.litellm.ai/docs/simple_proxy#load-api-keys-from-vault - model_info: - base_model: azure/gpt-4 - - model_name: text-moderation-stable - litellm_params: - model: text-moderation-stable - api_key: os.environ/OPENAI_API_KEY -litellm_settings: - fallbacks: [{"openai-gpt-3.5": ["azure-gpt-3.5"]}] - success_callback: ['langfuse'] - # setting callback class - callbacks: custom_callbacks.proxy_handler_instance # sets litellm.callbacks = [proxy_handler_instance] - -general_settings: - master_key: sk-1234 - alerting: ["slack"] - alerting_threshold: 10 # sends alerts if requests hang for 2 seconds - # database_type: "dynamo_db" - # database_args: { # 👈 all args - https://github.com/BerriAI/litellm/blob/befbcbb7ac8f59835ce47415c128decf37aac328/litellm/proxy/_types.py#L190 - # "billing_mode": "PAY_PER_REQUEST", - # "region_name": "us-west-2", - # "ssl_verify": False - # } - - - - - -environment_variables: - # otel: True # OpenTelemetry Logger - # master_key: sk-1234 # [OPTIONAL] Only use this if you to require all calls to contain this key (Authorization: Bearer sk-1234) +router_settings: + set_verbose: True + debug_level: "DEBUG" \ No newline at end of file diff --git a/litellm/proxy/tests/load_test_completion.py b/litellm/proxy/tests/load_test_completion.py index d708f3036..c6e5f480e 100644 --- a/litellm/proxy/tests/load_test_completion.py +++ b/litellm/proxy/tests/load_test_completion.py @@ -4,9 +4,7 @@ import uuid import traceback -litellm_client = AsyncOpenAI( - base_url="http://0.0.0.0:4000", api_key="sk-iNwH_oOtAQ6syi_2gkEOpQ" -) +litellm_client = AsyncOpenAI(base_url="http://0.0.0.0:4000", api_key="sk-1234") async def litellm_completion(): @@ -29,7 +27,7 @@ async def litellm_completion(): async def main(): for i in range(150): start = time.time() - n = 2000 # Number of concurrent tasks + n = 20 # Number of concurrent tasks tasks = [litellm_completion() for _ in range(n)] chat_completions = await asyncio.gather(*tasks) diff --git a/litellm/router.py b/litellm/router.py index 6f33d0b0d..5c90ce834 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -240,6 +240,21 @@ class Router: {"caching_groups": caching_groups} ) + self.deployment_stats: dict = {} # used for debugging load balancing + """ + deployment_stats = { + "122999-2828282-277: + { + "model": "gpt-3", + "api_base": "http://localhost:8000", + "num_requests": 20, + "avg_latency": 0.001, + "num_failures": 0, + "num_successes": 20 + } + } + """ + ### ROUTING SETUP ### if routing_strategy == "least-busy": self.leastbusy_logger = LeastBusyLoggingHandler( @@ -390,6 +405,10 @@ class Router: messages=messages, specific_deployment=kwargs.pop("specific_deployment", None), ) + if self.set_verbose == True and self.debug_level == "DEBUG": + # debug how often this deployment picked + self._print_deployment_metrics(deployment=deployment) + kwargs.setdefault("metadata", {}).update( { "deployment": deployment["litellm_params"]["model"], @@ -2124,6 +2143,32 @@ class Router: ) return deployment + def _print_deployment_metrics(self, deployment): + litellm_params = deployment["litellm_params"] + api_base = litellm_params.get("api_base", "") + model = litellm_params.get("model", "") + + model_id = deployment.get("model_info", {}).get("id", None) + + # update self.deployment_stats + if model_id is not None: + if model_id in self.deployment_stats: + # only update num_requests + self.deployment_stats[model_id]["num_requests"] += 1 + else: + self.deployment_stats[model_id] = { + "api_base": api_base, + "model": model, + "num_requests": 1, + } + from pprint import pformat + + # Assuming self.deployment_stats is your dictionary + formatted_stats = pformat(self.deployment_stats) + + # Assuming verbose_router_logger is your logger + verbose_router_logger.info("self.deployment_stats: \n%s", formatted_stats) + def flush_cache(self): litellm.cache = None self.cache.flush_cache() From 86ac020b125555d252c0c0169b12429db636ba8b Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 18:50:45 -0800 Subject: [PATCH 212/304] (fix) show latency per deployment on router debug logs --- litellm/router.py | 74 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 5c90ce834..d4c0be862 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -465,6 +465,9 @@ class Router: verbose_router_logger.info( f"litellm.acompletion(model={model_name})\033[32m 200 OK\033[0m" ) + if self.set_verbose == True and self.debug_level == "DEBUG": + # debug how often this deployment picked + self._print_deployment_metrics(deployment=deployment, response=response) return response except Exception as e: verbose_router_logger.info( @@ -2143,31 +2146,62 @@ class Router: ) return deployment - def _print_deployment_metrics(self, deployment): - litellm_params = deployment["litellm_params"] - api_base = litellm_params.get("api_base", "") - model = litellm_params.get("model", "") + def _print_deployment_metrics(self, deployment, response=None): + try: + litellm_params = deployment["litellm_params"] + api_base = litellm_params.get("api_base", "") + model = litellm_params.get("model", "") - model_id = deployment.get("model_info", {}).get("id", None) + model_id = deployment.get("model_info", {}).get("id", None) + if response is None: - # update self.deployment_stats - if model_id is not None: - if model_id in self.deployment_stats: - # only update num_requests - self.deployment_stats[model_id]["num_requests"] += 1 + # update self.deployment_stats + if model_id is not None: + if model_id in self.deployment_stats: + # only update num_requests + self.deployment_stats[model_id]["num_requests"] += 1 + else: + self.deployment_stats[model_id] = { + "api_base": api_base, + "model": model, + "num_requests": 1, + } else: - self.deployment_stats[model_id] = { - "api_base": api_base, - "model": model, - "num_requests": 1, - } - from pprint import pformat + # check response_ms and update num_successes + response_ms = response.get("_response_ms", 0) + if model_id is not None: + if model_id in self.deployment_stats: + # check if avg_latency exists + if "avg_latency" in self.deployment_stats[model_id]: + # update avg_latency + self.deployment_stats[model_id]["avg_latency"] = ( + self.deployment_stats[model_id]["avg_latency"] + + response_ms + ) / self.deployment_stats[model_id]["num_successes"] + else: + self.deployment_stats[model_id]["avg_latency"] = response_ms - # Assuming self.deployment_stats is your dictionary - formatted_stats = pformat(self.deployment_stats) + # check if num_successes exists + if "num_successes" in self.deployment_stats[model_id]: + self.deployment_stats[model_id]["num_successes"] += 1 + else: + self.deployment_stats[model_id]["num_successes"] = 1 + else: + self.deployment_stats[model_id] = { + "api_base": api_base, + "model": model, + "num_successes": 1, + "avg_latency": response_ms, + } + from pprint import pformat - # Assuming verbose_router_logger is your logger - verbose_router_logger.info("self.deployment_stats: \n%s", formatted_stats) + # Assuming self.deployment_stats is your dictionary + formatted_stats = pformat(self.deployment_stats) + + # Assuming verbose_router_logger is your logger + verbose_router_logger.info("self.deployment_stats: \n%s", formatted_stats) + except Exception as e: + verbose_router_logger.error(f"Error in _print_deployment_metrics: {str(e)}") def flush_cache(self): litellm.cache = None From 4a4d36d923dfeecc2cfed8e88a304dbdc7f18cdc Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 20:45:32 -0800 Subject: [PATCH 213/304] (feat) bump litellm --- litellm/model_prices_and_context_window_backup.json | 4 ++-- pyproject.toml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 111b9f8c3..d56450b23 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -108,7 +108,7 @@ }, "gpt-3.5-turbo": { "max_tokens": 4097, - "max_input_tokens": 4097, + "max_input_tokens": 16385, "max_output_tokens": 4096, "input_cost_per_token": 0.0000015, "output_cost_per_token": 0.000002, @@ -2259,4 +2259,4 @@ "mode": "embedding" } -} \ No newline at end of file +} diff --git a/pyproject.toml b/pyproject.toml index 5880791ac..81daa25ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.1" +version = "1.30.2" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.1" +version = "1.30.2" version_files = [ "pyproject.toml:^version" ] From b4e12fb8fd6f5fd60563b9f228257dc5315fbff7 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Thu, 7 Mar 2024 21:01:28 -0800 Subject: [PATCH 214/304] (docs) litellm cloud formation stack --- docs/my-website/docs/proxy/deploy.md | 43 +++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 8ffc2adf5..6de8625d0 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -218,8 +218,49 @@ Provide an ssl certificate when starting litellm proxy server ## Platform-specific Guide - + + + +### AWS Cloud Formation Stack +LiteLLM AWS Cloudformation Stack - **Get the best LiteLLM AutoScaling Policy and Provision the DB for LiteLLM Proxy** + +This will provision: +- LiteLLMServer - EC2 Instance +- LiteLLMServerAutoScalingGroup +- LiteLLMServerScalingPolicy (autoscaling policy) +- LiteLLMDB - RDS::DBInstance + +#### Using AWS Cloud Formation Stack +**LiteLLM Cloudformation stack is located [here - litellm.yaml](https://github.com/BerriAI/litellm/blob/main/enterprise/cloudformation_stack/litellm.yaml)** + +#### 1. Create the CloudFormation Stack: +In the AWS Management Console, navigate to the CloudFormation service, and click on "Create Stack." + +On the "Create Stack" page, select "Upload a template file" and choose the litellm.yaml file + +Now monitor the stack was created successfully. + +#### 2. Get the Database URL: +Once the stack is created, get the DatabaseURL of the Database resource, copy this value + +#### 3. Connect to the EC2 Instance and deploy litellm on the EC2 container +From the EC2 console, connect to the instance created by the stack (e.g., using SSH). + +Run the following command, replacing with the value you copied in step 2 + +```shell +docker run --name litellm-proxy \ + -e DATABASE_URL= \ + -p 4000:4000 \ + ghcr.io/berriai/litellm-database:main-latest +``` + +#### 4. Access the Application: + +Once the container is running, you can access the application by going to `http://:4000` in your browser. + + ### Deploy on Google Cloud Run From 0cf056f493e79eaf86fa01b7890da0a7783b0c24 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 7 Mar 2024 21:48:18 -0800 Subject: [PATCH 215/304] fix(proxy_server.py): use argon2 for faster api key checking 0.04s latency boost on load test --- litellm/proxy/proxy_server.py | 34 +++++---- litellm/proxy/tests/large_text.py | 82 +++++++++++++++++++++ litellm/proxy/tests/load_test_completion.py | 34 ++++++--- pyproject.toml | 3 +- requirements.txt | 1 + 5 files changed, 130 insertions(+), 24 deletions(-) create mode 100644 litellm/proxy/tests/large_text.py diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 19ac5c961..3ab3b2c04 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -9,6 +9,9 @@ import warnings import importlib import warnings import backoff +from argon2 import PasswordHasher + +ph = PasswordHasher() def showwarning(message, category, filename, lineno, file=None, line=None): @@ -255,6 +258,7 @@ litellm_proxy_admin_name = "default_user_id" ui_access_mode: Literal["admin", "all"] = "all" proxy_budget_rescheduler_min_time = 597 proxy_budget_rescheduler_max_time = 605 +litellm_master_key_hash = None ### INITIALIZE GLOBAL LOGGING OBJECT ### proxy_logging_obj = ProxyLogging(user_api_key_cache=user_api_key_cache) ### REDIS QUEUE ### @@ -313,6 +317,16 @@ async def user_api_key_auth( else: return UserAPIKeyAuth() + ### CHECK IF ADMIN ### + # note: never string compare api keys, this is vulenerable to a time attack. Use secrets.compare_digest instead + is_master_key_valid = ph.verify(api_key, litellm_master_key_hash) + if is_master_key_valid: + return UserAPIKeyAuth( + api_key=master_key, + user_role="proxy_admin", + user_id=litellm_proxy_admin_name, + ) + route: str = request.url.path if route == "/user/auth": if general_settings.get("allow_user_auth", False) == True: @@ -334,31 +348,22 @@ async def user_api_key_auth( Unprotected endpoints """ return UserAPIKeyAuth() + elif route.startswith("/config/"): + raise Exception(f"Only admin can modify config") if api_key is None: # only require api key if master key is set raise Exception(f"No api key passed in.") - if secrets.compare_digest(api_key, ""): + if api_key == "": # missing 'Bearer ' prefix raise Exception( f"Malformed API Key passed in. Ensure Key has `Bearer ` prefix. Passed in: {passed_in_key}" ) - ### CHECK IF ADMIN ### - # note: never string compare api keys, this is vulenerable to a time attack. Use secrets.compare_digest instead - is_master_key_valid = secrets.compare_digest(api_key, master_key) - if is_master_key_valid: - return UserAPIKeyAuth( - api_key=master_key, - user_role="proxy_admin", - user_id=litellm_proxy_admin_name, - ) if isinstance( api_key, str ): # if generated token, make sure it starts with sk-. assert api_key.startswith("sk-") # prevent token hashes from being used - if route.startswith("/config/") and not is_master_key_valid: - raise Exception(f"Only admin can modify config") if ( prisma_client is None and custom_db_client is None @@ -1492,7 +1497,7 @@ class ProxyConfig: """ Load config values into proxy global state """ - global master_key, user_config_file_path, otel_logging, user_custom_auth, user_custom_auth_path, user_custom_key_generate, use_background_health_checks, health_check_interval, use_queue, custom_db_client, proxy_budget_rescheduler_max_time, proxy_budget_rescheduler_min_time, ui_access_mode + global master_key, user_config_file_path, otel_logging, user_custom_auth, user_custom_auth_path, user_custom_key_generate, use_background_health_checks, health_check_interval, use_queue, custom_db_client, proxy_budget_rescheduler_max_time, proxy_budget_rescheduler_min_time, ui_access_mode, litellm_master_key_hash # Load existing config config = await self.get_config(config_file_path=config_file_path) @@ -1757,6 +1762,8 @@ class ProxyConfig: ) if master_key and master_key.startswith("os.environ/"): master_key = litellm.get_secret(master_key) + + litellm_master_key_hash = ph.hash(master_key) ### CUSTOM API KEY AUTH ### ## pass filepath custom_auth = general_settings.get("custom_auth", None) @@ -2830,6 +2837,7 @@ async def chat_completion( response = await proxy_logging_obj.post_call_success_hook( user_api_key_dict=user_api_key_dict, response=response ) + return response except Exception as e: traceback.print_exc() diff --git a/litellm/proxy/tests/large_text.py b/litellm/proxy/tests/large_text.py new file mode 100644 index 000000000..10717ea6b --- /dev/null +++ b/litellm/proxy/tests/large_text.py @@ -0,0 +1,82 @@ +text = """ +{{Short description|Military commander and king of Macedon (356–323 BC)}} +{{About|the ancient king of Macedonia}} +{{Good article}} +{{pp-semi-indef}} +{{pp-move-indef}} +{{Use Oxford spelling|date=September 2020}} +{{Use dmy dates|date=January 2023}} +{{Infobox royalty +| name = Alexander the Great +| title = [[Basileus]] +| image = Alexander the Great mosaic (cropped).jpg +| caption = Alexander in the ''[[Alexander Mosaic]]'' +| succession = [[King of Macedon]] +| reign = 336–323 BC +| predecessor = [[Philip II of Macedon|Philip II]] +| successor = {{hlist| +| [[Alexander IV of Macedon|Alexander IV]] +| [[Philip III of Macedon|Philip III]] +}} +| succession2 = [[Hegemony#8th–1st centuries BC|Hegemon]] of the [[League of Corinth|Hellenic League]] +| reign2 = 336–323 BC +| predecessor2 = Philip II +| successor2 = [[Demetrius I of Macedon]] +| succession3 = [[List of pharaohs|Pharaoh of Egypt]] +| reign3 = 332–323 BC +| predecessor3 = [[Darius III]] +| successor3 = {{hlist| +| Alexander IV +| Philip III +{{Ancient Egyptian royal titulary case |nomen={{ubl|{{transliteration|egy|ꜣrwksjndrs}}|{{transliteration|egy|Aluksindres}}|Alexandros}} |nomen_hiero=A-rw:k:z-i-n:d:r:z |horus={{ubl|{{transliteration|egy|mk-kmt}}|{{transliteration|egy|Mekemet}}|Protector of Egypt}} {{Infobox pharaoh/Serekh |Horus=S-HqA-q:n:nw-D40}}{{pb}}Second Horus name:{{ubl|{{transliteration|egy|ḥḳꜣ-ḳnj tkn-ḫꜣswt}}|{{transliteration|egy|Heqaqeni tekenkhasut}}|The brave ruler who has attacked foreign lands}} {{Infobox pharaoh/Serekh |Horus=HqA-q:n:nw:D40-t:k:n:D54-N25:N25:N25}}{{pb}}Third Horus name:{{ubl|{{transliteration|egy|ḥḳꜣ ḥḳꜣw nw tꜣ (r) ḏr-f}}|{{transliteration|egy|Heqa heqau nu ta (er) djeref}}|The ruler of the rulers of the entire land}} {{Infobox pharaoh/Serekh |Horus=HqA-q-HqA-HqA-q-N33-nw-N33-N17:N34-r:f}}Fourth Horus name:{{ubl|{{transliteration|egy|ṯmꜣ-ꜥ}}|{{transliteration|egy|Tjema'a}}|The sturdy-armed one}} {{Infobox pharaoh/Serekh |Horus=T:mA-a}} |nebty={{ubl|{{transliteration|egy|mꜣj wr-pḥty jṯ ḏww tꜣw ḫꜣswt}}|{{transliteration|egy|Mai werpehty itj dju tau khasut}}|The lion, great of might, who takes possession of mountains, lands, and deserts}} |nebty_hiero=E23-wr:r-F9:F9-V15-N25:N25:N33-N17:N17:N33-N25:N25:N33 |golden={{ubl|{{transliteration|egy|kꜣ (nḫt) ḫwj bꜣḳ(t) ḥḳꜣ wꜣḏ(-wr) šnw n jtn}}|{{transliteration|egy|Ka (nakht) khui baq(et) heqa wadj(wer) shenu en Aten}}|The (strong) bull who protects Egypt, the ruler of the sea and of what the sun encircles}} |golden_hiero=E1:n-i-w*x-D40-q:t-b-{{pb}}D10-HqA-M14-N35A-V9:Z1-i-t:n:HASH |prenomen={{ubl|{{transliteration|egy|stp.n-rꜥ mrj-jmn}}|{{transliteration|egy|Setepenre meryamun}}|Chosen by Ra, beloved by Amun{{pb}}{{Infobox pharaoh/Prenomen |Prenomen=C2\-C12-stp:n:N36}}{{pb}}{{Infobox pharaoh/Prenomen |Prenomen=mr\-C12\-C2-stp:n}}}}}} +}} +| succession4 = [[King of Persia]] +| reign4 = 330–323 BC +| predecessor4 = Darius III +| successor4 = {{hlist| +| Alexander IV +| Philip III +}} +| full name = +| spouse = {{hlist| +| [[Roxana]] +| [[Stateira (wife of Alexander the Great)|Stateira]] +| [[Parysatis II|Parysatis]] +}} +| issue = {{plainlist| +* [[Alexander IV of Macedon|Alexander IV]] +* [[Heracles of Macedon|Heracles]]{{Cref2|a}} +}} +| native_lang1 = [[Ancient Greek|Greek]] +| native_lang1_name1 = {{lang|grc|Ἀλέξανδρος}}{{Cref2|b}} +| house = [[Argead dynasty|Argead]] +| house-type = Dynasty +| father = [[Philip II of Macedon]] +| mother = [[Olympias|Olympias of Epirus]] +| birth_date = 20 or 21 July 356 BC +| birth_place = [[Pella]], [[Macedonia (ancient kingdom)|Macedon]] +| death_date = 10 or 11 June 323 BC (aged 32) +| death_place = [[Babylon]], [[Mesopotamia]], Macedonian Empire +| religion = [[Ancient Greek religion]] +}} + +'''Alexander III of Macedon''' ({{lang-grc|[[wikt:Ἀλέξανδρος|Ἀλέξανδρος]]|Alexandros}}; 20/21 July 356 BC – 10/11 June 323 BC), most commonly known as '''Alexander the Great''',{{Cref2|c}} was a king of the [[Ancient Greece|ancient Greek]] kingdom of [[Macedonia (ancient kingdom)|Macedon]].{{Cref2|d}} He succeeded his father [[Philip II of Macedon|Philip II]] to the throne in 336 BC at the age of 20 and spent most of his ruling years conducting a lengthy [[military campaign]] throughout [[Western Asia]], [[Central Asia]], parts of [[South Asia]], and [[ancient Egypt|Egypt]]. By the age of 30, he had created one of the [[List of largest empires|largest empires]] in history, stretching from [[History of Greece|Greece]] to northwestern [[Historical India|India]].Bloom, Jonathan M.; Blair, Sheila S. (2009) ''The Grove Encyclopedia of Islamic Art and Architecture: Mosul to Zirid, Volume 3''. (Oxford University Press Incorporated, 2009), 385; "[Khojand, Tajikistan]; As the easternmost outpost of the empire of Alexander the Great, the city was renamed Alexandria Eschate ("furthest Alexandria") in 329 BCE."{{pb}}Golden, Peter B. ''Central Asia in World History'' (Oxford University Press, 2011), 25;"[...] his campaigns in Central Asia brought Khwarazm, Sogdia and Bactria under Graeco-Macedonian rule. As elsewhere, Alexander founded or renamed a number of cities, such as Alexandria Eschate ("Outernmost Alexandria", near modern Khojent in Tajikistan)." He was undefeated in battle and is widely considered to be one of history's greatest and most successful military commanders.{{Sfn |Yenne|2010 | page = 159}}{{cite encyclopedia|title=Alexander the Great's Achievements|encyclopedia=Britannica|url=https://www.britannica.com/summary/Alexander-the-Greats-Achievements|access-date=19 August 2021|archive-date=2 July 2021|archive-url=https://web.archive.org/web/20210702234248/https://www.britannica.com/summary/Alexander-the-Greats-Achievements|url-status=live}} "Alexander the Great was one of the greatest military strategists and leaders in world history." + +Until the age of 16, Alexander was tutored by [[Aristotle]]. In 335 BC, shortly after his assumption of kingship over Macedon, he [[Alexander's Balkan campaign|campaigned in the Balkans]] and reasserted control over [[Thrace]] and parts of [[Illyria]] before marching on the city of [[Thebes, Greece|Thebes]], which was [[Battle of Thebes|subsequently destroyed in battle]]. Alexander then led the [[League of Corinth]], and used his authority to launch the [[Greek nationalism#History|pan-Hellenic project]] envisaged by his father, assuming leadership over all [[Greeks]] in their conquest of [[Greater Iran|Persia]].{{sfn|Heckel|Tritle|2009|p=99}}{{cite book |last1=Burger |first1=Michael |title=The Shaping of Western Civilization: From Antiquity to the Enlightenment |date=2008 |publisher=University of Toronto Press |isbn=978-1-55111-432-3 |page=76}} + +In 334 BC, he invaded the [[Achaemenid Empire|Achaemenid Persian Empire]] and began [[Wars of Alexander the Great#Persia|a series of campaigns]] that lasted for 10 years. Following his conquest of [[Asia Minor]], Alexander broke the power of Achaemenid Persia in a series of decisive battles, including those at [[Battle of Issus|Issus]] and [[Battle of Gaugamela|Gaugamela]]; he subsequently overthrew [[Darius III]] and conquered the Achaemenid Empire in its entirety.{{Cref2|e}} After the fall of Persia, the [[Macedonian Empire]] held a vast swath of territory between the [[Adriatic Sea]] and the [[Indus River]]. Alexander endeavored to reach the "ends of the world and the Great Outer Sea" and [[Indian campaign of Alexander the Great|invaded India]] in 326 BC, achieving an important victory over [[Porus]], an ancient Indian king of present-day [[Punjab]], at the [[Battle of the Hydaspes]]. Due to the demand of his homesick troops, he eventually turned back at the [[Beas River]] and later died in 323 BC in [[Babylon]], the city of [[Mesopotamia]] that he had planned to establish as his empire's capital. [[Death of Alexander the Great|Alexander's death]] left unexecuted an additional series of planned military and mercantile campaigns that would have begun with a Greek invasion of [[Arabian Peninsula|Arabia]]. In the years following his death, [[Wars of the Diadochi|a series of civil wars]] broke out across the Macedonian Empire, eventually leading to its disintegration at the hands of the [[Diadochi]]. + +With his death marking the start of the [[Hellenistic period]], Alexander's legacy includes the [[cultural diffusion]] and [[syncretism]] that his conquests engendered, such as [[Greco-Buddhism]] and [[Hellenistic Judaism]]. [[List of cities founded by Alexander the Great|He founded more than twenty cities]], with the most prominent being the city of [[Alexandria]] in Egypt. Alexander's settlement of [[Greek colonisation|Greek colonists]] and the resulting spread of [[Culture of Greece|Greek culture]] led to the overwhelming dominance of [[Hellenistic civilization]] and influence as far east as the [[Indian subcontinent]]. The Hellenistic period developed through the [[Roman Empire]] into modern [[Western culture]]; the [[Greek language]] became the ''[[lingua franca]]'' of the region and was the predominant language of the [[Byzantine Empire]] up until its collapse in the mid-15th century AD. Alexander became legendary as a classical hero in the mould of [[Achilles]], featuring prominently in the historical and mythical traditions of both Greek and non-Greek cultures. His military achievements and unprecedented enduring successes in battle made him the measure against which many later military leaders would compare themselves,{{cref2|f}} and his tactics remain a significant subject of study in [[Military academy|military academies]] worldwide.{{Sfn|Yenne|2010|page=viii}} + +{{TOC limit|3}} + +==Early life== + +===Lineage and childhood=== + +[[File:Archaeological Site of Pella by Joy of Museums.jpg|thumb|upright=1.2|Archaeological site of [[Pella]], Greece, Alexander's birthplace]] +{{Alexander the Great series}} +Alexander III was born in [[Pella]], the capital of the [[Macedonia (ancient kingdom)|Kingdom of Macedon]],{{cite book |last=Green |first=Peter |title=Alexander of Macedon, 356–323 B.C.: a historical biography |url=https://books.google.com/books?id=g6Wl4AKGQkIC&pg=PA559 |page=xxxiii |year=1970 |series=Hellenistic culture and society |edition=illustrated, revised reprint |publisher=University of California Press |isbn=978-0-520-07165-0 |quote=356 – Alexander born in Pella. The exact date is not known, but probably either 20 or 26 July. |access-date=20 June 2015}} on the sixth day of the [[Ancient Greek calendars|ancient Greek month]] of [[Attic calendar|Hekatombaion]], which probably corresponds to 20 July 356 BC (although the exact date is uncertain).Plutarch, ''Life of Alexander'' 3.5: {{cite web |url=https://www.livius.org/aj-al/alexander/alexander_t32.html#7 |title=The birth of Alexander the Great |work=Livius|archive-url=https://web.archive.org/web/20150320180439/https://www.livius.org/aj-al/alexander/alexander_t32.html|archive-date=20 March 2015|url-status = dead |access-date=16 December 2011 |quote=Alexander was born the sixth of [[Attic calendar|Hekatombaion]].}}{{cite book |author=David George Hogarth |date=1897 |title=Philip and Alexander of Macedon : two essays in biography |url=https://archive.org/details/cu31924028251217/page/n321/mode/2up?view=theater |location=New York |publisher=Charles Scribner's Sons |pages=286–287 |access-date=9 November 2021}} He was the son of the erstwhile king of Macedon, [[Philip II of Macedon|Philip II]], and his fourth wife, [[Olympias]] (daughter of [[Neoptolemus I of Epirus|Neoptolemus I]], king of [[Epirus (ancient state)|Epirus]]).{{harvnb|McCarty|2004|p=10}}, {{harvnb|Renault|2001|p=28}}, {{harvnb|Durant|1966|p=538}}{{Cref2|g}} Although Philip had seven or eight wives, Olympias was his principal wife for some time, likely because she gave birth to Alexander.{{sfn|Roisman|Worthington|2010|p=171}} + +Several legends surround Alexander's birth and childhood.{{sfn|Roisman|Worthington|2010|p=188}} According to the [[Ancient Greeks|ancient Greek]] biographer [[Plutarch]], on the eve of the consummation of her marriage to Philip, Olympias dreamed that her womb was struck by a thunderbolt that caused a flame to spread "far and wide" before dying away. Sometime after the wedding, Philip is said to have seen himself, in a dream, securing his wife's womb with a [[Seal (emblem)|seal]] engraved with a lion's image. Plutarch offered a variety of interpretations for these dreams: that Olympias was pregnant before her marriage, indicated by the sealing of her womb; or that Alexander's father was [[Zeus]]. Ancient commentators were divided about whether the ambitious Olympias promulgated the story of Alexander's divine parentage, variously claiming that she had told Alexander, or that she dismissed the suggestion as impious. +""" diff --git a/litellm/proxy/tests/load_test_completion.py b/litellm/proxy/tests/load_test_completion.py index d708f3036..b85ef2d0f 100644 --- a/litellm/proxy/tests/load_test_completion.py +++ b/litellm/proxy/tests/load_test_completion.py @@ -1,22 +1,37 @@ -import time, asyncio -from openai import AsyncOpenAI +import time, asyncio, os +from openai import AsyncOpenAI, AsyncAzureOpenAI import uuid import traceback +from large_text import text +from dotenv import load_dotenv - +load_dotenv() litellm_client = AsyncOpenAI( - base_url="http://0.0.0.0:4000", api_key="sk-iNwH_oOtAQ6syi_2gkEOpQ" + base_url="http://0.0.0.0:4000", + api_key="sk-VEbqnb28-zDsFzQWTmiCsw", + # base_url="http://0.0.0.0:4000", + # api_key="sk-1234", ) +# litellm_client = AsyncAzureOpenAI( +# azure_endpoint="https://openai-gpt-4-test-v-1.openai.azure.com", +# api_key="d6f82361954b450188295b448e2091ca", +# api_version="2023-07-01-preview", +# ) + async def litellm_completion(): # Your existing code for litellm_completion goes here try: response = await litellm_client.chat.completions.create( - model="azure-gpt-3.5", - messages=[{"role": "user", "content": f"This is a test: {uuid.uuid4()}"}], + model="fake_openai", + messages=[ + { + "role": "user", + "content": f"{text}. Who was alexander the great? {uuid.uuid4()}", + } + ], ) - print(response) return response except Exception as e: @@ -27,9 +42,9 @@ async def litellm_completion(): async def main(): - for i in range(150): + for i in range(6): start = time.time() - n = 2000 # Number of concurrent tasks + n = 100 # Number of concurrent tasks tasks = [litellm_completion() for _ in range(n)] chat_completions = await asyncio.gather(*tasks) @@ -43,7 +58,6 @@ async def main(): error_log.write(completion + "\n") print(n, time.time() - start, len(successful_completions)) - time.sleep(10) if __name__ == "__main__": diff --git a/pyproject.toml b/pyproject.toml index 5880791ac..c7701be9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,8 @@ proxy = [ "apscheduler", "fastapi-sso", "PyJWT", - "python-multipart" + "python-multipart", + "argon2-cffi" ] extra_proxy = [ diff --git a/requirements.txt b/requirements.txt index caede5b67..e13fa6ab8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,4 +33,5 @@ jinja2==3.1.3 # for prompt templates certifi>=2023.7.22 # [TODO] clean up aiohttp==3.9.0 # for network calls aioboto3==12.3.0 # for async sagemaker calls +argon2-cffi==23.1.0 #### \ No newline at end of file From 0e7b30bec9ba765d92344a2078eec369e77def6c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 08:01:10 -0800 Subject: [PATCH 216/304] fix(utils.py): return function name for ollama_chat function calls --- docs/my-website/docs/providers/ollama.md | 6 +++ litellm/__init__.py | 1 + litellm/llms/ollama_chat.py | 68 ++++++++++++++++++++++-- litellm/utils.py | 30 +++-------- 4 files changed, 79 insertions(+), 26 deletions(-) diff --git a/docs/my-website/docs/providers/ollama.md b/docs/my-website/docs/providers/ollama.md index 51d91ccb6..78c91bb63 100644 --- a/docs/my-website/docs/providers/ollama.md +++ b/docs/my-website/docs/providers/ollama.md @@ -5,6 +5,12 @@ LiteLLM supports all models from [Ollama](https://github.com/jmorganca/ollama) Open In Colab
+:::info + +We recommend using [ollama_chat](#using-ollama-apichat) for better responses. + +::: + ## Pre-requisites Ensure you have your ollama server running diff --git a/litellm/__init__.py b/litellm/__init__.py index 017bd46ac..506147166 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -588,6 +588,7 @@ from .llms.petals import PetalsConfig from .llms.vertex_ai import VertexAIConfig from .llms.sagemaker import SagemakerConfig from .llms.ollama import OllamaConfig +from .llms.ollama_chat import OllamaChatConfig from .llms.maritalk import MaritTalkConfig from .llms.bedrock import ( AmazonTitanConfig, diff --git a/litellm/llms/ollama_chat.py b/litellm/llms/ollama_chat.py index dec74fa92..8378a95ff 100644 --- a/litellm/llms/ollama_chat.py +++ b/litellm/llms/ollama_chat.py @@ -18,7 +18,7 @@ class OllamaError(Exception): ) # Call the base class constructor with the parameters it needs -class OllamaConfig: +class OllamaChatConfig: """ Reference: https://github.com/jmorganca/ollama/blob/main/docs/api.md#parameters @@ -108,6 +108,7 @@ class OllamaConfig: k: v for k, v in cls.__dict__.items() if not k.startswith("__") + and k != "function_name" # special param for function calling and not isinstance( v, ( @@ -120,6 +121,61 @@ class OllamaConfig: and v is not None } + def get_supported_openai_params( + self, + ): + return [ + "max_tokens", + "stream", + "top_p", + "temperature", + "frequency_penalty", + "stop", + "tools", + "tool_choice", + "functions", + ] + + def map_openai_params(self, non_default_params: dict, optional_params: dict): + for param, value in non_default_params.items(): + if param == "max_tokens": + optional_params["num_predict"] = value + if param == "stream": + optional_params["stream"] = value + if param == "temperature": + optional_params["temperature"] = value + if param == "top_p": + optional_params["top_p"] = value + if param == "frequency_penalty": + optional_params["repeat_penalty"] = param + if param == "stop": + optional_params["stop"] = value + ### FUNCTION CALLING LOGIC ### + if param == "tools": + # ollama actually supports json output + optional_params["format"] = "json" + litellm.add_function_to_prompt = ( + True # so that main.py adds the function call to the prompt + ) + optional_params["functions_unsupported_model"] = value + + if len(optional_params["functions_unsupported_model"]) == 1: + optional_params["function_name"] = optional_params[ + "functions_unsupported_model" + ][0]["function"]["name"] + + if param == "functions": + # ollama actually supports json output + optional_params["format"] = "json" + litellm.add_function_to_prompt = ( + True # so that main.py adds the function call to the prompt + ) + optional_params["functions_unsupported_model"] = non_default_params.pop( + "functions" + ) + non_default_params.pop("tool_choice", None) # causes ollama requests to hang + return optional_params + # ollama implementation def get_ollama_response( @@ -138,7 +194,7 @@ def get_ollama_response( url = f"{api_base}/api/chat" ## Load Config - config = litellm.OllamaConfig.get_config() + config = litellm.OllamaChatConfig.get_config() for k, v in config.items(): if ( k not in optional_params @@ -147,6 +203,7 @@ def get_ollama_response( stream = optional_params.pop("stream", False) format = optional_params.pop("format", None) + function_name = optional_params.pop("function_name", None) for m in messages: if "role" in m and m["role"] == "tool": @@ -187,6 +244,7 @@ def get_ollama_response( model_response=model_response, encoding=encoding, logging_obj=logging_obj, + function_name=function_name, ) return response elif stream == True: @@ -290,7 +348,9 @@ async def ollama_async_streaming(url, data, model_response, encoding, logging_ob traceback.print_exc() -async def ollama_acompletion(url, data, model_response, encoding, logging_obj): +async def ollama_acompletion( + url, data, model_response, encoding, logging_obj, function_name +): data["stream"] = False try: timeout = aiohttp.ClientTimeout(total=litellm.request_timeout) # 10 minutes @@ -324,7 +384,7 @@ async def ollama_acompletion(url, data, model_response, encoding, logging_obj): "id": f"call_{str(uuid.uuid4())}", "function": { "arguments": response_json["message"]["content"], - "name": "", + "name": function_name or "", }, "type": "function", } diff --git a/litellm/utils.py b/litellm/utils.py index 4c48c5516..38836a4bc 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4147,8 +4147,9 @@ def get_optional_params( and custom_llm_provider != "mistral" and custom_llm_provider != "anthropic" and custom_llm_provider != "bedrock" + and custom_llm_provider != "ollama_chat" ): - if custom_llm_provider == "ollama" or custom_llm_provider == "ollama_chat": + if custom_llm_provider == "ollama": # ollama actually supports json output optional_params["format"] = "json" litellm.add_function_to_prompt = ( @@ -4174,7 +4175,7 @@ def get_optional_params( else: raise UnsupportedParamsError( status_code=500, - message=f"Function calling is not supported by {custom_llm_provider}. To add it to the prompt, set `litellm.add_function_to_prompt = True`.", + message=f"Function calling is not supported by {custom_llm_provider}.", ) def _check_valid_arg(supported_params): @@ -4687,28 +4688,13 @@ def get_optional_params( if stop is not None: optional_params["stop"] = stop elif custom_llm_provider == "ollama_chat": - supported_params = [ - "max_tokens", - "stream", - "top_p", - "temperature", - "frequency_penalty", - "stop", - ] + supported_params = litellm.OllamaChatConfig().get_supported_openai_params() + _check_valid_arg(supported_params=supported_params) - if max_tokens is not None: - optional_params["num_predict"] = max_tokens - if stream: - optional_params["stream"] = stream - if temperature is not None: - optional_params["temperature"] = temperature - if top_p is not None: - optional_params["top_p"] = top_p - if frequency_penalty is not None: - optional_params["repeat_penalty"] = frequency_penalty - if stop is not None: - optional_params["stop"] = stop + optional_params = litellm.OllamaChatConfig().map_openai_params( + non_default_params=non_default_params, optional_params=optional_params + ) elif custom_llm_provider == "nlp_cloud": supported_params = [ "max_tokens", From 2f9a39f30c3561fa40340796f9982ee6afc82986 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 08:12:22 -0800 Subject: [PATCH 217/304] refactor(main.py): trigger new build --- litellm/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/main.py b/litellm/main.py index dfe6c5f31..63649844a 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -10,7 +10,6 @@ import os, openai, sys, json, inspect, uuid, datetime, threading from typing import Any, Literal, Union from functools import partial - import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy import httpx From f8f01e52241684a64334924f4f20b1ed34600378 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 08:12:36 -0800 Subject: [PATCH 218/304] =?UTF-8?q?bump:=20version=201.30.2=20=E2=86=92=20?= =?UTF-8?q?1.30.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 81daa25ed..80f5c822c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.2" +version = "1.30.3" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.2" +version = "1.30.3" version_files = [ "pyproject.toml:^version" ] From f70feb180699aef63d2d99e3207d7fb8f2bae728 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 09:33:54 -0800 Subject: [PATCH 219/304] (test) name with claude-3 --- litellm/tests/test_completion.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 4db664dde..e54617bd9 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -83,12 +83,13 @@ def test_completion_claude(): def test_completion_claude_3_empty_response(): + litellm.set_verbose = True messages = [ { "role": "system", "content": "You are 2twNLGfqk4GMOn3ffp4p.", }, - {"role": "user", "content": "Hi gm!"}, + {"role": "user", "content": "Hi gm!", "name": "ishaan"}, {"role": "assistant", "content": "Good morning! How are you doing today?"}, { "role": "user", From 96e369613882a7e6429fc29709f3649a2ff5bca8 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 09:41:58 -0800 Subject: [PATCH 220/304] (fix) support name on perplexity/ --- litellm/llms/openai.py | 24 ++++++++++++++++-------- litellm/llms/prompt_templates/factory.py | 13 +++++++++++-- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/litellm/llms/openai.py b/litellm/llms/openai.py index 90846b627..de605edff 100644 --- a/litellm/llms/openai.py +++ b/litellm/llms/openai.py @@ -237,14 +237,22 @@ class OpenAIChatCompletion(BaseLLM): status_code=422, message=f"Timeout needs to be a float" ) - if custom_llm_provider == "mistral": - # check if message content passed in as list, and not string - messages = prompt_factory( - model=model, - messages=messages, - custom_llm_provider=custom_llm_provider, - ) - + if custom_llm_provider != "openai": + # process all OpenAI compatible provider logic here + if custom_llm_provider == "mistral": + # check if message content passed in as list, and not string + messages = prompt_factory( + model=model, + messages=messages, + custom_llm_provider=custom_llm_provider, + ) + if custom_llm_provider == "perplexity" and messages is not None: + # check if messages.name is passed + supported, if not supported remove + messages = prompt_factory( + model=model, + messages=messages, + custom_llm_provider=custom_llm_provider, + ) for _ in range( 2 ): # if call fails due to alternating messages, retry with reformatted message diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index 616833a2e..a13130c62 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -556,6 +556,7 @@ def anthropic_messages_pt(messages: list): 3. Each message must alternate between "user" and "assistant" (this is not addressed as now by litellm) 4. final assistant content cannot end with trailing whitespace (anthropic raises an error otherwise) 5. System messages are a separate param to the Messages API (used for tool calling) + 6. Ensure we only accept role, content. (message.name is not supported) """ ## Ensure final assistant message has no trailing whitespace last_assistant_message_idx: Optional[int] = None @@ -583,7 +584,9 @@ def anthropic_messages_pt(messages: list): new_content.append({"type": "text", "text": m["text"]}) new_messages.append({"role": messages[0]["role"], "content": new_content}) # type: ignore else: - new_messages.append(messages[0]) + new_messages.append( + {"role": messages[0]["role"], "content": messages[0]["content"]} + ) return new_messages @@ -606,7 +609,9 @@ def anthropic_messages_pt(messages: list): new_content.append({"type": "text", "content": m["text"]}) new_messages.append({"role": messages[i]["role"], "content": new_content}) # type: ignore else: - new_messages.append(messages[i]) + new_messages.append( + {"role": messages[i]["role"], "content": messages[i]["content"]} + ) if messages[i]["role"] == messages[i + 1]["role"]: if messages[i]["role"] == "user": @@ -897,6 +902,10 @@ def prompt_factory( return anthropic_pt(messages=messages) elif "mistral." in model: return mistral_instruct_pt(messages=messages) + elif custom_llm_provider == "perplexity": + for message in messages: + message.pop("name", None) + return messages try: if "meta-llama/llama-2" in model and "chat" in model: return llama_2_chat_pt(messages=messages) From 696eb54455c8c9caba86ac14e72f365b2c853223 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 10:25:19 -0800 Subject: [PATCH 221/304] feat(main.py): support openai transcription endpoints enable user to load balance between openai + azure transcription endpoints --- litellm/llms/openai.py | 100 +++++++++++++++++- litellm/main.py | 72 ++++++++++++- ...odel_prices_and_context_window_backup.json | 12 +++ litellm/utils.py | 60 ++++++++++- model_prices_and_context_window.json | 12 +++ tests/gettysburg.wav | Bin 0 -> 775192 bytes tests/test_whisper.py | 26 +++++ 7 files changed, 275 insertions(+), 7 deletions(-) create mode 100644 tests/gettysburg.wav create mode 100644 tests/test_whisper.py diff --git a/litellm/llms/openai.py b/litellm/llms/openai.py index 90846b627..fca950d31 100644 --- a/litellm/llms/openai.py +++ b/litellm/llms/openai.py @@ -1,4 +1,4 @@ -from typing import Optional, Union, Any +from typing import Optional, Union, Any, BinaryIO import types, time, json, traceback import httpx from .base import BaseLLM @@ -9,6 +9,7 @@ from litellm.utils import ( CustomStreamWrapper, convert_to_model_response_object, Usage, + TranscriptionResponse, ) from typing import Callable, Optional import aiohttp, requests @@ -766,6 +767,103 @@ class OpenAIChatCompletion(BaseLLM): else: raise OpenAIError(status_code=500, message=str(e)) + def audio_transcriptions( + self, + model: str, + audio_file: BinaryIO, + optional_params: dict, + model_response: TranscriptionResponse, + timeout: float, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + client=None, + max_retries=None, + logging_obj=None, + atranscriptions: bool = False, + ): + data = {"model": model, "file": audio_file, **optional_params} + if atranscriptions == True: + return self.async_audio_transcriptions( + audio_file=audio_file, + data=data, + model_response=model_response, + timeout=timeout, + api_key=api_key, + api_base=api_base, + client=client, + max_retries=max_retries, + logging_obj=logging_obj, + ) + if client is None: + openai_client = OpenAI( + api_key=api_key, + base_url=api_base, + http_client=litellm.client_session, + timeout=timeout, + max_retries=max_retries, + ) + else: + openai_client = client + response = openai_client.audio.transcriptions.create( + **data, timeout=timeout # type: ignore + ) + + stringified_response = response.model_dump() + ## LOGGING + logging_obj.post_call( + input=audio_file.name, + api_key=api_key, + additional_args={"complete_input_dict": data}, + original_response=stringified_response, + ) + final_response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + return final_response + + async def async_audio_transcriptions( + self, + audio_file: BinaryIO, + data: dict, + model_response: TranscriptionResponse, + timeout: float, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + client=None, + max_retries=None, + logging_obj=None, + ): + response = None + try: + if client is None: + openai_aclient = AsyncOpenAI( + api_key=api_key, + base_url=api_base, + http_client=litellm.aclient_session, + timeout=timeout, + max_retries=max_retries, + ) + else: + openai_aclient = client + response = await openai_aclient.audio.transcriptions.create( + **data, timeout=timeout + ) # type: ignore + stringified_response = response.model_dump() + ## LOGGING + logging_obj.post_call( + input=audio_file.name, + api_key=api_key, + additional_args={"complete_input_dict": data}, + original_response=stringified_response, + ) + return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="image_generation") # type: ignore + except Exception as e: + ## LOGGING + logging_obj.post_call( + input=input, + api_key=api_key, + original_response=str(e), + ) + raise e + async def ahealth_check( self, model: Optional[str], diff --git a/litellm/main.py b/litellm/main.py index 63649844a..2df9686fe 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -8,7 +8,7 @@ # Thank you ! We ❤️ you! - Krrish & Ishaan import os, openai, sys, json, inspect, uuid, datetime, threading -from typing import Any, Literal, Union +from typing import Any, Literal, Union, BinaryIO from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy @@ -3043,7 +3043,6 @@ def moderation( return response -##### Moderation ####################### @client async def amoderation(input: str, model: str, api_key: Optional[str] = None, **kwargs): # only supports open ai for now @@ -3310,6 +3309,75 @@ def image_generation( ) +##### Transcription ####################### + + +async def atranscription(*args, **kwargs): + """ + Calls openai + azure whisper endpoints. + + Allows router to load balance between them + """ + pass + + +@client +def transcription( + model: str, + file: BinaryIO, + ## OPTIONAL OPENAI PARAMS ## + language: Optional[str] = None, + prompt: Optional[str] = None, + response_format: Optional[ + Literal["json", "text", "srt", "verbose_json", "vtt"] + ] = None, + temperature: Optional[int] = None, # openai defaults this to 0 + ## LITELLM PARAMS ## + user: Optional[str] = None, + timeout=600, # default to 10 minutes + api_key: Optional[str] = None, + api_base: Optional[str] = None, + api_version: Optional[str] = None, + litellm_logging_obj=None, + custom_llm_provider=None, + **kwargs, +): + """ + Calls openai + azure whisper endpoints. + + Allows router to load balance between them + """ + atranscriptions = kwargs.get("atranscriptions", False) + litellm_call_id = kwargs.get("litellm_call_id", None) + logger_fn = kwargs.get("logger_fn", None) + proxy_server_request = kwargs.get("proxy_server_request", None) + model_info = kwargs.get("model_info", None) + metadata = kwargs.get("metadata", {}) + + model_response = litellm.utils.TranscriptionResponse() + + # model, custom_llm_provider, dynamic_api_key, api_base = get_llm_provider(model=model, custom_llm_provider=custom_llm_provider, api_base=api_base) # type: ignore + custom_llm_provider = "openai" + + optional_params = { + "language": language, + "prompt": prompt, + "response_format": response_format, + "temperature": None, # openai defaults this to 0 + } + if custom_llm_provider == "openai": + return openai_chat_completions.audio_transcriptions( + model=model, + audio_file=file, + optional_params=optional_params, + model_response=model_response, + atranscriptions=atranscriptions, + timeout=timeout, + logging_obj=litellm_logging_obj, + ) + return + + ##### Health Endpoints ####################### diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index d56450b23..18c4b0d9a 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -293,6 +293,18 @@ "output_cost_per_pixel": 0.0, "litellm_provider": "openai" }, + "whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "openai" + }, + "azure/whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "azure" + }, "azure/gpt-4-0125-preview": { "max_tokens": 128000, "max_input_tokens": 128000, diff --git a/litellm/utils.py b/litellm/utils.py index 38836a4bc..330903f5a 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -10,7 +10,6 @@ import sys, re, binascii, struct import litellm import dotenv, json, traceback, threading, base64, ast - import subprocess, os from os.path import abspath, join, dirname import litellm, openai @@ -98,7 +97,7 @@ try: except Exception as e: verbose_logger.debug(f"Exception import enterprise features {str(e)}") -from typing import cast, List, Dict, Union, Optional, Literal, Any +from typing import cast, List, Dict, Union, Optional, Literal, Any, BinaryIO from .caching import Cache from concurrent.futures import ThreadPoolExecutor @@ -790,6 +789,38 @@ class ImageResponse(OpenAIObject): return self.dict() +class TranscriptionResponse(OpenAIObject): + text: Optional[str] = None + + _hidden_params: dict = {} + + def __init__(self, text=None): + super().__init__(text=text) + + def __contains__(self, key): + # Define custom behavior for the 'in' operator + return hasattr(self, key) + + def get(self, key, default=None): + # Custom .get() method to access attributes with a default value if the attribute doesn't exist + return getattr(self, key, default) + + def __getitem__(self, key): + # Allow dictionary-style access to attributes + return getattr(self, key) + + def __setitem__(self, key, value): + # Allow dictionary-style assignment of attributes + setattr(self, key, value) + + def json(self, **kwargs): + try: + return self.model_dump() # noqa + except: + # if using pydantic v1 + return self.dict() + + ############################################################ def print_verbose(print_statement, logger_only: bool = False): try: @@ -815,6 +846,8 @@ class CallTypes(Enum): aimage_generation = "aimage_generation" moderation = "moderation" amoderation = "amoderation" + atranscription = "atranscription" + transcription = "transcription" # Logging function -> log the exact model details + what's being sent | Non-BlockingP @@ -2271,6 +2304,12 @@ def client(original_function): or call_type == CallTypes.text_completion.value ): messages = args[0] if len(args) > 0 else kwargs["prompt"] + elif ( + call_type == CallTypes.atranscription.value + or call_type == CallTypes.transcription.value + ): + _file_name: BinaryIO = args[1] if len(args) > 1 else kwargs["file"] + messages = _file_name.name stream = True if "stream" in kwargs and kwargs["stream"] == True else False logging_obj = Logging( model=model, @@ -6135,10 +6174,10 @@ def convert_to_streaming_response(response_object: Optional[dict] = None): def convert_to_model_response_object( response_object: Optional[dict] = None, model_response_object: Optional[ - Union[ModelResponse, EmbeddingResponse, ImageResponse] + Union[ModelResponse, EmbeddingResponse, ImageResponse, TranscriptionResponse] ] = None, response_type: Literal[ - "completion", "embedding", "image_generation" + "completion", "embedding", "image_generation", "audio_transcription" ] = "completion", stream=False, start_time=None, @@ -6249,6 +6288,19 @@ def convert_to_model_response_object( model_response_object.data = response_object["data"] return model_response_object + elif response_type == "audio_transcription" and ( + model_response_object is None + or isinstance(model_response_object, TranscriptionResponse) + ): + if response_object is None: + raise Exception("Error in response object format") + + if model_response_object is None: + model_response_object = TranscriptionResponse() + + if "text" in response_object: + model_response_object.text = response_object["text"] + return model_response_object except Exception as e: raise Exception(f"Invalid response object {traceback.format_exc()}") diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index d56450b23..18c4b0d9a 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -293,6 +293,18 @@ "output_cost_per_pixel": 0.0, "litellm_provider": "openai" }, + "whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "openai" + }, + "azure/whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "azure" + }, "azure/gpt-4-0125-preview": { "max_tokens": 128000, "max_input_tokens": 128000, diff --git a/tests/gettysburg.wav b/tests/gettysburg.wav new file mode 100644 index 0000000000000000000000000000000000000000..9690f521e8443f3b0db97b1467a9d1fe85d964c7 GIT binary patch literal 775192 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ΞBV<~GHWu9u9fV*7M#DQWi(FaE3d2x#L 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 z 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‎B@%(x7he3Lf!S<|1CFR{A70S5Zio zLHMy1=y%DAxA;9U)N)Entv=EQ+a7A?)OJj*-e{ZUcqmtk;nSa{+So%~&p5g}60k~2v%TpORjgI0{Lh3; z*g+M5J@^F+uwdW^VU9vX9rECtMDWD>1Fd+{E#&VPVpV-4Ryh+3EhoN~1$kT+EAI|k zZ7JE#9ef^$MLPsf~;ppcq;A1#Z1A1N1=0Ax| zW`)P+vq$12F@+xReOBsr@^FtbY=?M9EJ!8y+6@gb6&vsmDmn&Y6_iEGDnz>PV1e() z{=W?kj{(*#;Jl{T=lM8GUt&SGkji(V6`|AC(}^__?f)3mNB2r~=ESeZcgn#0$G_qGWk{~o_-H4v%z zGZfJUui!LZ$Z^io3%-9FxP_IK20OPY+VmIFZ#dj#G6!`IGPW=r{}WvuMYZSmzyv1R z%#f}q%e00ztIf&GE!x3l!jNxr6lsQ;-Q!#33%xZLtG;){FhJl6sJQ=)Q{R zhpupZTI`*6*#7I`b5WDljjRb19MQNZsCj!yT(vSjUu7))1n^LwXkHw4*JpI^B_g*n z_WoO--HvLpPUymo_|Kc+ftAR554n@&L6)s}S@mToc9kTW%IZ-)qO`fR?9{m;c*~@^6Ez=+G@(_N_NMwCkB1%=z5n==NQGU7# zi8+tojDa&t1>bPrDrlA8ey=|*eLDy7HIl$VJAV2mP}ovbDz7|KcWNEAnQE*$QQfRn zw6Ad#aXxU=bL_B3*n8OyvRC3gbNXjt>1UCOT8E(fMLvB7867|IpA1wpZ%4L_qfaP@ ze~Ld1)O(xQgA|yDH8aY8lzG`1i9tLK6ogY^sRz6OZ2Zu|O+3NAROwz1RKmJ>K@`~! zM(1PW%tkxELbH{?POAa$?t~6Zy8iAHk6DJ7kO!DBXzyO~Oj~g;kkTrvdC5}b{9p?UR!2T%gsTstd#z7GY*ngj~kni)f3qx_yOxR_& zkwR0jhL#YWGLhH$z=4U!PYsC0w04rKD5I5l_ElSy`N{%yl9t2P)mG7#)%IL#uU%8q zs&ke0N^#{Q`*r#=^FJ+plefS^LG}zN!Lj&}w!j1I$lX+Md;E3KStHOXkKp)ANSqsV zb^Jn`HQ^aIK-I(XU^amNt$aTN8$rXD8HOEp1nj>?b0!g45xe(9O;lwfGJWC00x47EZo%e!uz#C4|6M5I4)UP{ai$zp$N%JxVdw@69)&>^Fp&<`r%0tS z(1MUU@9-s-gMS5ScoC`loVedZm%{9g3x|5K5CGmsDocR1`oCi^qm^-Y#|=$G|ssSo?64_X+WqpoY)xJ*$3B5;3;b{ zZ~D0PB|B#NNLl5(avNngouUhw%Un`vL09h^;)2=KXUbsZyj)s-&t`x(QW|O?AG2BM zHgTd;*lS{|+G?=28+gpe!pV$I7d@yg_&ScR+$HpRbS1{{2n*yCwc#`TYv6&(KxqdQ zx)_cb%#)WV8{LiAM{1zf9xRIZ*#cy_i`oE@zqJ#W6W9xb8@oUqTZsA`fEH#V2O9Il zm9Ud)LlZU76Y;$2!n6I5+<(Ehefg+K^fUuiBGKs6Fya6b^iT^4vkDrxMpWq?_%CW5 zk4?CM=?o*W2wPzZw8A&ch)pQ!`UWFqMD1Kg&hi*O90)WEqnXoT?FZQla2$;F!TPKX z)epiqV$vjfvMHPri={1N;U(jh3G1sie%S)F!V+xpf!JXg$X|%fip`MOC$aqQVCkJf znodJr{|CjBns`fQB-|;hK@a|PI>0hg<@}2-?s3e7{~M0)$Mo|P%1b4nY*1<| zigJ-1^1Yc>9!0!wkn|Fmyanbhz=;bhzfSNea;zZF=fS!xMYJoDXz)5bjrDXpT;pRI z6RQ{am-4fl#KH3uhwgzTGL`!81zFe+p<DdYC?;o6XL}SsVIw+0$G(@X zUy!5a}|iBL}_UfTfl_$>7D3LtwH55tH4j|Pt({(QR{qZl&DZ3dMfr<#$Vn&uXMhf)%+Pol^g{`#ycLx!^Uz=SiJrO8 zY|%{S$%)s~oet_ROr6Tc)|eALpqbqa9xdp5X)d0#W$SMbSVFv1lsc ztBQ!}6s-0qaBn`&niu(6hUfVcj7;Q?Bfv{DvTc*F*I$tPw-TGVi5)(H=jnjd8-YDH z6bz2T8tBM-TOpwfA=kfC4{`{|PT>0E@YW~snu`Y9#^*6W`2bKBuNxs>*+ncb3LeP; zq`GpwE#Utk+GQ;#m%5 zRBvQcKh7`=${b1@s0~zH6k2YGbS#YT(vB0($9q}q0xR*qY_R%aWQx& z97|Tr2~w?>LbV@T(3>0iiyeGk!@KujTaO3k!lFu#OwGfGm>U`keHACJoFb%opF{n7 z@UvEcvzgcwtB9@4$NHQCbmyaMW}~6j;~}r(ce~)P9pqPzK-Eim=O!fBF>rDPd(VRO zD$E`7K~YV>+(fdgo3X&oV2ORVq=K(YP)Q%)>-$u@{f5I|l8ZgaQ%(jF&7kWH(E1yo zb{lQDoog@Rz6*fp2z2sX&Nh~lts&;SnRAIcjD4ZAEr%XPQx`Olcdj8`DrN$@sKLn$ z-DLp#f6x*6kci#^qJuAxv%j(PuJQLXc!pJ6X*Za;&FAgpX^--pSCGapc+YG8f5LaW zfXo_xlYrH-7q5H|+;WP)xC<;q9k1}u#NS@v`~ARTIoIq5C5!-uVg}+ z_kkTdB{Q!mxZev+hoJ2Vv!EDE4kb0A}qA!|PKJR*Bk*V2rr ze+SDCEZ9g<5eFSkAf|bnmm6#T6ZxKnM3(aL>WFn4g*1E!_rD8dB!iWj*u=}gAo4li z;lDyWe^V&AJsNfq_%90Nt02J|Qh!qlI(-bKPXgy%$>XP|?=%l_xLQ^(7TOP{3N#=- zSJ-+R9b6e0h)uldk-cNW};9m%tx98urB3_El<^m_>ToJ9PkEV6$EuLaoFi+IloB9FZ} z>%ZjUQ)3mTg*xY;f1Gq$Wh2s53R`I-yjY0rbt&s7{Fh$H=<`sls3)I=Bs@l(zcPN} zDy)Ii_{EQb*-_#LZO|a$XvgJ9nOsQO9?yC5h0~9%yktPtga7yAn#%@r->?n2je+jkKMBth;NGkPgq0txM1o zVZ>NP=lf=!Y$#V2mCq00lpNR-$ACc-?8+5kO`I_=a_=LSsze;L6}l}q7HcK& zoS*M|1M3aI^$OB=1(^TNby9=zlE~^VNY*0gvsg}?A9@oxb~}eT z8&8m%&!0opcvm^qb!7T2PPH0dToaO9$Do3rRA)N5`!Bfn1F!F)Ji48q1UcbX^o7VJ z7T`|dz%T$L74GmHIU&6C**xz$t~Uvo9|%dnc~HzMUWd5eXPzS&=V%V~pCT$HUScw= zs6-eD7tTj6kAge9bAof=?IIH4BvL<2v+NW&sTZ0w4t*2ND;yu>9kZYQ zL)Shde#j;cthDN2qdXd@Bv|Uf_oeV!yYrQ(7XBMqnZT1Zrj~9Gm^bP2y-(&VoAlNC z!U-J6)*jp~P(9OVs&^Nw^2lg+jlHd6HqAs2Co{ zL{2>f&Rc`Ok_FtXf;R@kFEgq}VmYMEg^eWkkBa*0^n4u$ z?n`3(SBEk(LT$g0=MRZHi8}i5kfe3uH=W0`JBJJw)NzU{@8g;`@w8L(H>I&m>O-rg zxK26j!?s{-Fqo4a1r=XWd zz;As>OJ3w8KZsi<5y^SZ>ps%{Ysk;ZOXWi*PF@sQR|2Y;fhD(;j}^!P;k*0;wG4yy zN8{yofZ{u%$D4DKEb~x}M(%?DwVJbCr_yMoU#~n3d8a}kxE+9D@ zoQbJ*lhEgDIHjQ3m%!&KpC9w_lk>gdCHkP)6oVW*f}YF&{Df<0G*$2E+3OLl$iMP(0=yC;G)n{zIBBgPINjk(F@I0_1qrP`!reQx#LA zxAOmZY_AP`y`5)yf-HN_-=;=>MKj?EeM8b1>hFn%OgaFM2_aLZzG0v;DwBJX8>e9J#?s zt^?Ec*cG+N&ZWTai-8Niq7yTO=vMUN*Wk>X!8e zaPpk1T?VE{f$up^cNq>9HpByXNObO8M;2TPc?b$NOEKU&0hlgE&%242|3IP~N8=yj zv|D(Jsn}LC_^*q&NVv@`F=`ysyS0WL@zY={>8KBu}_=i2fzv#Z22Q^&AUOj=_ zJPP#1*0A}Ux;?t67~EO`2@%IhQ{gjR0y@H4*vsn-TK^yH&*{hjQPDGx&-3w7=7e;Q zurR;zdIy~dJp9KQY|zUyq``ftKtw+dqRl@;wHD%@3R*Fd=Q#uK9_IfiK;R1RI0H-` z@Gd*2?#5Zy1IvlL#uG&E2 zh(6ziz|=Jd2oPIss`frlv07`yHI)GM`sK6LXOgqVMPg^m7y_ zFXLG^AwfiyhNz+W2(20Lh3M@SlY+}3zq%mHgof|MnfoKdg+;g`1mQktklxU}@c&xy zsskkz!}?1KLFpHKoDUd(H&P|Wa_5rB<1fIY7 z`}@e~gPe9CPct0qILtGMF3mk)PRuv|23`#82rrP02E*mypDO%c3SCeW3nm7-%n$B6 z!)MEZ?Ov$k5GU^pRpjD#!tRNODuh*E3GLAr|E?~SEV>hAUSGhu$r(jN>p#8<0{`bo zu=m{iEU?=F+(cjLYT$W;_dG)az67qb;X%<6x0BzE10VZ&9RTw4IQL^9Vv?&W!X4WK zE79#&4t^KD-XC~+nK^GmeqILuQ&?do`MwONYzq9F^L)wRoK*O0^^q4vd5U8EzBGT8 zoTo|7ncdK(s7C${)qaCoUxQV#;atQp#CuXfPpQF&L|*rBNTaTT24-8t*&7RRFwb|8^StAFuc5|F zoS%FfP!}~?xkGV|cy#wbXk-i&UWT8=03{LK@ql{|^l3+Ki0(w8+rrQiU!l@RSlptc zZ!|a-{_UiY{8)iD+r!!ShV+Ec6t_5+m{WWh*|vwzVlIDrB%ll0O%1JyUQ8XT5_0_` zSKSLeZGpZM@qrwn_q_!EU(l>p_(b%~Ch?ciSkVIdO`)O={NDq4SQ4Gv0SWUbFcWcu zilHc51u!R`vQS9B(=31on=@qRzXm3Pd%gn6XM7yv+`FM^As61mtyb=y5!%YZokX8( zC!~FDAn+Sl`@pQ=AQ8P6TMZ5Y^;N+CE>G|rNZ-O9SqX=nNAjEm`X0{g0qY(iP_%mEed}$kPu{+oO=SO62bXA)7(Sfj3+$64{a$2)uy)zCg=` zp_j6puLrRHo6}W5V)jBZihOJ{{_le&GnLl>o-ZdfBWV5=*t`tq3S5uFBN&E$UJi6b z7w#nF^LF&oN$|cA{kjA?n$G8iy!(H>P#N$OQ=(JKaOxJotvPpZ&Gkjrq!M(M0j%m^ zMRdZeaJZPFa}*dIe`28&4JraL%Fgj=l&^X6)iVZutxN2SWN-s{o4lTGW6uavL3`+pZ+}uAu)KnRI zF2<<@rv88)it@~5`HkqLjzyk`y%ZX_5j&XN)bADI@9RLDO|Ss|2CvzHcMoW0CK3N7 zc+kzcN?xv;3F;KOQ`G2xf#w{=vdrA)W?W>Wd@#YkYx4YuDU=jBXEi1%BhjDBD&(? zT_3P}T;Mwj+BNvghdj{3B3Y7x~QjECDAYN-guGXeebP(fvML?)i%J`g?yC!Pf#SNZNX-|gf3pYTLF zt`!N44X8kPnNB2nHn=p1PWXV%_{mR7b01NQoSpZDhdeSdv*0b~7ZZ}&g2%s!!S$f> zW*XRB1r4nRN+0=KlV^GZHdX%4PKU)4AeTrzdJ`ySIKItjPCX*zMQ*{56g{M(zDdkj zC;){uMN*3$5el^Q44JhN%Gm%kw!(3nfyhP9kcbCTh!a-fd52>!G=RRv+yy%@7nASG z^4l_8ry5eZDpwTNXj$+sxH%nHcJTb7LP8><@*MaI3qwYF{o?E@(2GQdr{aH^cW33g zKhar*;jflZOkF6aHfI&`KRNf4m`ig6+FlpJm#}u`LG|m=U9X`FKQ@K1Dt;pU1*9c- zRwK^#0F5SM>!o z>7W7;$M}G(N(GcEgy<@kCoK#=3dvImIA#Yv9%SlH@FOIvnE8E&Cpv>3eFUw&XUM5bcUyYsm8o$(sfI2rIlW=ZJYLTqgXM zB(Nkrt=mxZ6L6LYXI$Y~#JuDK$N;hNKtzZhLHEb`$ton;OyslJ__iMJK*XlEgQd-2 zXAkeW!kHg&rJKl*8=PEp)TH8>1@3=By+Rhe=lrLkxXZk*@$LY5(c$1i&{Yz8(XgE-I{=@|48<3h zgPjY&>mpZv1}%yhOTmz(F&wy;gyV!Al^2Z0fl;AdM3rt?zD`6wJ%UP3!|m6BxA3kv z0JklC{~US|@cG71S7L9U0!JR=!r9P{<>8Tdo-;Gwi8!|CK#t}4#NMGC{G=&xstTum z1nOsjsjyN`bLJ&Tlpc5q!;#tI)K`(&8uXrp_hx}Is_~ZtkQzOC4M6ud1o9owYAum| zHK3NXJV#C7FQ8kUCy9Z}M8@zoXL|^*iAYxhw6F=;^$*eBJVfRTkb|s-92>|_#&d!* zP@9e)P!vwX!&^YefD}=LTK>Qn56W-VvC`nA&5%%IqsOUWU;Sjtpbp8ym z@f3_nSXo(-LoK0_sl>>ZW2dY`-;V(XS+OL<{1*#4U&KVRLlGL+_wv)r@YN)=abN0H z2Y@%Rf8!ESmE%au<7D%5k^OOFql;Nxvx!jjfwsPLu4kO%9p|~i-9LbnL|_;LK1bkh zpTZR_Z~+6Czh`>;&t{zPyMFKb}5mNhh&%BY-7*I252=26iwk?Hfr$bV&` z4kQhAPxq*Eq7#amh}!;A%s-q@mBcK*xBAbTPJgFBHS0I!yKSrEyW^BSoo#?N#rD`< z#Ie%;MLVg~k#`Y&FCq1}=CRBQ?4+Kep!r$9<}2cx>XQwt|8?LYJ6i5pep%1U4b@zl zSA9XHPCn+;ZIBnrubAxnCsF!6;PfMgdCkCHe-<{4?lYe0Df9^anqH2r^WMNgc%?Jl zZ1b#Tq#e>hsiE|R?us3BhHA{D4NxQWf*Gvg)+oz+>Qt9d({qg(o>lx0>H2+Zj`vrg zvpfzvumG`t3zcp?kg!wfswhX*$RBbf)4m5v!>KemAr+B^TaUt%%)J5H8}PbBFMcod z!8{`RF`+KlN?a#5xuvDRU37!q0{X>*kEoQ{OihIms2!r;&G3{2KYSn;*p#ebLnfxS zAV((CNtj6W!9eP3d{iaQ@XzL~`>1?hOKoy1e+z1GE>H`bf?9hERq>|32)*L1sne<$ z*ygY7Uu7OQB8}sEL4B2Pw=bD)_p$lo`*lDNGH}A z9?>i6V)VzT72$;(gQ%PQq?OX@DaR~^X)#jhIenGAhdoU_k>1L>=D!%IM%4#3xxvEL zX!O=HS`Z;~LQIG!l zPv&s5I8#h#`m+YNTjo&3zLV*$8>FN16y+xK+ULk8rOeVi>r=G;1|l6TiAT>2bn}-m zHyH1jdA-c9&;hoKs`HEf>w&XO5^88QtwW_nRQNoj=X0htOj;#KH*{vk zUTu2e3b50oAy|4%70WZ`6Z{8OA_9Hu|;|(`%+-M&@+?0P4jv&{Lk%+-0;jiWmir z8b&>%xba*sqVMpH_Vr*seuA%zK2)EhXE%Ns2h8PxtI`u&{_szcEu#8HEOkzE6blPP zG>SeQy)CkA*b4h@+a6oMHs6*_ZEmd`=uDT=dfy{&TW@-=->d68%$oirbG?~pwhRoi z#7n8=Bh)muw$_(ME334NwoSII+BNwCd~}TXbRA34;C=rgwsf>NCoiTz^*{JEC=pPY`V0LCh>p6NvEz&UgU*$R#bw}iCa&5T=b3}hLZT%3_*544RKOS69 zb@l^#{SMKQSBj4t&}JrTXfq&JzR->N1Y05=O_N}0M|a8v>m+c|$~q3L|FAx#FEOk2 z0#;^2VqF=7*#j;8*Uh%(e?||((D&){_2v2keX+hoKcQ!3mq?s>-R#B$QU%N2!gh@~ z=^r-m3}A}oFDR}NId&g;>s4r*RF;2&N2uYv08V0g&8fwxm*fT33c;TKTV@cbmS7{wBXgC7TXhomotq#r;9L_8MBIjoWN^ekQqM4(sBVvpV>7HAF5LlxW)Pq!Prj4#G?o^U8sAZ8~w#8#__-W!0#EQQV= zgKoTlb~}fL&1;!O1^y=>-=4|hCCpf6T%R)jG3FRojN0ZUxM>{yem;L0s)}C)+TlM= zp)RBVdE1WGLQ-jYqOw)(t1Z>qY2&n_wlen8%sqZ!KToGmd0S`O3foiLY}*g5n6^jF zpw41r%xE?Rbdw%h^I5B~t!orMTrDcyHU?h#)6hpc-5kSahD&f!GWr-ze`o3#%46|l zz@kY)lJ5jEk(~d(P*ub?vO6=OvO3s}$*CAF5Il|coJ}WLChAj~QGq{-UK}g)8j3Pq zH)yRX4VC&cm$*9As>luCp*hk{I#GUMIaCY==pr8v9-bqC^3iv^)*Qx;gt_KlW}NxX z*l27ABI(VMOdrWa6=F&tRuOGr_|pemNUUkprXKb`W_QwZdX&1NAwA}KbAXu}h-Nn% zn*EWqtC>-L!#@a#SCnX9FZ}LFd^E!&TnLU;vaJc&4e9739M0^>dC*;7WaJ{MH$DcU zsdX#OJKJGBfDHKQGmk_sQScq7aa4DEF0t4DD~B#cMIz z4>d{6uC>(4YWvh*%3sP5X0iNI?kdBTXyvqgocY90Ph|eIr>Vnp?7N%z4(aTKO5_3 zCwaFur~_|B*ZdGT@CY4si>TYN zS=ZsK-X}`Ykm+t`s9*O}|NWK|oMIQ%aAam$ro&u9W0W!zjcdjY;~>~tXv{Q58bkR1 znDO5DZ4@ylnTO4Ay2Gn6brVQH5^Tt z9o#fy{!MxHi#k!eqm{I6wxzM}wbyr?cDNj$9Ge_%9d^eCdrJFCTPZr|8fo*@@5&#_ zGG?c2k=nECWCC-9IuHY$f`vN-tN9=5g>wX7QrX>>>i$&hK{yI_viLu;*<`TU73!P7 z#*7V2%ZWt>Hp7ZJNUG$uuVm`+x=%gAQsaMg5 zBg~p+fUO%H45zVGZ?5OobLoHRQ*@s`&PXz9anes_a(^Wz2<-MJ`YZA*TY>s^p#KU! z@daM;)jEE<5dD7$yojx6`*_C@IN%+%Vn3;L?nk|U8tAYwm~aI|y+{N66w%o~37@Md z^&mQX3$9wLf`vq>8hb{*$_ zEHc;78Gp+B!sHSw+okHkH^Y(2{rnT5+xgVBFQnS}D0p~9S9Kz?Bn=f@hXUED#yO45 z*NDhWVG2?Sb}lGVJX~2+O2+1#E=&;bBV|O2&ZN6=82!r`sC(Ir&r+Mez`n+p8jXZ0 zLj`d^YO4GDqy6X6e{D>kG2Zxt9RyePqxwO83)W9HJ(Hea|5Kl-f6yx#OAH%SbHt2* zj_#qA3PIOB>8RKfaFSJwfDW~GVRPqSM24H^r#i0GvNsm z;wYA(2l+UZTIIS(?;=zb^s=UrHcHjy6LNAk0+nFtbb{8}CfmE&N3tz$k$tiKxc#2p zMgRB?zAnL_gjcrRwm!CWwrg4?ZMEuChAMXDk$hGjLl4P$sS;3_N?*kn^jmt%80cXt zU4dumkBVnz(Ia+&WH28Xi_whvjV!!M7;#2kBfXKsXlAT15{+`^zsP9?pQt5r`#Q5L zND@^yjRfj3(w@Hdp0BGfrl|(IkA3Nl?*tcseUxkb{vr z1<>TTn3w(-xU2Mq8_-lb?7$k};6A;yHiR`LFd!-GxeX%vP z&$J)2r*h19Bst1Dn>m|1OE}$*v+OZw&nBBc9oZar?Dg$SY;U#Z+AnpzT3LOi^iX!n zS0xv6UC`iJVigy8(h7ldc&nNGAJ}<38LQ%{vCilY>YmyZh`fl`}6C(rzYm?C!6 zY+-&irW%Et@9oBE$~hB4e$-aTUhLS zUl*8B4NTf3nl$#hNbA1Oh$~LH&S~J-sni`Xj?KFqN;RV z>LM3X(yOVo6IvtN30qqGFnf^R$@0!^bk81kZgBqX%;)^*xaYXzSm)^M@F9^d+fvwO zXib@&qN{9&QpzfQ*#JiM?`c)@D$#_0JNg&f6qj%1!ih<7MlQnLs4G60PwG8 zWCZqK^l+mv8|S7Pv)L6m%9wBLXUj}9w)ro!H60cg*>9E`4JWn|4<%;hCMMT{>J$r8 z%KM`O7IDXe%sHzmZDD_7q7=p)m;Ulfws0~)O;(f-@&#mVWj46|knTzA&>+9y)nuG; z3GtVr%w0_u9EtzDiH&eykWLqjGR9?eM3V24Z-}qFFT2n0ec`?3ed0aueeKQdYX%+; zf|v8YPrkDHHr>?ILr;6O6WdoE&j?=rF_z+=DELWV%~W*s*TDLI?Qcxy z$2I!3^I>~zAd;AZ`0rkHT4Ato%9;*)ZG+^I8p*Td8}f7ZquH>tb1J2jib{4x$Lbg* z*9z?!*e{J|{+cG8fG-s5D&npQMDq-+w&nzzSNh}p33z1tk&vhK?s|2-upXn|@Xh!2 z^u_yf_)_^CzDQp>zV74e=Iibo{-ub$M-+g{rDJ2ERD~>UaVUBH%Gmf#26ZSK4#^CVgiGqWs8PS3omy})z;yLOJrqm(XcK&__vd5!|= zPi*RU%4VeqTYU1%t>hna6D6gRQNCeaObqlQam%)3p$g&?uV5qSBB(y6{|TN!b~DCI zZx+RWn*%-jp^IYrHeUf>k~arYiv7MvzRAG9g?FW=lV_ACn|GV{uy>_5);rP@aG!9i zp33}mfv37>k2{|`gS(99lCP%!Z_91#2Fq6eLo|E2z%iwDSjwonk;$De)V9hlZDiQ) zsOV%p`QQydBqRDtVtJ!PS3GeNadD+;g$LmqXb#qprNN_}8 zrzsn)^!IuN^RWL;pe@n8VsxT+#A@!39np{Y@H67Ud&o?DV?OdrOEz|J)Mn$jm@oH| zC|7U!9hPSXYm#NDbqLcWCAR#gz!u9xWKg5C?3lEKct|O{y04N4nZF5%{~rHV#}2%T z99Dx~dL$Ex&22HuViQ!sU%qLsG&4gZ3yBNeAvX8R=kYbsPwIE{F8WZt1S2nj-%nnBC16^3cnT6D(Y9%y2x8$SsdH!H=VsBE=RjsCa*1UIwo%mW^C)rYojIO7tPBag7~)8>!u1&vesI?0{*^?34>s&^@(?jWv0! zmtIeH=r=oYM{@UNp(#JY7Xf?YbiT?9{R^B>)L?neDa@^H! zs#`S0e%D^Y;c!+CZxD4YIw}fzt&Wuj%av@eoiSmh>@$?wQi3!VC|8#K!Fp_6Iulqx zheC#6UvsAM&8!n#WvLW2jIzG>-rC0fz*oGQSAlX&oG5_iz6Cz=U>Am2Mo7Ex!{`BK z6HWhMA@&@(iDvhtdwexfzT9k7m6#1qj@0_i`W^ePG1-domP*9hdRY6giElMD{s%tp z1mL!sn4XEBC0Y6dewD~PZG9%Sw*Kv}uE**{{NJU<_GV!h!$vtrIr=#YvA?;cZIRa1HpzJ^ zvRSe{(c{Atwe|9DIZ7L3pKTwdHBg$#vSLy1$*U~I{d0_=CXq%aqCYc}=}mpPjf?)C z!3BX>)9btIi!*F^?1TNfdC7k>_}W@Qs%6>aFJs2|?*zLs5Acq(oSu>O)>CwjH;`hi z4S>*8DXr2@VQ-Fgr=>2D>6Y>Zsf)ERnZ~o0>()ACG>#KZ5Sv>ftX?MC%nD2kma`ht zLV1T|v-S;6CnAv^Pv{bGziH`$W}eE#{7LwV1M$xP#1_jMyh*ogCp7gnEQO-}H$-Xb z6CNWJH*y*W(?_>R`?~OMq?GY=(`-LrVjI?dlzT3KmO^f=KtVptB z5z`zuG#isrGio{2+{!a~mePrRu1VIafeA(w+eANOiJdSEZ(+|q&t;#@yk$N&#^{%Q zVR~IX==Sde*YgT2x-GNNNp5l1(-srNL^BlD4rc@3!<=?#2G}zES~eFR1V_k$^VV7R1~K zS{DpT}eC+hEH)sh{K+!(gR5$`DH z9OO*2uheeiF@`DkPDzyc66nU62v#MkLWq*?{q`^V#{95R+0e;N@`;8}gV-im#K_k1UP zH+&y_E1^i2r=cf@r>7^acbE5$cc1q!Z)@))Z!&LnPkVQ)d#q=WK0R>CdO|vBRhZ=e zBKXTXO&P6~v6pbx4KEYfA?j6R;fUE`eZ$s=w~o9Xl^8WQ@?7}CuwP+0!{3H&cOJ9% zw0+SAXzA4*(vzT=LNGb_ANG8^z!amP&*fR^`NK2bozZ>FUC$e%Kh#a%1CP(O&z0TN z-B-*w$#&~F_kDzP|5%67^N+SnA-^RmRHs;P$*HyD zwr}=v&W7QcB6~#*i<%g@J>o>fiAXj2Y4m_-Uu4&arQy%RD@1$>pC6Xs=wyGy&evG& zpnTo3p4hXEdaH54*g#=(8rEq(-(2rD&sX;&cXv+(?>cXocf7l>tEg+6`;9k2Z_4)I zhI(23IQgsg#v=9}U-usgHlzo8IQrN@-rGhz_^JF^zAS%|dy_p1Q_m{hm6l3^GD20+GTWGA)XS=>Emjq^m$FaxV@aR4u4bCAN~cyVnbuiE*1rq|6!H31L9wNE zP~cxSjt?Yvdx$(;T{8hoTQk^diS7Euw+H{=tGAZ-v*&g-zQn&TSbs_V+;+Uy$T>942q-wJdms&qEMEClOtIZ27s7TcCMl7%agVlbZ{svS8b@>S%z$b^Wo;rGIBhP4m7>A0sgkT+q|%%R`2f|bs? zzy@Sx8soSxjW@yF-`&P@$y?jk#5=|vOxl{Xz*WKXulIxZk@u~4n6ES*S!<-~J)hP1 z&zwwW>c7lcI^cgFcxf4nmslQ8cAlJ4NK$s+mSn=gQnj${uC0e{jFzB|Q8%kk)fehE zb)Ra}st|LpuVzqMlC7Hp4*p?>c|B`$EP^mH6(^YAn4frQYce|d0$KcZ*_7MTR70L( z9kZFSMX#;PcmQ>LvA#UMqCPuxaLW_z8Q@Oi4!Z8U7P-p19InSnTapeY?M%9o^dRYO z(ut%AN#BzGcAxZCFvbRx*k*%W&MYoJD8C5W1Sy+y+@nOTD%thK-ITw3q%g9CK+1A)#ZhuSiXOj6w zFYAl;hU1TS^WFAl@w9iXP3q>#>{;f`=)3A|>Ye4C@5;4RB!qGU6$kRC|WTmULZ3nQ- zrM6T{D4se}xAN79L zf1AIFUVig854;HGm3k`qw4Jsn$5rR+@ZOP^B0ERsk6asBIyznQv@uJPhbP+@RWRyQ z)QRXv(TAdnM;46O7M?!*va_r`sGOFXN)_eY%3b+^wP-Mdzaji`-`J$5@j1Mbce;0h zx07dr%bR#9F|R9^r?)qqH_4qI4b;!G#G4hb+wVQ&t8aWXr;$^VP2vOoC}i$Msw?U< zTc)m5UyeZ*=7qN-)VFFMZL-!{%c7;%W@+_oM{OHz>22LK6;Ju7_Dox$eOJ4xG3qB~ za}1XMlol`rTWtM~wYDG=m_+T#zf9C<9e9av+RMBhiraV4*ZHbaEi%-%(O1e>!s~UH zb*FNdbJuj+-CbR;puz-T_dRh$VztB?iQ5yyk|L8565|qg{LY(L!!_Ew)L20*ueASf zv$lU>Fj{J$q|nCMaybTuEr~c8xh*nzx zWZ$C7MrMu}9o{@F(f&YPEN7Q1Gi(01`cmF%+3eSemwY!aWA_g7{o|Fr7d&M>CEUN0 z{z&?fG~1outFk#em1jTLPU~*uneQFvOQnw?*3zGR-g07i3bFYn0lG8sV_s7S(vrMl zQ%P0Et3@>v3F%ZTsRz`G+7iuS8(_<1Uv3}4Wc!0!O6{}SPy4O;$Q`s(3n_WziZ?U=3II35LCadaIberDZH^w^!%`(>+-dxWUEEh6ZN&R)2aj7aGS4>?vmNQgwA7Ur z$nzAhVp9()HI+o!C!bPGwXW?SduGRPdzk&Dc1ta)PE+e?-?b_>U8_kvr-U*}&Ln3; zw~r=n)kkV;HG&(MgLa#lH|?;Jlt3weelx;ItxqRPmnh+%?aJXQ>?-1F=b8n_mvwDSDw7nSv^lA*Yq>kxn~&O!_kjvjg*FQ& zQ1x@k(n0BF-x?MlF%ZkLR(QSeb`eU{8R+qQ@;Axjlh;nxBl=v_$f)vBFYxn|!uN%Z zaCUTLvX9gflv46cX(D;p3({Ka+F&ADJcVzdceA&audx1^Xh?s(kZ+ZzihHBW>2Bs( z>mBWTPpor>Z=`RVPxmz@x}2X_c(hsAY-)}(Uzv@Gzz)O5PsZGe^?30om{{;1z6?7; zr8;t9<)<=C-K$wSf`{~bY45K z=qnK!c}tANW_?7~$VXPQdtf6m(2QuZ+G4*q?UYPdsocnTv0F4Dqx*Ms_pGUoF67IZHB5 z-io;673&!(tFlS`sD;}v*uUEk+LzcT**DoEspE)p)^j#;mT{hNv~dLOx9y2`FTXi& zo2SL9*W`3;ww@(N5!+lN@1d5B+U?+8GP7l<;>%0z>r&!8N?<8ksj{pos}#GcsuQvITgnm4GfSXKZH|;d z8fQIE4QB$q4b6x{B{Avt5k7knvoDrX6FsjUsekp2^_kxO-mjh&o_U^|K(n`ZKQYNN zzQMkqzW!u|Dq=MkB`Y_BjG~o1)j%>M37oozf3E)pr=ElFWub#&8uh|M=?~mU?L%QI zhe}g}bXo4N6jHCMKcJD->N54QT1e}!4b!S>n)X4xiM{e1i>0>ug!ya^Ws6)-PA+?; zXt|+0L@p;EC8{wDdU*@=c`Rv|<51d~+4_WPyE){mazso-l1d`r!iso0s7|x z^(x7kr#u~c-@v4%L(FC9M;`RMr809?4Kktk@I%v+U+YT_t|C#Xr{q1>QjaToTOU%# zyqWBHak~6hlimK}-$9;i1%Bfdyy%mBHIrO(Z{qSZ$xrSl|GI@rzHek-Gc#MQ0~7PE zGTpK_v*o)%Id|AO^N1MsKSZ!}qR1tUoBANVvfh%as6j@4b1{+5{pLBdFm)ZL1Gn%F zi{c;eBWpeg8@jNRQVz1_|6p1cg&BSM#ldKzC%+p%zR}$MS~y3 z56eN+WhxblgRmbL60_Rmi|{SQrYwW)mew2R9Yma?moFFc#YG+3SftB!bF9B(pb?YU zzgqf1Eor1z(iM5Ha#%fvHfdw4Y%5`_VmoQ;ZO`FIaO8HTL$;K4+_W#VuOiFV%F)MR z+T-nGY>%`*iM~{%Rwe~|h+bpiKbH*Xt0^(Lu}nRhZDBhOlSqpbKOPNb5AyrX&gKCl ztFcQTtdG(!>FL-6-}V1kIt#ccwzh%K%zdc@ zR!r;;#Kdk86*gzS|1*B>4_tO<&YbgfoMZw?=W#kS6VLBP{$Z}`0nyK< z_)D9}Hivj>k!|rI>#~v^`of4qy)yo0Z@B!#Qjd{MJF6A5Ot-wZ)L}2pE7o^p75r?4 zZB&dx51Wzkg`lM*YpV6L^^$cBxu-)!!6$0>*y(6H6<$HgVQRJKvm5&gBCzQ_FWqa9 zcn4frU3;B9iENK>u5(^>ej$5y%-P)ehU{izM`=f>~r<8A}RvjZ=??RHU{lFtva{zdL%o~?tIMhKMg!2`hN8t<7@Hl=rhzi+`FGw7B7FVE4Jab zb5@t7qGcr6%+*wFJ)|nWnb8XhKR`|?#dU`aWj~kh{KL5sy}!~vhxo>MyXJ`CFN0j+ zM|)Yv21kD9C1+XJG}kEdX}iqXcBEFfJ<|6d_}hXH``MU{Je!6Ey~oU9X4BS_M_x&U zMj>nYpJfH-bSGHSlihw~ZDkv0>%b1C@2D6Fv<7UD9yIMb`|7lY_{$@(7PgalF64-{Z?!KY3NZ-Jr7F3IMfMVoP^aPS@6Mw4q)tDx zkxKTzqVZ5G;r*B2CjZ5L^L?g!SMq7*Hzr_N;MBnX@IWdBJPl|TXkf>5@_*vD6X<{P z>EzuOJFC2RX&*nI5ni_~RLN0GzmA=I7SWee7_C|Z%Qc^8H&SIhbqWctG`O)1^&tn` z2a%&+-K(MdhEUUM=Vi`lNcC)?Mn|V6ZWI!+nWq&My>bG{N4+8S2E)i7JSIxsi0X0K z4<#L1RUz+vUyIOEIAKsu8()dPzCj(2v@eRTwW@pRaw!W8w{q= z0m0Wp+#yFo0zy}Xj>6j>p00G@1pjM()BLLXPVlN}i6nM?gveH??Sz`q)5%dYZA#i# zd!nO+vybzoQ)j-Rj#FtdX?g7t&IH#?cNVu)f|T=2HoT|>TW93aN3&z%bN!ZaR9Q#` z_({zm@6c2a@YM6{(`yiSY)M?KA60~T$*T*5UW`L0-IbA0`KWmsreL=OE`zs*Qe;Gd>0<7sC>| ze}XdK@QGkpJ~5uf9gnZHlt$Xmh%-6xt`Pm7>;_*iBygab#@_k?1yfcg6*`3 zT=ZY|A!!xTV(fh#FPvjMU6p^eMz(rhC2b>#(T3Za`|e0rFT7*K(eSXa$-#NkJxNz4 z>B%#cs99Tc#dFA<=4+S%cZ^iIrC?5YHHdj z$028k>o&80;)rnsGoR=9wadu1<;R}MZn%}{SX`4eP6*@dny^s9ujzx*Vk zFvG~$+z9P#1J6pFI*vGOzQ!)Bg<|~0z*s4UF6ncB4Q>+|$ z_de_caDi?;4a|Bg>&X_nsU-GsM`0EGaNi_f9*b;Ug!bw~XNTRav8YPKHnVG;bDHyt zvp4>7XMB?_u8ppjt`=yrw?wU+?&h4=^?(YCL{6JgsX{8GFQ68_Di+g6;;TCuYl`Ee zy|{g@{f8sUmBTYh8Ed&s?CiL$vL#Hdt!4Fo9+)Y7az;zUiqJhlSp&QS(gL5S8x~wW z_-eYPLCXW4``+>jw64->k-;c$ly&!Z_}eQu7Py|f@45Qg)BViwy>D`!lutirrgd_3 za_)8>rJ}92qo8A;^NTyt=mJG&wrrw4rK)v}t+!WBuT9okmh(hpT3Y*YMnQkuaBD6L zn%>Au3@NLzmfTV-XEg*GpE+qP7^{dAys7IN3p|grd-GH*>&IG@Wj%3Hji|w3b)ELW z(wN=UmrTPh(>^b!HQkvWAPguD|p{Mm2R2wm^1r3k}t&RFdVS=dA{D?wM5igwO?5 zfiA_D)C3P>k9^%d)N@|v>{YU|{n)1|3K`goy);{JzO48$R<$F&Z+o#DhfsUm!gxj& z%t{<#4pk=Sz||nv4(CY6W&4S=$@q9@Q@f_#`&BtLDD7|i9M?oWz1r52&vI4Wjg{Zc zQr0&%cuROl26t$OptXJ#ecSt02q+%diL7kAe`UXT?<3ZpU}`Y7={Zj&cL`^*y%zkO z8!Kdxqe$wJA2WXR{x!rt)s^CzM^|cbvZJ}^i<+by(W=|pc-QyI=u_M~hxbzN?mmxv z2K#)VqJIss!aG_R(SDKsoG)gK@zf-u^3nCyotbz@H@%OimivOMsJp*smoBw?$EcDW zz~VBDh_?Dr-fTVKg^(tYmwW}UBWfkdEU{Ds;^Iu zP0m`bj#S`TTp7XE4|f5whE=HI`kOrgqSY;0Kg(09ZN8ZGHKQ%5mJe2|*E+8SWTmHC z3qx^X)IT+{HYTIzZ#kjP<;3J`WN>fm0qDm1dNa0cW!RB$lirzAUbeb-p=CEwU7F3k0f||e?xMSnxef<9E5e?V zIw`eoS`m9Xdm;N8`zw2-W3}^`$43pdzNSWHmL*XguQlA zMgR2ye*`WH3=Ev)ALx76Hc5ML9ObNuXd*40$c$&PkFeiyd~m*Tj&sycd;2R}>f^Kn zPP?aza!mbBJ#a>~9lGM6YPW3mTH{m1x2;dS*KAuP=Ro}Jwbbh)v7ZH&o$Ls^Ukz1< z(BYcicR?q~3D?yG388S0Dxr#)&7Ma_%MQ$huS=Xb{_GF|I}GTp(F5o6D$iXt?74LZFzx>vC_JT{i>&1Kl4c;%Q@`uqSl9G znO<|AT|=VRcR1y<6BVbi)brfI2kV9nbCAe>I$~ZKj9v7D48k8ih9q7`@5?OeAh)?2 zyPr}WRo-=x{K(&qFh_l&J|7%*yqQw;(AgcS9?HI){b_H1nD2?eE*z|9(K_ zz}EpD|K`4BZBLZP)bqOa6WDk8^-a!E_DlA^T?IKs>x&R3@&I)?c_>0rICJsxJ`B{%6sVdjpEdOHsNHzQOX>ke8MQKCTbmtEbg;j zB}UkXZk7AFp=L6K+V6(M4Q64JS*fZ&Pd}sd3Jj%lt_TwDE`4k-sQqq^7g-MvIL>|FmBH23 zImofi{)$MN9sL#R_EO5*7IS=!iaJWUhugw~A7>aAaX9p?|52|owtu~T`rPvO z4qBQnG`M}x9N)>7MnLVVa>%m7I#b)EuSZ^WbQ_+6dZ@dRqhp$qmc#CFd~sd&tTL?R zP2!Bfo>#7|?&eBWTTb76e$#vo+ZtQyX~VQicyXb&MB5MewTf2Fc-k8Zr@e zJBlQfbF6pL(|bm7s3}?l%U*4aS{qL#8-2F>)lo#`zFG=Fm46VC%R|rN80`RA;Bi_N zt&`T5ZqadSL#3th9~}g~^f6aqzpv&cRuhmQeOg(hDxlbsQbIif=s=uJk*L4l~2&Z zlwzK)Q1w&yM*S4Jv#`-ZU+CHBrY6`~1i93Qj?tg)w)8vMJ+0ZNy@jVXQKnh$s`@IW zFT4J~!Ix`*{kfRx;25=ymT0MB`-qp^+4FJ` zr*2Ts?pFSy!)BV+K}*0gh`C&1O$2`mUr)t1$L@W6oXiCW7_TQ<~Fxy~*4z;O}8n zG{vLAJ5ifagdWyB=%V%1yhRaFenrG#4y(yZx6)QB+A|W18BJt*F44ze>i^%kmwL(> zYt;X&-@NX7b+V=@E`6G^)8-X0Ke$RryP))bJH2MuvU=_DPWCNC^uA!I zyj~e#*+O=iJwrWvU4>k4>Ejqcb#60q}w0MZwoVLbm3zbOtqNP$+TL~}ivP{!_)oDfvy_;vbXRq#0EbtL> zv@IQo4$m|ytIN?97_a{{Rv;%WoZ?cK>WbRz65Eby{p(5^QT}&Y4XU-4u@gaIdc9oA ze`hCtIka-$Z;e zgebZ~-+z0oxHzgLT2N8PDGuQIJ~ilv=?ut2{oH7FAXu;D;grRebf9ln->?ftq>-f8 zp`vaTdmJyPW2d^YO8-W^*9z)thM)!Q)VRB-@JYq08s*;Zw!3@Mb^Hgl;*06Z+(eIh zM`FjFb(Os(uF^?+8_V)O7;miK)Hl(6cZQDtzGP8O(E~aSS-%PG^-!V7J4{xsUE*Evr)i#AqytylCsb|pCd zT_I#!{q#6A?kwUR4e{MZVd1WK?|_pR(dBYq&jKWB<2|%OD*nmyz33r)Nnc0`9g}mg zZT?h#!k>AyZkk1_Pu<-@_L{h2RK_~}muP$*Y`M+sn$nc>=%^w$R&3KssU9aQ|jbYuJc|Fq==tV&|2GA~LJ@ ziRFB!8!{Kq2~*Q^VuL|l@NVRW?D{?x&$u-;R6FTEOJEm?hwPn_h24pU1Bn`JU+&CP8c`_cCI3Og2^6aF|H6D z4@MV+VXOB>zx6;awZcx{?QfE)%u3rO+Usz{W|QcnZm6qo;8W zUAG;GOC3{c5}&?I*Q|q@&Jk4KUL$60L&M#nD|5F>oJ=^QGwJknqQA@b3sCOXM@#TE>*dA)9>68sucWck6 zKuc#ihtC&c+^1f22IuOg14{KCusK>p&Zvy*Et@zk}hi)1pkkoRjteykZ8vOqc( zhI8s}U84Xssw?QdoPyQ8op|0E!-t-gADr?XtYuaIhiw%?hf`rS7>~FDR+T}|Q!65U z>y!whc^lMqSj*k07VNI>C(twxpu$hc zmVfbecY*WC^rx!y=)UsYf#=K9RneKu;8@O5`5!g-pU^Bf+1+6PQGJ8cYj@LYQH(CC zPn@K0m5blxu~%72xgUBuIT*>yrrAE{3j#(u7BPLyE?l&rEF zi$Z6m>|b;W{u->m0)M%&l*^(ME1@z}&It}IYgN4KdMj&Ccfs<-rB`^Dr zEYr7Q!@lAinX6QVl+(|%14bTnaJ z(TeO(J#{HGe*$0Y9Fp6cDAW$D^j7SP(3l?J8{}AX(ye$N36aDuGDX+}usP=dT!9nk zb52!O`0G#dfg1UY?Cc7!K{54_C~FH1xv^$5vBSlF))r1B%r59{9HSQ})^Uf} z@&C|0fxs|;-E^LiUyL+%lkI9xU0_{SQyL3>0$41GjBMi>wZZC$Trl5c0*l zsQZ5B3BV>eOWpMWVhly-Y#U66>O;;UNhUHh8OgI8=@|u0|1frumv0A_U7Rfv1Wr4U z30tS8Q7K-59HsRCZzGTPUcFA-G!M0+z3`lGvKzx%c%%;WaSe(00XU8$^ORYg#{M*C zsRYkLl&1uImO#DjRQ5J%guEJxrdfz((w_4WauelPZ|-_D1eqs$r=%i{5i(jngE z!J-q5c+w}y?1mC2 zN=LM7DeI7ZQ5VuVimEC+CP}gZB!5UtZxNizO z-pRhk6Um=8fl{mDcZA~+JRrKGq06HAtQ0i77-+Y{${5bO-ROLky1njneGfth%C2?w z=|vBMCVvoHuMbW#64%|1#(BZWe!Lb_M{tNPzh>%HqBrSzRl(m}f-IZCX$}@L9s96a zHUMt}dAShnUxX8BW&nZ0@X%?_6yC@Ey{M#l&#os;*~#WVxZ_W-J=dfQD?JzC#z7=P zyfK8k8Z-VSuKZ#wRW7kJ!UA^BZO5Dv$V%rY&+r2eye1s5i2Xpeady`z>Wo{WDR04R z_sG;7VGp2*WR@kSVqrhFPh?fQLM7jUSWBK50sL!n&v4}$lJzv}JIL;y5|u0fzG|?$ zU`I4TM=1LS@kd`e!fSKlZWwur`)K!haO_xY#V(AP1r4#ADwajOR^n-|Cj(0Qj$N$Q z(yuM2BT)~{r}?NQ$Oz`jL$R{oE>`?MB5LQb(RD0yhkg;80DLR z4@hQ}x%XDy;5(gHu0RicS>r?KZk9Whk;KJGSuU+XYH8;>64fU4zdpGsVc#YST%qk~h>8&|YO`+~*I-clDrLfVKlZN9w z-HkLX+z3`P+-O49cr#TcZeuXgx;LNr8@JI3HI?^h@&1a6&iZazem#_4?04m@ref1Z z8{_o^JyEHs)m8IArBmpPd4gY?4E;>OMu;TK*#+zSEuDscped;uR2Jd?)CStmm8L*7 zK>5Hqkn_-_OW1SeCf2PJ+MfVzdc!Fe{NwRR@ab4P>x}nwan><>}GcZ85~VF)mV0e_*Y~NG0%6pO&z3NMB2QT zo#g01`wLyT5~z*CYwn_FR)(P8`eRvsHU7k>=9EIl@I#iQr#E=MaY!!>pFGnC8V8h$ z&}@CMh*ydHzQOM7m{Fdd?{9PPOCG%Z(3F0lid} z{exPtL;gNw$Vf2%AFCSz=j~+1+xR{|S*0Ox=5naC9M*PKvOGK39q=L0ughL>Zlpyl z*`O2Xg+TOd7qsAMLjmHe=(IC*oxD*ZT(Az?^EtZ+w3C;brxMYhI(( z8Y&I6hiV0-DLaH(IcMp;Qb?<&uEE=RN~P2d{fu&)9M?3?Sh}JgH$2KAwXk{%8{>z* zfV~vSRTEJer^rcU-|=(yE4z>n^U%;a@Ttba*&X4k+vp)1P&|+AJqC=NM>9?}2BT|Y z=%g9xX{6`FrthX~r~m#M7FLYWiroknD;J0>ef7-M^D0N_>avn8S#HSwnb)Dan`n!p z%>Pd`Oi!f=cwCA^UaFTdb`vMOh`fJAMN}4~Zx-?33l)?i&#)4cHD_z2eK0A)&AHvw+tORsDPj83#=Pqy=+%n8$tMo+lbdi5w(^bpEV;J zyTr^x%T)nKlNHWuA+E6=+h!V zYh|2-KQ_=MxfD6IpS#B+Rf=H|*1!hp!;U|f^ruD-Wb9uGCzT>M$&l*4Wb-UgRU8&$ z9V#0J1Gl-*b0i)>6};WC#yqrPCb;mcc0o1pW-c1vz+Eh{;vs6FQjsgZB3LIvs3GskPEYs-*akLzF|Gg!qTkF)4Z|5lCenILq~&*zH}IE zM1E`Zb?%0a^3r*Jm$mv6qwGdK_(dbuvj=%6yW=mXR>GprfOBhtm1Fckzd|!MQ!f+E zD$Mz2k2%Mz4D|jDUuY;6*EDcG98OQcx5`Z3>xVvt&!!O>zYm_uq9tab2Q#y~td$O( zx8!*zA~E_Zvb*d^D545dJdF6tdZ0ZF%XOqFi7aU1sz~XTjC2zGj>is+2gmi`rm@Cm zq}fd3sqcX7LH#fGx}OE-)ga`T z0zVwYa@s}wBaJ;@hQY^2vBw{vLr$^!N5FC&^d=`xy)qhLRYsxzu0Z3J(bYwfq@CgN z)r>X)eLn)+_=5SZP-Ri%Z%+J!$yC0?>xZGk6?ijam1w%JqKPWyMRqoaM~{Q$7GzQ* zpomh$5uYGwPw6Y@gC3%u!7_|dda`@sO62`D^@`$ewAb6RCfN&k1=v21H9s0ktWOl^ zE^@mwPpyFcJ%{X6FXT?Jnp+8lW3r=Z4jZGWg5AdMzt@aP=;7V0?ixGicEd`w1B2>N zb}Dy8VhPG_d0W|$^f0ogAbWIdLOYHklhuSu*IufM>_{Z@n~I&Yi%8r8tjS4a#E$a! zNGh`)V3|LMiZ- z6;P8?W__6XNls}FA-7Ur`A%%3Gpmomj_}7*DX$bWYEu`GsAr%iY!UMOe~Lk5izo+{ z%2Oi*=<inQ7kQLr! z1dijcK2|o8x4wez<=h&gl0%iE$n()aItp6$r3!8_`qG2^oq_($X*~BdfX6Ok2M-rJ9$cjJZfbI{$lkc$&OE9nf zXy);7XJsO*7l;=(fLfx#?JcB9XDWM7@Z=bLhO34*vOXVN?qZMeT~Nt=?k$bRO2!7h z0Bl=>%TRMi>$b?=-pIGSbn+)F!>I4?2^3TG4aPY5Kqsy~1FNAQGu;PY*ChH>AC2$~ zZY=@T9b!MW75LtqOv#C}Uyxi!sq|J^*)*)Td`P-PXren*S`W);fzg!QTzhyh9xnZd zmCS>ZWUs#LXuBE6U?)EKbF_b5IO#I|1`EjXJm%Rw@L>m`)n9|b&EV+>lJy2wnv4AF zGc51U$^)WLr_hpl!S$b5g_<#u{QYcf#3S?)B*5wZtXBgMRq-y*;(^L3fO)X=w=zOA zYMu%aHF<&u+y%cO1Ue`~JkF+&v(;kk!kXUj^7vWe4!?04LP~7yHd z(ycS=U4%s)hlELlrhYN=z37BX_?5+oS<6~JfR|wG4{vbX6??7@nkE)Hd5`Dei!9bz zXHz7Yobz^*S)3;}(SX>=Q2rl+7vY1IxD%Qmfwl69_`*UoQCsLs_ElL;g?TAr9{&;* zcn-&=7=56=KiOAk2`iA3w|g=7XIRCuhx$^a*?261%B*n)dLYK!#d-?yk^S&%eK6Ju zEl?Gl>cFZaKKes6*m>Yl1l`gKd%iFC&t;sha7}L{&T^<+C?*AMz8o!74!nn9kynDU z{{!z+Sl2)Bx;LL>Bku45X)RIBc=%e*)s>U1JKz7m^sEsB=`zLk( zjrcrO-APP$l$w_aX9|&$h4``)cy%PIlgzy5Kav8EQIKURRZb!fAT zSeh%L`JH@Hi^yn3t`3;;I$@V6QwVG__nCDG;$f$wy%7{wJ;u(^t( zRSw`$%9&GDkR5x0>pEaG70iA|Q=Nm0KQnO1ojZ zG=iV{KJ_472KUk6Dv{3Lr>TxZUyeuTE`_eza7Q($Cl9)_C_8fbV6Ei9cg;yY zHa~i+1&|!f&noCRgBjb|#@Zx8t1B(k#p(rYi-}}=*5hM+q@p+mn(3*PBr}u1Cx`j{ ziN3X&MCv6gauSZ|iD$4959b##uqDKD2SeYp@!I5c>#SHr-{}Za(a8UUMi=1k42H(# zM40PHp5ms3{1P1!4#l-br$3{%d@Q4`G$FeTDEH?j9`8ixWfr_YoF@(<3e*89Jqnr9 z1DF>BuGhe!1L-Fx+ni#3bFtqRLc6V?l4E#DQ<0N(=!uD84x@-Y_5j{}vAdch3%WvG zn}~`Y1|K(&nj4@Ui71Am^@^h}(!gCUW^@VfNg*OSkWcd>O}gOYZABVYLR#HH@*PJr z-a!IAH@UwZP?!iu+~N~C<8}l%zKOqakH6%ksO8YXaXQrGsqt{lzr;k2Kp$&?QGUF3 zFXBL{WwusW zOH$L}`OK#NCYLr*{f6B&mWtI!^b!TCZ(09GG>#k3JQq5pIXk7zMuYwV73{^ryU2>h zvuZh$Y$-e@=MQ}VHZOtnM6UW1y;Xr#w1az7$w&IKp7Lau#{>U0;HW!mTn)6c5rZg5 z-se5gSx7|jIM9m)(h@0p$pn0dj=!T$HS*< zp`?-g-H;bm_55Jv@&q~mLr$=$g{}`lQdEb3D`OAkL~Eo+Bjm%L^FyA=NnKMqX`a*M~p_kiWU8GGK za}H((<&Zf!c(#J2>dnlmF`qtY#v9n5XRsSyp$R_`54*=Zm0WrrJhdozu_#%xnq*7c zl54L{6sJD>CFJ3AAL{7dP|vUuDK&)EM6$9BNM<=jTu$dZir07zJ+liL*c)mc4dhp$ zZzKcM6YH%5c#@hoIlX)W+*1tf^x(?Bz+MUDikIO6Ygu`P@Dog=T&go-sm}TVEY;U=Uu~pfEYL{> z)(zmWD6)}7$#(9gR=yeg+DxY3q>!b9WeeS#r!4)+RbQt^^C>&J<+OxQQC6D1?Tgfq zbVIwvsdP_bIZI3^7T(&!y5-ED^GK_f#8;{yZ4aCDv>zTC2eqz12hT@_$w`WGiqmxT z;5g{C783P?eg~~r5=~qONm9mW3tmUT*DJ7&CwK2L~giYw`CY?(Gge`~$b_2M1f3iJboN2CvGFeIe((r-Len!moSKjz`gvOL(n- zf;VFkJ*Qh>8tamCFh^kL$w|=-xV{kDPtHY=Q(!YAmos507KS&!Akp5Knn=zxmeb*) zp=kpiN?_(kv6bY++TF}#9=dlRGaZTaEQic#%Dk)MBjka~TQKVx@Zl6@yOF!z!C`XR zV-lmtxs$)}>ifcFtN0m-EioP4J`LWRiG6pT*BSmE$*kw%i!33ERtei68$WUu-5sRH zCFI5xFtUM{oHo1)xps)>90tbIdFD($Kgdk)@N*vi`G!O}2$jmIdp+R87-}oRu@gRE zv78~I6Nfx}%j*=>)}5-4p=3JxArFVJ_f`Qt8rak~V?;8QUWbPihJ5>Sm+A_6Rmrb*+?EgqnrUSXueCWV+CLKy$^^ z%5)q0lQa87OnEetMe3d8)SoG6udH}6a(eO&C{oV58h|XU3Vcff@rKw^9q`J^!cSS@ z!~U#JEXT#XmO)K3pxpz|*JAi|7PKR0yxxUhgaY4khKmpKN=~qO$)|G4%sXBmku=4y zu1le5vmj@RVQFQ+(H}di4EHrhYfr!nSOe|Gq32_f!Q)Lk zejaqY1H0-Pmh0b0ywDBbS528-t6iNbVlU!e01xOW{p9V{->kxyMf&Hsy9Ou>knr#Bvm!aR#nl3dG-F zU)_V7Zh?;oyzFP>PK)uXgjY0_y-HOq^9$NGdTe`OVg1D((5u+bdXn}(syfSSs&*AC z>pXRDTgjXGQ$2ME-e1r8g!6&=A4sx0Jaet-k&FWx&6#ZpY=+`UXz~JR)?Uz0T`a-s zaK!(htGmf^}tUTeit+CnnqxF0N9v{ZzdEXCxM3} zGraI56X3)#jMxP#T!2;eH?WF?Zu>!*^U!VoLvje^Mq$CUhGREFN3t(|Gv@FQ7Qr!S zRCdHW$v4Ze(!@S;z-tyXs#s3CAMQ(J0cd9YZdeB-O zxX1xzCjomoEAR($T=LHUAYCV8(S4&IMI#cOVEXz7t0)0&7G@=yBIhB?*_;vu_{ekL z62TMe|2wluW+oCy65Pk=ucrO2Zwcpr#hAr4MrJF!W<%zLCgqIXCKm$hf-5m)vlDd!E)3{;dV3@`0&$ zKv}S*V&kMI;$jdv&c>b9u;P0nE1Kdh6@rU=7^^yxr7>6)>-!rvU{5UnAy}VX8MPZ! zASb}q;iov<@ELyl2=3*KE~%dB44oIl{>sDes^F(77^(`LRz)J@06X>IloEJJInWeV ztd?x7sQ_zg43+lAPuT#@L$Qd!=dN-@Ygh`Mm)GK@b@6zOGIKh95;|vwl^^{97(Y&yj0w1NO5mnucWFEj8N)b7F00)Z&@zUh#BS`2WV4xk4tPTb$W9_bjPbMJ+ zX7PKhNp+HOUI&~P!&NWfKo{|g0ANuTZBde!Si-eT3D6v>YKUf$Q}J5xJ0tKqX4*^t zfs?aHl>JDtM{wwWjI{}vU51Aa^M5Q*y~^k3Og$KjWww!PFQF3?fr^|yn`J5}x zF~$=xy$-IPjbxKEWaonajZnc{W2}yYZACBEQz++g_m}HVKY~ ze06~4dzjo*2y0E^;4#2En(y<%KR$3z3ern{?FwX|hbqgnYf@*`)+cN_)=Ct2YV;=K~LKaS-p zC)QjfXL$*@tVGHW1mFJX8mTgndNT1*zqT=>cf%km}_lTHws8BB-$h=`!xaES>cC9z@<7E zkAzl}z_n292OxA0{+6>rx0w1#vcP+gBWYOQf`#r#(-H9Kd|*D2cSEtiS7Vb;f+h#@ zoEhM!10zdzR!*EP0^L=C%8K(zQ)ssm9M_QViy_JKLVFoapEn8lEtNwaVn;cUcDc-Y zOfP2U1B_kNDwJccHaztQ!0r@~odb1kL6!=2J%UTFBO_egof}TBi8N}5jj@m!4Fr>& zncHk^!L@M36lOXcKVb;bsY=W$2ehFvvO%=og`|y!4iqY<fZyiG&0p$u=f0kO(!5fV|o5>e@o8K`~d}gXXZ(~l zdr?+Zh_UN1!>-7U;?P7_IDWjz=Msyq4n}Q^EFNDVI@`lI&lye5VHPYOff9cE++)$* zUD4Ttp_wUYZaG191r#K;BFCW-q1sURC?i&m4`ccPgGe~Q4lkYN>f6{w$;|aVKTb5e zhg!-U$dF=Sw=jI43o5C?yAbA)o}V({el(mfar0*U$Vsvt(R&S8UlXkSuE+rCx+u#C zC0NCKV0oT-zX1+6dB4{5jK!~b%rg_2#a(8+4!T$g9|2=It?rI# z9f`(~6ME(B<}=9hE4+UIY~`d{KWbY}zJFUq;~v5bAm96g1R#3xbkKOeE0 zH{5SG&tVS*#?6>{2XHC=OHME=@#3N;73YLva>506qAdmZrYb+hfO9d^@~FohmHFHY zYxNbgNB|;olD(X_9?casq3p{1F2$!-B<(RY%@Q=_5%4<{SvMECH3(@p3@NgR-~X6& zu@wkkLe3m!Mc?5qIT88`bAJNY?L^aVgxZg=I`LIEA|0=o(!4A)&A}@>no#2JDR5*- zo-G-z^n6+wsu*C#>SjY3lhMKRiP}xVI(>$vdLKDBk=V^RQ-=Rd#<@*F#pEg zqNQ&Gg#aw%$KY2^y~)i8rP0I987qa^O@hltVEN60V+^zwAL zP&Ce3utCiVV>;lAQ~Z{5g5?zXcdYdi8v6>*FrcQKz$QJCQ7BjX7QR8Xa-MTVe&oFH zRFh&$FkgvBlmiA)&~hYnBeAkBL_nIcuC`#Q9Ix7@yr~Mb^CB@TK{s;ByHv`@nD>j` zkh9J&LmgYtn=_FntC85#u)&UC+gyToud;rD=ozTT3)~ln3ms_hcr1+z@bd$(lgujO zpszz*|GP@uf)ugw3M41-6Z!uU=^sKIXq%~FB@ZQiV7s6^u?22&g+!KKLYWF!4L5C* zFesb~cVHh3GzuX98zMV}k21seF1`_rOE%{QbI1>ER)IpJ$lkn#Bj5A;qd6NpToeqw zWjATA99S>Kyxb;b1u#c9-or;KqFSL-{(+YA z2R1tI*!~}i@fiBR=MwB|NbKW;(S%z>)6LOb8h{aXYtnV_^h+))+jkb@O}gonO^i*L+C;=m1< zMNU3{2;E!+du|}}9-JrfzgQ@~K)y8)j{(cM7$*mF%gIRHSIOaOP**0PWaa8KxH>O% zI>d}q59D2LM$mw6ebz5$B#L}UWXwF;JuMa6M>KqUI9yC~V5qZzj#WLPj`%=Uv8m!EEw#XKgSNZAwI)jA4GR zFAiMOGhYP>mkjJe`MUrdk{#}|aAgkek}8Dq%vvZT4P4Ta!Z(?@)?n7j%Jo!3Y z{+`z_W+XYH2h3aYWBGwxZf56?H7fq`CzD$O&;*kIDgnHEnchWV#tZ-^HhAg_vk|E+ z|1_Rf2o4DW^EuH9bxnE+=I0-Xoj1$AGBo2|vQyo+*RDcQ^g2Uf*ot3MLB3J73 zQ`F4ozUQjk%)kTZ#{sd&Cgn*KU55h2lDhx}I^imbu7`t}EMTcF{_y{>(Aq&0RhUa- z-buWhx=ehkCD=V*Ud%-4a8#n8*Md+XhmQC9|Lb(Vm1XC zzXZ6=&U%V7%gU^(7!VQ45#5`DSDppTM1YN^d|MZ~$ptJjLL={)|4W`H9`-@-`2acf znNJ>JO(a9zr@_%Z^QzNeMxse);fQ$nPq_FETzwiYNJN6z;ftTl`yQV?XT+mG;u?QD z!P^sf_W*aEgkIv|?s#TxVK&v!hrRge#JsA3iN?I^j+}0WJ^2T^usl*_7`DJTUR}_h z^}s?U)+u>_ToZRu(L0hRQC1kvORHES$x5FU;o`+@G5#c>zTq=)}YNUP4C& z(Z6Encjt-4kth$4782`}`i_0bowLmODZi!aNurKI-#-~SmMfnlD@8us14?gM^>@BY z;_pO8{=#=RxJsavZ@LJOVr#H8_Q79=8222X9|!gyxbuc7-2|@1;AhEW zyhI!MGP@c;p*`~z52_6m-yIm_BQk!MxgCUGcQD?6rY$MwbA&vgR5^TX=`IyNkaQYa?C9&>v z@at3Fc`nd7jEv=nta}NJUxSb1tm`rN11!ECac+$yWr;AhD{Wak;ppo4aBOeOS2 zc1E%?+k&htgujGK3h{qI{ule9t(jqI2JaUH0tFebEF(lSvN!WB#^+U-a|T8z$ve>= zViguKM~T2fl6tyWG}RZdQGi!wW+l~s8k$w?yH9ZcPv-js9EeYO3wRy_Q{uNPTpPl5 zqI2HBVb@uoFVe}MpJZ^K3U;1?aiPydM)&}9^RT9x&__KijVj0eik@O;Nghc&T8Y6(zPk|jYxKQHenGzuI6kj6fpwH08KNu+ssJ-}%a7;8&z?Zmx7P zN704_d7Aw7iy25pDKm5QK$W+F=s~QMGeApx+V|jlH-9IZGRp}szTlb<$SJYSen)d& z!gFGUSkS}ofW>k2%uaaWEGxK#jeZIo9pbJRP?Th{Zt>J0ASEj;#N2{ek?c}nU~Pz< zT%Ea=1oQRb#F{1@Wiolf%2nB!sd&!<%eO$|1?!P0NIq~WaD0gzIAhAV6+n6l{Pz@I zPho~{!2VIzasw{B&YVu0lH&uTyaj{57)kQ6Vi(6V`ZvbD$zShScSYtC1Glt*S}VbU zcE0__cVa0@HOhNa8(N`;to-Iw}NAB}|@tN98% zZy>=|F{dPCN;KT@3ORlo*`Py6eoMp$q(-U1(kdP+Y&{zvbHBcTrAix_!1de zyF`w}MhpTU!u3CqDiV3j0}jiAH4oRl0yCSLr$omjcPg3Gqu8T+S@AaTmH@@rxk~JC zvGeIhfWIUTnuZKuPgv6*EN5z{T#Q^E$k&AC^DvfFWPW5$;zb0p&TPzB;#6U*Ac}V( zz&nL8GV*x_a8VJO%E@PmVAaO_rB0?llAtO4kehY4B0+{?1ApeLs_+WzC@xbfLF0LyJG9~KnwK4((DU{TQkeb;JGaH zCz>c5xOxC=S7W8z=b0k0#P2hRj0PbQe1Pj4=u091vXWqI%e&C5a8hBO*nsHKXyQn{ zp!agXEid!^&aAF+MFgWO$l6C-zlYaxAnDIaBv(_O`4!>nEQ}Zg^uv+L5(khfeGkyK zgWZGB`Xy5aNk&?FA(mnPHYI)*$G4Yw##!k82v_arbqe@OOg;f=FV&YRNRgM&;B~Hg z0L=t~UvDg)Ptd?uDE~FHlz8VWt_@?Id6~W7H9eTD2yW{Fr~J@{)QxxJulmT8HAK@I zBMHQ=ba0paFP_tN#!2QW5_LaE6i9MlQyI?%wF*s%CwiO+&I;@`so{Es9=KrIRFVg9 z@J@0t;sc2M78~Fm>x<*B6JX_=iF1jN8oW;iI^sz^gM&{1+57PH1EA#MyCk9;S%IV* z-jV2n6&jS7t3)Hxz?cWh4})8y;I<%EmYwfEnh@FpwBvw@#CTFo%k~Gee!?tHG9MqL zo^n}E+7 z)7}&xULpb(v}779F95ZQc5RGAkqW{}KtC7jaFT&63yt+A_9NXhBBlF5Z&RQ*sj7X$ zh;xbZ9fflJ7*BXOnfZq@hrF!xE6{$+HIj7`YyLGb-H#+W3gm9^msGikhxwi7RD|n8 zkx%KFlWykB0+{s=zP%5=j+p%Mj!~qtKq5e*y~Hk&xa}`AWkGnW1^m{T=;|amtr8Fu z@6?SqSOp3yhfK+4O85i7^&^xKfjkUn2H{{d8eXc+s(qBbHh98w68L?SI}4%rO92g^*m=Z+yTGS8!F_dRCEiv6_(Npykei8Gq&}d*&2p9ofNS7{5h6H8eFrF{q{r z-w3>=cBvlJBl}>9$5k15-iWIj1A{O)R(!!XP{~O+VgovJCOTBQjWz*W$29LSw zChreJRY##Gv6J@$^9lTHz&2w~2e|PvKHn0q77rmEBj-hubVj4r0A9gBQD84UC5?bh zZ9eUZoT<$^Y(P{j9S^)%nD5#mDIIXGa7hI)QNvtG7!bF!a?t^Ap}rV&(?G_{%jXJX zNbLBQNdpoeJ`RmYHd<`+N6>@;RAo*I&ymip22gHQ?z+u22bsNad^8f|3$o=L>wCv~ ze#Z%0pzox2PGXpnIh0Bcv5GACdNLEi{tGA}3|`E^b)`*lDwVN z=sf|C5kTTQ(nD;?jNqg&>le#NJ># zyu}v%7cJ3%j*9WD_yOybY6yv!mW8&Zu12y<5@V4H)OV(>dXM>Jh6bX6Zv*C=4Go)! zB&)!z8$dfz{ImwPHB5U!_|c#B2Qr$9q!T{82p@g|3z9uif#NZ!K=KnRoF4S{~r|#SFnZ`@J^yGHTWhJPO|_%iB%^7 zr8w??%@4aaARQ0#bg3B-4W1J!4aTmM{7oEmewz6w!2gm97N1mN`|W{`^zwiCl`|GyeE%Lg6#MNXSoZ;%kAT&GKu!4SAy1Ha-eX<|(D$q0 zB;oo~+#xx3r%7E2$OFl8T;WN_`1UgYKZf$WkU=U`BkK==8ze(5RU#4#_2>B#DZYzd zutB$Vfly{(`W2dehs;W5MiSL6XUYk&fpfx5p>49Z#URB`rM%*oabO0RsfVDni#SghI5PV3N+;y-Z5s7!q z@I2JB0ef*3(n#uPZ-JvEo+h>a)u7CFjF_IaO18xpPG*lt_+MsMg`YvxtQ@3fWjR($ zJ7!%K9`HftX6D=4(7O1;;lMy7jteZLH*EtSFenkl%s`+T@aaoLs22B$|Mvnu%LP;= z=6sD=ON{(7us;tLq~72jv?}@|)ErmhvN{qb0DA3$-8>3CQ-iUcrq&3Aa$mu}lAX_t z?#z!Yj$kGqfq|@^-G`tm$?7Kplk;FqtlzJEbI#L$WGn=0L16zoQtcVD zdW76a2kg3I@eV~A6f|v(_uL`$`WX0JVs0n+Ejin}aJ0msZh_ys%uoDDA2S*i4jqd{0CQ^M^Y^_`R*vQ`wsmTW^`Z17bz=sczMm|mIS{Un3>4KM~o?FMaV7=vDi2L z(X5Y{$2-;|m2tbk%_sgkjaPV-S)F1g3D|Vej8q5689@Ir5EWbfGL-B9Mj=qgBOoFf zX^G~hXO1O+npA(q!*!DDl>B)+q+uI0Mk{1yI_UT-5?O}^B_n$gScy~|fxg0*lBc*gN;h4r@v>JovGYNWwX zrBvG001GXErc{ai0yk3GRtK5g8~QE;?i|d-pOGc*n4LL10aHJKnTG%A;;A2*gZR;M z>Z>ntSE;YP%UT?)L}dn|g~alcO#FNz?^BtzMC!hQOX)FoA;lzueuLE)M+$a^$3Am) zEKm)Ct~HaRax+7ra)TKP?j-}68A%idkM<)kKb`x^Lur>^%**-bJ@b|FqOz z?1wgff!8SJFFBJUNC2sr7XPRWIFTwd7uJJ#29l%y6W!GhI*Q@_5Tw)qR#O=Gh&+tv zc_opxB7cIp^CN2!{1s$W$^25%4mB9ex{OI^_@l&Zs*-To+Z(L zH_|FElqB(TsUAs(3`<4hh$bun7NwiD7b_ZsB__4)?V!VM)R{?7S8JqcWA2mug+w64 zL;b;Oa=>F!GcJ*E(NV#yPK9<;;oU?aBDCfOjwK#k3>b^0BhgN&zl?+OM1xqsk!0Pa z%i%4*C31I!d9MXa*TJY{1herBi9tm%`y60J^l@2ePCDnVG15tRQmO=w1D6yNTWPFU z;^zfftK=nr_j|X3R;BhRGg9^z_kQK76q7?m&lX2Q)Hc7B7_-Ft5`pqp_`4vSS(`f} zkpE(Lz2O`2W$b3OGK$Y7hLI0A)&?FGd0GqXbcugRCL4glEh{0KwT;h%0Piqhn*Lwc!L+o*%jhx z>G0O2``{IlA~R5H2v5r0QfFEgNzxP#H5%#`JLVhDO5o=zQdhcR-B9{3@biQjTmuh@ zP={n;T&y?_=&pxak1~6SC`l)>#Ei;A?~*OZ#XKT-Vj=k94^}U}i)7J1pf`%cOWt7q z8?clZu;A%55RkZ(U_+`!rC%cwotwn?H?Y#A?&>XC@E)IhS7LwK4 ziN$h+@!y#~fKY+ZrTEz5r*1||jixqdGCV53|6@+C8BOX2e*r(~7m|8`j3z83k0d^! z7v8Y+Hi;)4%v0|$n~WviFrAHNo;$AYb6q!ALvUT`U6&b0e+G`BZ*`N@Dk|AiA|D~ zlq}d6M&1qto};^^YC!hAj)u}oLuuu~b|a`Mk~@-2nt2ZfL!f*sR4tOk1rO-VL%Jb< zXIB;MY4HRlGMB=N@320pv&_!QWT)6pyc)Cinn=@u)Ui&%b6>*$LZjh4-w(<0i*-uR zi$qYRf9(U5`4FsU;>n+Qb^z;_OlKNaWH5iFXSS`8(}U3PQG6%fm-u!+xmGH!ivZK~ zjGh6m(b4sh{4IS3W#EnStmiY-B|e}p;~UVA73^C1T(~!tHAZ6nl;Fw=&}}%QiGQDq z=g5Ark?6+=c%v{}QNy&hC9Wvd$l0Jzv3mbRdsKuzr2bW6*#;Dl6KqHoc@$UFV6-Zx zwVTWIM#T26%}N>or7G~RNN}mIkm!MmmRFhOYxv{Z^*T0Hr+=#c4X%gyMR zm1u)gTqD)f(m$|v?o{xSih+N`V` z|NEGJ;uWAOF`7H@vsh^o*M1Kt2wg~ZgIG}FCB5f!sh^YBs|!4c2X&9x%tKEvMuQ&! zzp|UyROH@8o@Rq0zd}RLxatgg>_5hTY0g!ArhTSA^#q7(&`2m8AUohnO^9^Mx%gDH ztn6=L1+pT8zOuq7AlQ`o*8>ASwEmV;ZdPX$q{Dc*^)8%!QGEp-)Xq=4xILqF`hC?5>zDByP~(Gk|mmXilrgh z!EfL%m=Pqm_uCtgzG&$pkS=(s;W>i!E3u|uK;#ZoX@ydnVY^D_R9^0h1S9!)FQW)e zXM|RM?^WB1byncpPvGW-$uF|Ys^}A`g-!#$C4fdp=qfiO6bGN#8Lc6azvcMhO}JC6 z^AIFzZT@P_6D2pBgJ+e2M*CBjE3PmABOn@lQZog&(CVTe@rCGS|DNZ2in!zd|Rgx$Xwgl*ox> zwZfT6L7pwYqmW;sljC`U_;|U2v}A6?E-nkaMp6&`577hJg+=y-sKgjj(<2fx3D`<) zxKs#Au1B)(79b&(Kz>H5$}0yml1jddaMn~}VslvMRnuydn!D|+LOf>aIG3nGGLq({ zX^}|X>lG8~&$&W$t8{T*fbSlXrIGq^KkoVMyMKqGB7kr)X6D6uGC?zivB^gg_mF+7 zCATG+!oRStXP7_IkKY_2EZsb^qeKI+{Fhm&Q=1W`>P<9> zblg{GRH+}9n4;_rn2Gs_w7d`O&j9h+RJKXKR!4p&nNnpnl4Kq+#W|)8F8kJq4Y!k* zbiNB`Nbd6sx@XFOvSZD7 zxO1{;r!;3~;_IvE{D-{0!_yJ0v?ftS>AGxh%G2JgRIaNDEF=OVxmtO$SldbPQ3^aL z*!BUFInl==B@)4=WMrnG$!D>iMNs4cR(;c?-Xq{m;zTd_OCr>_q3aurD}8#R6Tk9= zROl;&(F(JUiYBbfLp51}p$GU~;wAF-4wNmKD2csDUM>?f6$!_SCHI=^oox)Qe!$T=ZT-jCT8W0o%skSHx^%Mt|QkN?BlEmgD z_9Hr7;*MgOyMW;X@bCyv@fP#TitLg&mmhJ0+kEnwwThMq0gI(sudKzJk?hQIDVpgF zT>lCPKI8w7JX5S@9T`*)sUp1%qM;>*`x%}&g8n+l^S%S`Oh8K@@EPb7N74#>h4Unv zFMe`;e5;P|tp}>wgY_w0R@-^41#^;Vybc5d_Un_h68#1F;NQ^1!63DOGgYRr73`uq)0w4>uToBr$>~%tPu-^7DOrbY2zK_yO7x4^+4;GuV*sPbacmtb=H1Njw{YgasQxG6%0% zuhd$8W$hn*BeO$!tyyO@P>2HJ;tM@S3f}-uVt<@RQ*MTat^*OVhE$#<^eMf4L99i(4sSE_ za$r$|PUM+V&n}eU%`?1^NeTQFiKh7*DEI@RhrsA3Gt-gXg`tfSjQEJxM_>{Jbx9@s z0qmXwXhqpO>OZpzeG&86%T@8rNV4e}fm2Sn!UxI;hq`)zD~Vk@fY?=N`ah(Z@N{-) z;2a#V9o;FBsn0xLqBqaY8A$Y7x?sPsIt_{x3-Ua_r3=7=y<&k^r1Iw!T6zrpyTY6q zyZbUH>07&x{3?Y`6o0EeD@hOhu5$Ge<}aR`?BNoJl$W}W%FHhsT98_BiOmH=^Ef}jcM8ZQm~{I>n2+F5e*+2AP2yh}#*9`G*D=cR#& z$MpB|@V*W(uSSfp4|vYa3ey3p2FzEwz@!#WtkjH*S`%$2{XEinQ4!vixPE=pF3bZK zrRz=lDkP61JyQu#gLu3lj39oc*jYi0E}dCff!Teei)01eP^axDtf!qSuh?L&qRMthhNV?H&TgQ8@}t$3K~IU5?hftQD)XEwd9iX zmX4DCSl&IMfCf;7*w-2OG>R2h0A{U-LP^X*s{2|HNoY?zv?DxRpYdGqx>#O!;4Z0- zlw6^BFcR83u;k!J*HZwn>dw+sc;S2G3 zr9SpBYhhsieLyB8@!c8xjdeU%_T81;6|Ql|JEW2g3FOBZR#tig3t}C#D|xgZz-c#k zy?`dgK9`(rJs=}J3K9bosVseBVhxL@wv%VPX3Q_F>nl(E#(h3W6zPf)yDy)~>uEgG z&Kh!o@AhcLVffB1fMR3QE0>I{cmt=BW=W3VK5 zrv_fm!kuyd$I@AVTTy*&eCqTqx&>5Px?AaPX=!N?6cm(BK|s2t1?iHMR6rU@r9(g( z?&aPSGqY#D-{${4=ecm>#LV7nuXxwH)?&3}>@9Vk>{EGzQ@E4I??~KcR&^n^Uv{^X zaqE2Ep&;)krBk9BGIo=wfsE~PASW+b@ylHELEbTptg0Y%GD?+kjb!&edMD)}?os+S zl0zSR=XFc%7v%~hW-i&nvcgj4OJ!yGFyfeT$YalUCsE=wH&`=?B}isKVRo$s>rs{e zWgj+)CP*D2C!u_Y=lBzP`!DuPdJ*!9?{g(`-DPF8%xXR1>lN>nozMJ`SC`_tWN!kA zKuMO_|6(zTXKa2K;oe8@yyYDvH|iq0XJX+c!cdeQl=UgHK0~rcWldxzWTFszAsOsm zzJH(l&ckmdA44KJ23M4WU2nmi%IXh=)iAjd$z-mK-&dIDN!&z6+0qZn#rsMuuQ8t{ zagsPBLNb?RXPl+@oRVj{0WBbVnry*l{mS<%u+l4#UfDfzF23p_WO)XAxt;5m*<$Gx zN;F7XsMGKK7Flm6xhs<0EHmy8SqIsHM6!-cqHSe2i8yvD8{bP!EtyQR3-D)Xf>vC4 zB_0x^5qKk6xQF!IgRJC`JiF7J)-=xK3-)jmSGkGbO1w~dcg2vZOzerwWyu;SnMGU6 z{zXJN1a@#cJH&$^M zYkvhPl3ZW|ZFG$*liB!Z?B{=6-7R+S4ktNf{zse?SqPG7lM#aDdlDLz$p4SCFJ zNbbXZcI6cJB{N(ydwiDjDy3GUuaCLo2(omD6_D7#8U8NW7cyFr_E}<0zIU&ZT~_WQ zS5jMK#tzhFcVtFK)}>4TLdM2rxtrqH%sO17jKrHEU7fHNlJ6>!lYHohLhNKE?kC7T zN(R5w3O-()_uXFR#LN+B9FLB=UoRPI$wSqiI zzfoq0Qjys`?7%(NTxu056R-GQcB_?j?2>OTtF0u`9YZen@{pZ=WtVHorjj*0Qj^H) zwDQ=;#@v^z+z)VT%gRendubmk za!+fSrEn0Ot0gD+5T49t-v2V6G#jsRC12l>V;cx^CF?k3tR?+u$&-=HmKSvK9E7!K zguX1m70Z0dU3Q=t8O}M#Pe!`GpX9ptzB_3S*FKVd9kt;v*Q5JT3%t^+FxeV%3M5jL zhy+RWIq98+mI#K-jLIxL887xZ& zaFZXo0@=wx@{Ob=lE|dY0LhGj#93$KX>8$6Wew6(cH$4BtWD^OJ*>Hu!3}&jhVODK zvWIijNk{jo4eV#iJ643CdrU3*cXZ-68+fJUvE2ia$V-v} zL)q7R2C~(LtCKS-x1cM=BT-lAyK#iOt4nTi0yykExOz*$sF)4IUVe-YlvNaxtN8?} z%E`_aL!VmI|Hv$l%tOxQJwIWcWM?2*DfpJFlsIcX^o`7LRpAwd(fX3vznPttjFd-6 z?F>4nWTCfKW;zm$MP?)HQy=bPEB?q)EZJ#xQgRtxv}z{eqx*Ozley2F^ru~=rgFZA zgR=A>vMEDfm0a{Sy~k?K=WI!=Bb7D(loB%#Y z4kA7Ao2QZAmGdhk1MeQsma)u1&OsOOj@Inl13qUQY-@#8+J(nli2Z)WnOV#U6I{FO zAv6bh{T9i}$fGiM^(FVa0#9lr(mR*WkrV0e;#IZa{Fq#&tPqpl>NCz*CJ>*0h@_-$ z&x%FOic~j6H%TdMh}^6uE|Y!7F5s2O9_G1;4p*baPVwnwI6ZPkS{ZOEIgjHZJCzwb zu!Sz5f790|GbiSK?z}3Wl7*c<#P4?z+0=M_ZOCF*p7)s!>)B-dC*^-tJ68R4E~ z7s{g9hjRroe=MudWS{(eT;C&Bei$ChK0IW}nA^+GQ>ixSitg~E>mu0C&*_CHXS2*@ z-5zo>GN47)Ap5cg@B=(A$-B9YCn_ubrA73DEB(Qz%ebIAtNIzAn*rX!4t8W99G6Y( zg%<|;SU#m8JqUZVyJykKCAoizNtb@-*U26dWm(zc#Aa{MInqy-HUB^1d!6JS_G;sgv>@shCx}hysVM-<0Z&EU?NgnjXSTvT2_7M5y$g>9ngBeu}72nPR8KuBkjR-2d+-`v`w90`6*;`dXG}u&=W-giaQfxD+(H6xvP&{&EPIddz(UHbrOhYJ z;#^2HK<36K^8H{U*D+k%2&z)QhHv@RyPjm-(a(+Pf6|D@WX_iKqJCpPuk-Iw^uN>z zlErbCQ!t9(o6OXx!yYAYj`nd5$M9J9PQFTVO1Ar3*6A6t z^BgTap9gcl&|W%nF4+q*Ll9v)g6vs)NJ(MN##`kc(^CpE)9xgvMq=Y*(4vRvTy}ze zJHXBj#|N2#M%sd{Zj4Nv<%-X-N0ON)5lR`y%KW5?oHanls>t9A?xrsBkL*6Z0;b)3 zyqJMl$4&Ia-N{_S{e04Nw9broy15e)R-V0+JC?Z_*@1EfXGKo6 ztU*`9{CstR#afXQH3sRB-9{Yr>|zk=Y45l#1L*x!ihg`@T5neR!e6H+uH{rmi&@O2 zD?mTvtb7+oceuLrb$;b!;N2SYuCkMAe$GxFx+M1J%ns)nvIAZTAgXk9V9o#k@Arx+ zj8C2S`CD^-m!6I`Md-p?40}Hkdz>4~m76(xJDJM-)G3M$+eZiJPnn-pmj0`|nG$=Q zZqa|xIr_HK79ZoX(v-QSub48vg+9B3bg!|%=;|r#{oebN_m%gB_k?$yx3>3<=cMPn zXT7JLC%b32QPMb1AM+CWI?bcaU~b<$R`5F7q%FN2w=f6zff&u)_G9*Td$ir#ZfbvO z_qUhY7j4VVC>n_`m?wNzBr;R>FUO!;ep}Y=9MUEIL&+4E-R*|qbNtE7oE-FIy@5PD zW+w0*WMVyE=jrixm|d0nwK%&aYab0xv#i(8$~la34#Q}aAF0ol9q48fG06^t>(Fnq znmUFSlt{#5p7XzskAvLKtaB^+QdVR|b8=0k=p>q%PPdm>v9-+eoyLrwip*l@#XRoK z%xAd4Y~Oz!mFIrorqatZ;=JW|TbQ`Ml|G~jUWUPJstbJYu+CBX9Cx5AuEPAJ`}F;M z&eWm(PKdqk0Sl@*-iN~68sTK6OHmf)e*8`s@A33a{@nSD$vtbBv$==P-Gk}w{R^L} z@T~So#{%TOD4h<=)4jI4wn59JPtvm)7mQ|}Up&d4F5au&g1)T2pzpQ!y7w1vJMVj5 zkM}>%N>5i$sWD-k z?99R^l5N+H7wMV$TUHbm<@mp@=q}cZ6!9@rfw!|>7r9^4DTXAr!xqfJ4$G==8GmI& zC%T;1yX-;)%_*}95<8H5_ZN7)FVSaL(D3p+%iMh`v2rc;cmO`(R;E|(=KMZj%2saX zn!iz8tgP(sn8u`l^Gt#%!ad@jxG_C+NrN=iW%m!E}j* z%qF~w*Igc;>n0j`J$j=glMR?s&K>sV-t#i;e3MwnZ11L`hR7yT?7Q{}d#}C4zF;Sa z%AyeaZwUR}yz>T31)nIEh~Jo(8e!^lMy9cMp#S`4*5C`{sTc+*M_G-UrJGD*Pc^>DqquM@n(j@KMcXL$AYbG-@ zrqM$+QMHhUMa1t}nSZtnPjWE+OmpIpimY{T;(b^ zGk<=U_(z-2nY<3lH&=j;_b#6EFMoDuhgPRH_3n5SKplV6JI4&#~a zH1FMGH$C^?FqOFuUiSbjs`ON4NBLo#$rXGr=SQ!_&K|-(NM?}ijwEwGz3B>CmeX4b zja?X@_H#V3YhV&f6^~j^9j9(pU9|`O&Z}}V_v=B<=p^Hg5%lEo4D@VbcaM4&dbW7h zdiHr9dQv^tIp<$^YIA&co>5o~-fHq4lrCuhot;5-pvpYL-qW92s-4!>v z_rqeD_*C4o=i7trj&^IihF#9CV3)E#;k$x%KD(G*$*#_CYTIq>zV<+SlKqo?(=LEc zKO`*i8IuLhF?B)5!j;EPt>I)>#G@IBw{?%xn1dNNwbXv<0_Fi+R_`-~w~6*O{kF$z zz3JaRjZWMfwN=_y?YQ<@d&Mk)IZURn%!Hhew2WE`nrtC6&aTU5>q-Tz1ey1e6+nZDWiBkhPY3;ON7I16&)(_;o&qInYabi8Jk7bn_ircD;uFy`HMqHU2b8dcOBu^eEoa-m2d6XzTvoUf$;3B3Rzto*z8DJY_r& zjip9M<1b$GL>r+cX@{9qSwX#o#~ViKn$m}VIQ{kCbDkpQ4Mi>yKwH1D|FO5(%k8h( z(Y$tg_BX%%zFiZGJkXwEFR_2K57?LOWIJXT6XV21_BY${eqy1L7*6)#cP~(hk!xdk?+Wr_pJ> zg;s}-*;V;BxAusB>#OK=oS;6y*ZUT4GV41`{eM%34q#zBvm<3WkM}sAXT=|AqyEg5 zA1R`?Pb7)*;zN;6lo3@$4|ct)XePd4=evtOVkTPa2hQ&mv65NzS4B)b6?a8J^m;SA zl0xW$Z`jqXP9`jGG5o5{L>t@K)z3jk?%;jMT5?&_qqD0m-|_V>FfB7L69zJ?1`~hF z&{O_BaF~Mpd<#$HFgEBKbLWKeiaxu;u~VBtWXj{2zQ*QdA#!<%94y7V=zs?)dr%qZ z^u>6k*O>MfSopVoFpZ|%$yuybcIUJh!_Ire8oQTW(Qd}+Zen+`zp|&>htT0! zL>t!dYfi%f@j|@k48>k=$4~ql@8mnK@;cWnyH|I?v-%6m8sH?CQ0t?a8uM>0R-qL- zYCcno`m2rTV?6-vJxT4%;A)&_alv)=}5YPxa%S|`4RIN)?vYACHq&bYza!f$jan?>VuSA}?zp=@Uut>L9@H#r;2aHzY5;9tRz-&#Kzpcb88gWmu?x+W` zWFo%sPsBLwiF9u=Y4ilUxZz!Y+>YE!Z~QEov1`R^BwpN%&&rR^zQp@nfn73!sBQ#t z(-dAKBf$?@0on5=D?2xlD{sIj$!~=-E|@GkXEdt%z9VGoAACvO~$-K z3jQK0U5ySIiHA{~NTwq@Qw@tTo!^xvn)2f}7w7*w5C8cLvXDzzf!5x@6yKd-m=Dp{#qm^!(bs-5 z@AxtI^@7-79GJ*D_haWN6MXj}qfhZTo;c;*p-d94#6ERop5aoW^=5pkt$a`PdzsUa z4ga8wD?OU?x*rfx%DlxCu^L>QkDXXe!c>PYu4SCe0p`LAqRGxaz-8&dzqN>v8)>7)Fp zn!LwoJZm{2aUyKC4OqaX#M=%(y^rm)l`n~chA2%>Bt}hOE4BR=Uik zVOJfzp)SnA&7qDa4z}H&o#k#TXEbQpLQdub$6{LeGv{Bl@(JZDq`emrVGgD#4`r6- zJurl9-05p3nm#seMQP6L_Xg@gC!;dmt)eb)SBpNJ z`SIc-x3@Zp88$VXU(_YeM?{5Z(B_SmI_^~Q9eC0iqWRv;JY^!Jn#K9ceW{*clICx2 z8Fd>ceS!9bwb1p-%xym7F2=(x9$f&>!~C< zeYCCWW4IkJYsS97tQdF5G%MqUzwTy{QET44h$C%d{xDPxaE z5;i#r$`?*i@cAchb*Gd&%ZRw2*$!`um;>BA&RTtzb5v~Cnkq9zadb#){gU0v zX{bI>cRGKFyDB_Bt)^px6D?sEy0~XWA?-49UypNETAwBQvtP@!4DL;_-0cLiH<&pz z--{;NWOb!;%zjVps^Psm!_@)GcA;aNR=eq)@!A5nn)(v2ZlN*VUQ4Vs#2Df}FdM6T zwVg@_vC6rj{H#~ApEA99tCphtZ1&R|DtX;D&K9?HeYpDi&a` z`WWB1Rqfy0`g&Ha0*yX08ke=@)&ys{zFaYh16OFB-DXaD{XccA-BdZEZqpqRwa$2M zC^zgj+WYQ*oTy2nhiYIQuc{raVtR9JjHuzXVY>BpW~>)?RL!eD6#MNY?Y6!bAE+^N zByN} ztk`0|c31RLx9bt>KWDAl+f&6JB7V`Dt5IU)wM?m4uc+dhTR`uuU9^ka1-*;(vEoLo zp|;=GSLCvEx1Fbx_N)2AF6&vTPIVgCJ2a1HsP)Q9RI7T2IqRYwm9Xcco5|V(nAJnC zV@-oH@c=7w(%PuT>qkUkd%B*a{Uj2c|J)*)S4nX5i_g?`MoITeQ&GOx^Qk?QTUIXh zd$qSRU9DnQ)OTq`Vr{gD&Qt|ENi_DKa#zPdnLUqO&6z9~Dl_!q;!kI#G6#KI&YgnA zzG1Ia{CX0R;Vh@J(pQ_N3=o$^Q0=X66JJ>+^o!bHJ16@1vVKFPnH`LZdKSkKm7QK5 zdgxmP_1}fe7dI1^+>pqQN9(h)GGHh>)K^9~tB@1#S*6q#7wrMY0=<*H#Q9YHLY=5w z5S@t+|1}=DA6Y)7k@u~z$> zF+x^b>$3VnziVHyk2(!J9wpICQ~p8HZBfqcuGvV~=i)bYtR5AMOk00wv=a}Vi{!&f zDu%v6-DcKRr}&SWPo2ivLo{`M)z#{Wm*SOPQH|OqH0HjzUtsaCVLMK6-#xX_AnA&| z-mR(E1|_icf$masfRWj#Z?7}^7^A$~&8hYf-&!lZc0pC`549tDcPA)@DTR%3&fb`2 z#Or08J>(_+a&j;!^-Sysb)QkfogRy+kG(Cd)aY8zPEVugF+8e7wYq2_cI&V40xGKq zt-NkIUq5>c9&ABFGZM{C?jmEP8?bjNz14J{s?pzFzh|-&wTCH9j8mNPeEMAFnpsRO z?)g(}0hjzmI$6_}QJNo^ZOLPpdh(w65+)B7?RLq`kcO(fGvp+3IVr1ydWY z_OVL1MSZ3{*8WC)q5k4*K&O{ge^Cdxj@`|^;kl#6Tg&ZuUwv&z^lK-lx1|0PYRHu}E~Y zS2JIGnf|3a$L=Nm(T4i=ih@>iwV8H6%)@#WP)mrF?oB3)H+5!PU6rlcf7%o@O-c2E z`;R(GtXB$Zxs_xqznJPjqR&kIJ9;&+Gx&4lw}|Sj^H%q~Fek*mP_B6nsL!K=?JJ(@ zt`MK#LEKkbsQKJ}G3p{iGt^gaGngOy_5|*lxuXy4b;dWoHFk4zt3BBNtEXJ}3%kGP zp?A5tAza44!(6LC z^`+5Si<&Y0xpvaNYVS}!^DI`^IAzV3%1rINXOr_HS`*)Vx;G-aShn(&^Obws)6vSqom&7`Ci<&n(E7xk@ipO9AbpVJpZ(QT|E|? z;EdLr>c_+q=bZMQ`@1#XXz3{y@re4Ky81#Sbgy~S`ZRdYTRNH}TvcBZ-^Cmf#as7% z>TWR~JB7T})mCZy_27bX?iA@ENU!s~uNE-x3Fbt3vgr$=?Zr;*j5n9~HkQ-a>nSQ4ngi8VezGLi&rW~s zjP_C~CR(_ks`IrWZeQygHBmogDWa37vys~#9LuLI^^8?2TVZpq{;^(7ly@e%J(PM* zQDucU=xmP8byumI^l9oH>$p=9oZ+f6#5}D`^>kOp+v}BeT6yPo9 zee15UHj3}nQAPpnvh|TQSzV}IbC2oiwHczg8Sgv~6n5uCO!r&;gfUdyuq=@Nrh0L0 zy4hB(;3;l4G+iy|ed272%~5XYT|9a1snPeGsIk^N(8*%Xbx)|@C{;oEo*H3$o>^Bv z>RaH93=dVmF>b3Fjk8LF@NF^Ods=VeZn67W+tpRZY|kodNhC$>QBqP8*vO>iJGB2D($-4eQ6#St6G<)tD)= z2(Q+~-KC9iYv9+S@w7y3mowh2s+PqUO;vMiaZZ}GR(WRhBO}nw?c}5>UDa~>K>Kge zS=pvnclU{$T1m7u)A*c=#3yntTP~uP1nr=><9tUR=T~)}Q(ru1qVZkv3wn5-3MUiK z`>JxlKID9~(9B4N$N> z*_4C)CQ;2nOghSGuU1sOc;=1N&Q2}&k&|EFsnij9$aZ|eDYKdVeTV6mpAtFWR%U58 zz%r9nkFF9GGrLNE%cNWSnz{z^S5B=$E@FaOSUoFrH=^z)Tc6W8?=DflBd7RMJ)#!T zrig3ApLdGR%b)|$m#_6r-L`CrTL}~Yh(n#&6oFihqNv!&@vdUfV>{L3bR4su+f1#dLy19cu zS<1T$m7eY{XPz=l8|jvGt`VgqX>`(dcDg%=O)HS28}D9M@3;+}H)0bA&vGZ5`<}B% z8S8F==`qNmVo4pOlyRoHr<9OpazfyJf&LA2zHwVCrL^yrChYb==Y2J|!u%;vqY-X* z=Hw)P8Yy zDNVtx2P(Uq#Y6(7wU%m4vS4xQb(PLeP7|=bnaT*Fh?Yc*J@sSi67Z58pe-+*=1P(_ z1srL=)7PzuoKJN6ie+F6)zL;%#1|kaDva*TAPz^FO-$9Vx)c6FUiG(k+1Fm=zCQwa zT*uCR3_@3$tm-pzLv!5*#0b~5TS{3$jT||FkCdOBwV*2llqU8OU~(k9T1@6Z}+ zL9k9aYsia9*3(<(7xz2xuaYpAj&S-5sri+*ZeudBeK>8uDi=W^mnq}aN$h)Lcy4FN z1<9VzP3Y=V5UDKARV^X=^ds7`8u%VuU*;d$Nb_j0vfs%T^dk$DhrF1M?wq2&CX09p z&%Cbs1E0Q~-1jF)^*k`JKk2l6PAQ=tQx>@^#awqSSjQ@Izj4Y$H(69i^R$NVqp=!I zoW^9VGdaJzbJcoUGi9RiIzNIR$m~x5uf4XrgS<^q@(@KiA^X4pzjexjrfo(-JE_ay zuWx3 z71(fJFviaAW>Bu;{C%!k7W@1IXEIUSrp{5bsxyezFMv&EP^W{M{J^Kg+yf5md!?+p z0o45qw>8=0apdj0f;{8_Mg82p?`#kS$dO(m<88v3sL20^$)z?RTe^%)>nkGi-JloC z!4@AA#a$7$nCv8yYw70R1OK=~#^+bDl6ma+oOy83j)O*p?Y?5GqbXmLp>6AAK_)+U zE{Y9!^a1fq{6Z$MG`aa-ow-cuJSirSM<_;Sum~EpubYz$LnY_6m@LNGx9zFU3MaR7 zN;Kt}Tf_+`2sXYG?#YkveNHML>3?|Qypud@j9$ho{gILCJ>_fRuODa`huz3h3Etbt75i4Ei2@ zy8gR1LvyrtdMkaJ-diuGAJO3tXnD2F%sVyUbhvPIhO@u_qFp9}j^%OwB)?XHyy#U{ zproi~-?qkDQ>^CX3~$;a?FH6M>x7kTh3wqowmsRtW(Do{M0TRj0%TfiI7{utb{?*5 z3CK|mXCYafl4NvBlC{Yxa@mutOI-a(tB&=nsaQwM5@t`crS+XS;0!_rb2=SGnw<%6 zqOoz)TiLhGBYmXh`beX@??B*0a6oWepk$z>|G58opi*#mphw`-z=ptme_j9I{$Kp# zeD%DJF;_pWcQO_lPmB}#Pue1-k&^_P(~|n1+He6v&K3JFE6u!NwzHDRiw(1CSgr9E z>sfcqAIn>)y4n*g)oN-jwO&}wt<~mNW^J>FnazA2+Z-Ej?lkM0narwY*gR{FF#DK`&C_Nf zYlKz8&SPJ<{7{kh`qf%)HKgU~>)6KFadU(<%Ip_=9{s|sXD=7&VcED& zIcvN*z)n*8dh-WA2`2cb8?&`JdP!fY(4X;r67I)miz^Vk61W;X5^5dSHLiKwM{#FD z^+HR6&4LNRHi5Rjw%+T;N~5?Zy|=Hore}pV%*`&w*nbEEAE|+2xaaNH=H%G4XpLBT zbCBh+_L&9DAu%x z1kZk|Ow#j{3vcVGv@S_7J~WTg*DvD_bMeTU`vWevh^b zze=kSsUF*DCUXKWn#s`vkztWoBv0&T^OdF9m#w_^QKY&p8UEgOH*uY4vj@DAI^<@n zX(h-ZZ&ADJ=RL2z^L)8|0dFCX&y#Fq_au3n`fB-e`AhkBcno8Q{-M#>xT~MjJLt*U z0x-iL@y#lLD^GUHIs3`D+xB`stB5tz{Ln0A&N7p%^ww~5bgVd!&M^<`dok9*tZx1o z`!n`gY)-7GIm{em{$l#97iIzLEHb^{Y-0Xyer?`0^O##>C!$xQWn=fF$D-fGrd#L4 zd$6sxv!V;ly;e^ppZDKjjku433p~fPQ`&6r>rl0%uhX4LjKp6HRSaDU^^VIJKPmph zgk8w*uW?O6a|2%gcwcGXMs)9evZ;@l1KvWN?ndohX4zPSSgN_fUS|>yQ7lVrLNr5kaimhDe} zViRJoV;Rhvu}eta9OQJK8E-vj*GF0p%~)(iY(?z9n9powCYk|rL##G?vB#`!9~PtV zXEkS^ebSCP1NEx@exXUBFa0Y#U5xXdM!}(p^U@bge>iDNLMZ-tT}<2|TPv(d))utr6Z2whRn#AC75Oim7OoeW8rctK)G1OSVuc0QRW>px zk}vvIbXPP-tPxr%2ioAP=-6l^`X<)jJQYie=8ydmtr2Y(2}PzvMn;xLGguz75hI*+ zLKFSbwjD$hwSsSL=u-UeaY?j%ENS%h`r~${%bfXP=A#*_q&pcuI4(zg-^5Jm*Jb!2 zW62EfrF#&6FsKK5_!}T8`TftlV?Fcq(%L#DE6DR^Gc_tAL!uL6|Dq}9gg;7slw9Xc zr8iBJjkhyWC#OA1%bqs>?W<%@^1kHRZ>xqsiz?=C=%{nC3b8}6pw$B$U(s6YDt6}p z`tX`@++%q=`ZEPPhkC?)5;rvTUvPNv=U~Rr7ops7hvL%Wl0yrFBLmg^G4DiAHqVEi za-Ii9dSe!tZ;JD?SZoJu9j!UuDurC;jm?kz9%$CqHaK-4TKk?3uTbjONmY=hh&$2y3G_hd9i})#t;dBX^ zW@KrQWoO2$NsB}C{jTpwAQC(hJndiQIir88-2?ZSYF9NUMz2LWMBj3X7Dm)?$<#b4 z?ca2Nz2o&iZsWRxi(@GR z^q-7z##!Cc=Ihfu$-YT}^}*|*nsM#1hlS%3;~s=^#C;uiFD_ktpZLM?;kZkoV6eUa zh(Sgr9}?M9M^4MgNI>64@Kx7!D%0DXEd0Y2UxCk-Xxy@_O5wb8l0_H)GYU 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

^eD2KE6C?O@`Ui|+t?-&5^N3{t_7SO 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

C}73IHV_hZC$?AUdcefS7Jq^HbtaSeVO zd#IMJp+b9-I{9|`?cRsGQXHf$6S$TamFxv@?+X7+1J)3*+*c24ZQ%!xB~Bfo%>&~~ z1CBM6{>rOZTU&?*_xdmR*24WB*1hk;TI#DL`H@`40#efEF@>x^YD{YwAY5mQ!&ix{AKHCeWzSknkvuaxnf~+ z8>gsAmXOVV#`8A063Uce9=G=bRMdXH=H4WC1@|KNc<(CpfbmV}DQ*c?ko2v}-=Q0j%!LoqcK-9to+J}p6?#(D}e#&AA&)^@-r z%d6f|!}Z=UdD4M^l>xJP!2Z*O9rTKMT{wk``=I!Zj4THIiQAmZD7C`#J_Fqm{V-eF z;HxwYQ!1G>jZR7=}nAeHki_HOeW^eo4npsYuBMyF6^zQjxc<}e$K$g zI16qTa$16&Ys1P!{fc@QVGsKloG*BK$i=YikyBR0;asPIIN8bR?(d66Y1po8I`A_H;@T)+_ra_#w z^~~3}bS$vQRux~pVYYA9Jl1~7Z9LPCS*j^Fl`v~+Iv9Vl^pSUp8R%Nq0wriQ(6-I6 zGFdtLQ?$+v{2%>U;ik^w^~UR8P`)}*ybMz(!@oIfbjN#a2sMZr#$V3Rd}ah)V8j3U zleD7l6G}(=Fv|=k4HGnQ{C;T3GglkQpW z%kD^TA$5XTR(=WkNN-A`v@k_k7Bn(EPoyK_MCjPykwN2vJVBR&bA;{RRD` z;_ITF(~IF^Q%CPYN8?*+as8{AMeak!a9inPsVYB}a>!o!mSqu&#o4m(lmR}f zMqB0bI2C-u2QQ;6%3a{|<1>sdHbk9F-m;ilMVP)_&FO#TEdh6{tZy2%oVWCUKB*Pb zo}rP;g{JN~Zl^%m++fxBKCX@lH|9^DD@Be0R>u%ND5@=(>kX$iH|z+32y zG@NdJP3S^55DWG-n!8L5KQ!?Z@n)E z+|v)9x1Nhs;3iXF@%r;fwq>zUR*C?a%)B8KuQ_?*(sqpTmD$6^$yw0vMtbQOIwAw{Mlo%Zn}V zi66JvHrk5W_E`H`TUaYwTaty1vo5nXv#wDFSPIK&r0VGKn!-W-$;tkjidakTc)5Dr zKNG|(*>A$QorNN3G>V`GsDa9%XdJHArjM2nWd51<9gL$VF0E&ctZ*q+^Mud`PsprP z2%XXyBF{2-$D||^w95^o-r^}x(R$P&pU`cl5dKn6aqIQy6Va(|4fJ?L#~N_ZJ5TR~ zLGZw8knJvot!UFff`lbAOOI1=D-GlAC`j*H*4HwW#`Kk>`j!(Prf~N6hN#vg*seF# zNB-xaWi3IUVsR38s-^tR{5m?j5Bg#PP%7~HdmvH-bvM>!kz*(QF!}b@geQY z+5QOye;qn>WYa#VTX8XYp=L!TUJA#Z@;K{1)_Q6#a;jQXR4(cBaISj;Hh$4~#~IiW zN1rY*Y@3K1sib|S@6Q5QNXO~-beDX*g*2L4WfrQwG1Pmf@Vf!!L}~i0T|hbZmUaFP zti2bEW;@aRN8I~jLEKvq;{^IrNnEp&%Ebq?%R_kbUh=`IoDc8mDexOU#&s%%xo}XN z1LMyNmfsWC@fc$Nv)ogR9*jSEVAOvYKiD_MgW}XSWKM~)xEpf%qJA!ERA%N4q%!y) zJAXbgO!^3Wx;f}-6l&ifOGfJ%y5&Yvm;a5KoSH%CJuk4DhEH6=qN~|#nzr$$b6y7+w zbeo=_UDtNNHN2yp(t6?b;YKOf5I>3yc(j~htwn=3eAfrCt9^p~Top&wHG&9F?<#I1 zkAz_2h|a`4{qZO(FFhs}r1u^yo$5I3wS`qSM=UGuD1Cg#1ycytI&0CHa={%@bg-X?@#HO#b_nTW6Z z5e-Os8TezddJtcS8sU0zt$@D6D9uQhGy55Sysq-mu``Kr@_|L|WY*lLE*nn|#B1DN zJhcyj=Qe>{`l5h?`9dWIh1$OH%bTxH_y6_yc!&7{Y!{11{gcdep^%=$kp%)#s z@G3I`9usZJHe1lYx1(eeZlYRvNY?nmxJk@J=P{6+&)jQXX2BAwEceX>YKyJ$j)eOaZm zLQV8f?WkOyV-!B2qFSd{Kqs{su5V^@2s0$cSj-L?EQXm2$QT+J31)uY<*6A%?)9IM zNl3|a7zW3hUg~%w-V@t$k`9D_9!#&V8Pxl~fS+F#3?UOrn9BeL@y9TyLjs)idD)IFsn2A@#i6#wUFvOofd`DbS}1T=_*R zSqqFH_Rddm2@G78Uz;WI3<{D;;HKpiTJj9$Rhf<^rjQjK`s8W%a zjz^!Qz!5DZ=HPCK>VOMruSTq67_;J2g9)PaK4I?LzuswdUQ6g2&|& zm(h*x3*HHh*@L^#2|LO7kJE5JN{Zt6S6##Fsu4=N5qN=4#SLyX9eUS_t%R9|(>yN} z64!7N_=u}Jn>O)3DO##0Ok?$gFoSmqWpJ?%6)NLl-Ok)AjHF7nUp!}KBtz;-=id6# zNzTJQMDkztmF!>R#Dk1kAF#?%sHYEslZ=GTFq9MJIX$Kmn8Ew$s?ZVVx2@qWY7n?|#OQ6sXxOFEbl~$E!E`B%VAWJdMf}6KP4CcBVt$wcn?Yami*Zz_@4~%s znI(y>w~4tpYmUK59Vc$U5jZVZGLUl;9uPTUcVeaI|JWLDjVdsVuH*Cff}J%j9F3Bo zn4?gs6~!U2I4+D)oUym)PP>PdnU5Vb8dtYSsU9)<7$JONhCJUGPEL8eOO#J{Fpx%WsOGZEK?W!$ue$lTOxJLBR#G zFr1y-PS1<$=6jUWOHtDF7W=V(zJ>|f(#Sv$#5vMldTM?OL~po9b;I?dmXOEjrkh3( zYQ2X<8{GvJ1qB_g%ojopatTG8hw7)guwEDVC9>k{NDh*c;EA?%V{m~o%!(3gcSY)LraUFB8p z5Rsl`F5e|f-;JYz2)6P<2*dj{i535fZnSr)#sxap#);q9)mnocAL2wb;JJ1sSz$LMn7x-Czn<1uZya z%2HanjZ{-`u|iLA@~smp6Kj>B4zSyN%$`_*%KkPwSr*m{n|DB>uH#bslhNC1tml0E zADLT8_NBD+T&yB)2T{4DZ>HDoHK8@U{a)fd#x07j_Qj+Q^g-Og*-;c7KmqZw@R?Y7 z2Rn4AuuYsS-4&wPql>YZ{D+RG9-X_lkoOK@6fDvmiQbTU4{f1tnzx1H;%)rH`rpG&xo=j?kNeFvK@j6Ql9o@`OMm$-qfzAoL-e~X2rD?$r%GJWer z_Lg~cL7iZX)5hV=^hCHCK>18Vi(m{AS=F0RnWWP@XdR3Z(jM8%UU3e;<-dBMnvhb= zM?9Ak{7TnPn!DKp>zsI3@?#Bd5X48bOV> z0ke1$>v6sC5#>Yzor3?Owd`zGM>UX6a)VoZ1}EQTj>4rN8urdlBAH?AF2~SbKOpys z;Y_(l=k~AQ9u>)GqN%OEg*&5ALC|@zDH4F1QR9(N$xz{=uwG1m6HZqa}1& z&5B#BO;q8hRAS_234d^3J55YklvDW!t49zfoBhdD+T(CwlBbQwgE%dY_R*ZevF0Ho z82|3f>^5V;h&K=)wt!oc21L3bF4`tBPam?2QpDmZ#69K?_vhTM9%XVK;fcS@MLP)#aL_tHl&*5c^L^M_h@ z13KtR+W_vn^rWMPZC%`I-8{36+_|(3~!=i=R5kKU|oR|yn>$**zywGSObfNS2QscSM zfad}`6FqsHR#uM{f5=&+5AgfCny<9s#y0U1yUqzPnWIK~eT{jAZq4sGpHES3+@+7A zLi5giAPj-wcZp}4gIsV07^q2~(249jF;YhH3DI|MGNz4Y#()>9n9i(+e|jIY2(zq& z*q2^#b3 z?lyj#`-!0%3DeDM=tJKbZ-nz=8zI5SMt{M!;Eq4dW#R|cn{FP*M{WIejK$KBa{0#fHg*en~10r6^T!i!QKIxZm5k+||vnIHIX7Lu!s4|#hFaFX`oWi+G zho(7ZJWLINo~S**1h3HhI#{Sq2b~Sf=|P+p!`Wkc8EcFeW`A)nPwq3$oHq?8I*GLG z8!=#&gYdE~7AyY(~PvvK?!1 zxj2Xjsj;!noJ|(die2RwW0H}xbua5c$eJJ(1>-2DOH-Uen@ z&Y&}_;aJ##)9LJ6j#v6=zM&^@W+KDJfj$Ies~4D?`*`=PTumIBx+20JDx@huLG!>i zoFN=QI}l8+Kbck8T)e>Z?Q3L0XOaf}!z?oAdSrmH;PoHb8A}uO4CdS~%N>3I3qOZ? ze?03wiG6)IO6o5-LDIJuq~Hv!P#t|_H9Y1d*rIVfo7KV@p8Iz2^)Q}63E?Z)!EVO? zg0T!Xa6>qfo6Y9NZ9R-S%>Vv%!?B_`3xi2npBZ16opLwMt?|YzvhhoJ1}ewY2yAN=bOL8vW7jBRpk7n((Bun}Zm)j{eA*F+OOm0kY`e?NwEW2N~OH^yr0xJ7wB zQLqf7Sr?D!3G^L=yB82 zL%)6w#!)dk9Gk{tqZm0#0rt@WaPm&U2oCtPf5)A@HF;7d{E9~5`E-+fuMCLkaag=B z=q2%i81+9^z&5;bo1>3E4?>j8Zh4x!YD#AQ6|H6;oLO%X@hYGo1&C0O@?5U6YtO?~ ze>bt$SP;1a#6FjJ0y$X^#Tc0{a00vII&hdLlZ*8+74`9EBFI2j(I$8vujH%yLR!4# zJ96^QA-8_R-ya~SXD{a`&v?QgxfYYVJ;I0{;K|k`a;?J&+=^Oi;C>{$`G1%i6}pDF z`rqJ0xk2x@*TjZX(2JB{$4`fbq9adb6MIrX(;U!=9w*=3OK!0Yq(tONI@lk#vKx=( zd7t7ZCpZ&s@vLIm7gNA~m_^O6p?R8fC;^`JND!1v#4-2S{ar>W;vy&UTSi8$2boY| z97!Kj7kAT#VJEvqCdSWgv?cEB0H)I3OlH56ajJOEc=rRLX$tG560hBb9ywn*6EZMz zNobV%6Q6Zwz8qne)M97a$aB8V+zkWy$po`=IBwMar7}2gr2;K$Dd)oF`~rL8Tlf`^ z@u}`iHWm!GEWofo1)8)DY;YQi+#|n&6kCuP#^FkMji*r`E_4er|58K} zow=&-)J7%~^Q1Gcf-uUqm%E44AqBaZkLYGPGhh=dF)$Zaz})RbZG0fROMTXZ!04yu-;AaYIK~i8Xv(^m*AHFTMu-s zd#*px?PSD{^~129=1?((yQMoo?F!@R+Y^-e5)88;eANYx`atbCRgS58q8@N7%}j1m z6i+IxE@eyO$bAus6yN(Abk?`~;|LYI1j?uUYv+b4m zQj8bBp+ELg(=Lgd$U9@aXV+86xMU!cyo4)<(7iic)eM$`mNv{tD2E5l%ph7EfR zH_?TBu16&^MQu+tyQrEGM)qfaL3N*+o@b$IW8u-2Cqr0mHU-P8BCVBg(iOcFcFYcD&*9f#aOxkt4`i(P?*{U{qS#kJw7t?6%Dy{NJe&j=FbCP- z1}eargihvJa;bE<3SFh95Q*REL%NtRXAE4hrx!B{ZK*c3f@4{StFBJ zJ~IZ#;L*hKllgpH0{8Hu~&}bKp)D36sT(%I7a$<8Sfac*A%+q;7MR z)8GRAxkEWICNhdo^gr}Qs=-aH-*4Pf)mfF(W`dQY-|AeBXGBugb{46t-nLk7yPIk}q zbP@YtTx2)BLS*$E?&cQeOgp%8o!I5Z;-@g3ise>fvFyBFpu?|&C@T^sUN*AWvS4;~ zdBqw;ft{${b)j405IzS{_h`Xx*^rsHnrm7@yca_RIF`-}6{-4`;u?~u@l54insTzW zfCpEM7~%%n(M|YXPsG2XHlI1!S6i{;Z^FUw0du-Nb-`*xZJALw{Sex)TaTsoQyWE9 zW6MK&^)^-dDPxrLN)793>kaEY>udD+E2-+wv96;(`6cUiYi;XxrJN!v$6(n^wRD8z zHcBob-$kXTNWbwt=>_t0ojCg)9Kt5%H_rdzXrnq%%jNhZZaBgIFpJYF8@ot-s`A4b z*)fdmJkI3>jOanC*5^2(7wWVBd3hhFj(tME3-Y*(j>{W}F}4yX-2=}I%#+td8z=S8 zdI3~^!-%tb@HvmH^dP!K#OK5sZKxt1Voxni-ZX+e^&WM+8RAg-fz*-nhUW!}s zavF^LU>=;F64@o2QZ=|u6w#8nF#>E`fOF`fDq4~;If#GLYtXN6yy7CVhk!XBj~2Li_T>EdG5B&8G;6jKo^CCamP%cEmak;Q%PLOPa0e{) zEkQ6z+tF1fo%~uF$|?7P5gkT8zm5?tNY?a%wN;L}_lD~qL}X`ha+$CU8gP#6*4uD~ zOolVIhEsh zqH4Q`NPifdpp!7~9vh=U4(?LrGpT^hK+E)(IQ4+J%e*giM<2CLIBllqoKT6qs(?L} z1@-Soc2^cn;$w2pBE$jH$XWZKOUVxo5)6j?hQEsiT@C`({0fps#hAbSK^!eJSGS41 zgiHEWvNRAd5Wj)wVVg2~`>4H7Cab$mK6HwXiV65bJ`ysDWx*+vjCTUhji{y?I7>BR zoE7X)n}`Oxi*rDY5gUU!@54XBjY3AH;va-V=U9-}LS{ZQqwt$GKbjqJKDgdpPTw40 z2Q7(LI}zb8WA-mJ=JIrTDZdwlxX~6-vdDgi(g5VC*0_%A2C*d73YNEoQ+)W1AL3hAU~5h@fMQ1 z@1zRi(r1EmDnbb(S?f-%Co>wkj;MRS>EDHL$qQ!n*=#O;M-_6?oDZgyXa-B8&3CNo zvqFTtP_$546!1GrA+3XX=+nPYE8EPev)f!i1$8Tx?83qXBO|+$12kuWaYx81y`&f9 zH1ic#{#JOV-!xl;emoP7akf1NA#sX5IJ5lhPO*YbwBV6)9Gyx7Do+Q92O~f^(-{)A z>ZL+O-AQH?B0P{b36)u4y~TpO&PAaJ*mHVn*Xzw#Ar|)d8!ZF)Qm%kUhThgt#QAiG z-A6TS70)lD(MSwtA|sR?vpXIn2# zlT511O*pMLnF;vp6ejP=1gh!=BW~ zm^X3wdacJW=lAPRsM7Yr12Eb+0e|_KPIp(aGZoij!c7?Og+Y0?g0=UcO=5y^53j>m za~yo@aA}}0TC7gr*&?S;lCev6h%|GJH`tJkfH@uIZc}X>qe(0)OME*#^A!n9*6EYkm>OnjyFk zSJ%c1s+38zn-8>T<24-Y+|&z#^e)19X(m{CJMEG=24?hiP^3Twr80X$SMfEwQ$C{U z+Higkf$U`GTxc&IW>0%X6jPO|*m&x#4~6pb0|8|@I7daHAJvA|<}a8?nc)$PBPWjq zqc+T(umSv_M>mbK!VBWPX!x;2Y2-h1gil7iHcn^>Q?j3#ReuBbs*hQXzv*KvheuJ+ z94_4l`+lP@r6wJ?j=RErW0;UaYR>uyhJ~At`o|TjGL7_u#w9el!_8vspjqg%VWF0H z+8Cg_Ot*Z%e5+P5-bmHOeP%XeC$n}o6|*bSI^(-mUTP=Rffd$FIw!2w3kfBqeMC-e z$(>fgX()nkSXnb(8;J@mvy{O+sPBO%3Pd+aut}%IndVXTwy{b6PkKsxJwy0q z?jTk_N!F4Xwo9Z?-e{;LfiWyM=ipJA*&KxKr;qNU^V?Ur6I)5to4GPQ;ae2L8&)_(E3Fw+NHvDfEXCSyMgClQ^HB)P}Ru)D=>3 zw#)*jYNR`edQ;-B5GGF3D;e{_jjiHmy`VN!47ZGAJgw}(qokGcG$8^ngOqS!74e4d zGD76hjA4IfP7&5aD319Sst;ShR{si-RLmEM<&55Z=QY*5+iEfKiLxFvKy#zHl?GG+kJ1%n+{_)3kKLEor5>UEfOu56utk_&5#fDYc$=#&7XIj?geg)NRDyw%;0emz!`d!9pXQkJh}Q42v)ngEs)Ok}l9mc>JEJ3g zV7{{NPnEM7oAp#^c;dux{kCyeIxWN*dxc+8395^EITh2f=au42+(4(qPn^6mb={W2 zSN(^ni$AGieC8dURIx>K9(`33L4+cyGKHeS87wU_7aN<{UD`>V#US?0RiHq#gxB=R zZG|s=P9kdyynw7!lco{zZX|Mg@sDfbVr4hwl&T9CE{NUlzPXUyXFuvdLA(WH?;s46 zHTa_j`px_`;)Dos8C9ZvXcb0?Yrt;f=z0GgK3{5cEq=8J%w+wQagOWPj2WELABhIL z@am7r#;?GqjyGb>iee^M8ayeZtaw{kXo+QXesM(?13;-(`$`A%)R3Hx44 zPQQv&j8^iU%+!33P@NH&%VOCt=6igzHKOsyMJ8-X!%mY+Q z@({yiV5e(Cy=D(}+C^q@<_L8k_-I9q1fKN}s%+bgP}am>5VqpfEP~-$RR{GR0JShd7nUFe|5rMSLOjAje%oG@73((`9Ng5!7t*@r|n(K~!|N)eYOeLst8>huuw*)Nw?UxWD{#0u zNUk@I>pVm)U>e^`%XbUH0eEY?fva_k97}?qn3;^LE@wbn^FK!E1@nD7h~hdTsAkNC zl$@Wp;Vs`FI|(E5tR$qShBFB~q8~M!R(u@>>gHmEPBOpJFkctp10KZ;Oym@}!T0a- zB)0QzmAT3~Tth>m*JbqlY{uR726>$)guuz^0~hcPQGPmh%zk8^2G^UKm^q4TAj)A* zJ_J3yMI{LaHCMTV8spo4Tp~CB=Vdhp?&lkLZwK@Ebjd5W{#5)47^;WXXA{ zaIEBdw@^=_3Q7$nD|_J}UiAuGfxOJr=Ztqs#=Z}~RghOWYhE|Psl}9}zfMDbdnaxw zcZ?$DW*FD|j8G8yrd*r-U;Q*AdWadEqJzl{8o`TW|DYS&Jh&o@V0Iie?or!l&pT%$ z-n4@5EGHJlZN+TpQZuoOxEglLXt3KNpbUm!ax%~66xu=6Eswc@_k2sPtim||pf|y>s0eD- z_i!@)k^z??Q;PwE>dt>3)77W~*;#dvt2N+eqc}fPfgd^HUQFk&ZhTkP?qc3 zRQzt=s5QZzU-0iRoF`+zqZ?{fPwz^#Z4p%)a|xzxSiJKi*);-dX-%T5fZ%n9*`fSzvQG+XnRuUKlbl zG%S2%cx3pUuo+?H!p?;D3+)wpBxG3dOlOGwkuulPNlp|Wz-^d>PuCl@n*XHlHHu)( zm(@3$*WKqi>IuUAcAoFMe~20db~{4((qWr;yKF_0LOY8eNqes^?JizV}&Bnlwjm`_T8sm*DH+?}nGmTs0Ti z=qcu$P3TX@yBw$`##nMGPn8N*hqZz=!rImP-kOE^vfnz@YOz|Cd6wVu38}vrEPSV9 zZ7%%`y-l0bl_;-26VE3r{k^)wNeaBSvuAB zR7X>#P4zj&pr{6s=_4kD6%L&hT*7(7=CfRsRQMQO=|r^8JKdAgz1>yDRVe9e;@YI= zNp)Rb*Q(?m?)skA-gN%EYAMhK8&%VW(tSBb8EkE7n`p1-nCQ6VxbLXq(Coz=PweIG zBW#VVrIj1#@*DxdgqhW7Qj) zOaE%5=VZ1?ALInfWaXVw-+JDfh_>Q9;~itIX?>uiRT_as?9hce3YMCr#Vsu?+f*Y z=ZzGiGNj0wazx52DUL*iMa~Rg6t*<0Vm07W#PFTqoZ5%MRl zOSt#<+~1}N&l2_~?oOKF8j^g)-PPO9e^8rid@(zUUa78Sv~t^e*fzj^$PpdXHE31P zgP=J)6S^q~LDtfB0!}hfawsqFV)_8n2I#@Q~=ei4ZYa$GX zk0@>2)J|hriJyFaUpM?41HO0re7Aiq824UORTXMRwW&Syp>EuSn5QrudrHeeun5kf z%*}5pP51Q!xS?N^;-sA@a)XFZ4^gGhB%A=h>q`t@PLIS>ol)YjZ5)4;#&Cp@K0f5Lw^NHj!4^B#gHpYlg+!@ReuvS z#x~Cs*UE(6fBMGT{*?I}k#Hj+I&oZLde;v3Cf`792rT~$QYlMS>pR;J`$+pa`vr&J z86A8ncyRCmG<|^{ZOelGIHR09?N_WnEGMNr!f}0+I^XBUk#$eM*kXh7G9@S%?5A~U5xxUrLZl(J(J_F7blTS^d`LHlj$?i!Bft&z~lAQW_P(x2hwc5`@Z)0X>?cPIRoG5htW+P zBR-a?Kz^a3`c>|1nQa+hnT(r8O?v7+lLzBHc?kZ}N;r@YIiFsD>kb8rd92-4_t4p- zl<$eRzV|uvDzE1+-HWc##WBC{fv*>&W6_VKpN){U0xvMzRmJ1rVJwbklfJR(!zMmW^FkCD!R*L8VcbIzD+teUU% zkX)f9YlWzhc=VA(4b9*Tbr(8=m0qOtd`3&WWrGr8jkNx!=me+L zw$^e(sw9p!$Ld?ut^V)+1e_c4dOIY`Nv{*;BveaS^SAV$7r$Hle*e4GpIHe{lI|tP zde5o_%!QIuS#P~%%kNn0yc4t~_*n3>pbyS4XEO&4a_ymXv-xPBX>VtbwvV#)w>p#s zaUl*6@yhB|EyCym`|S;Uyed+C zdAMaP9dj;NhuJFGQ#)kmGUrL>G-pcZO-CokQpQKLuCTO`3rM*|a!kFc=I8Vu@AJ`z zc(G@``%khvIfuIh{UkcMXShS?jkLjA!S~ho+^?$n7@zT=5trcvM{{bulJ}!ludB4j z881*FU4_rqE%@H^VeD?E+jS9tbKf=Z3hy9qb8ims5zj79oM#e#iNAR5(>P|;b`4E> zlvpXTOk!+er=*>(-tH6LqUvu@l)g%P$Ial_uvHN;QK6}BrumWXWAw@BC+W_o&6oCh zn$M}DQw@vi5&kUXb5M|Tt8JrYsi=ay_12F1dwbKnLtGydyC-H%Y?k2qb0pb={v`zmrNPO-{^~m?QCWqMo!N zxuBq6TV`*X(;=iDF-kKUcZMM7diN`!O| zE*7-fk3HIx#B_-wpK*yzlYB{el25y3U!<1GOeO8JG_cihJ_)%Q(J$qn z)WgzFOIIV>mOg*_)zKBx#iSXTYEgY+iS3^9Fe<8E2vo%*11Xb35xzx z?%?F%NkZa*zp;OM$D6-H;#b5E_*3d{SVG#wO-VhI>v>A}GN_-my&&m^I8@$id85Qz z72JxqIsA^F4xgifbCh$cv$NCXnC@ueh__R(x4pM!w2r~QRIvohpq*&j>KbMB*Es6w zM3xr%sO4}UN*)Ecm}KlOBm*aNl2TWYNc|*L}sj=iIH6)41{{bxKT;ST%8XVuqyc zNt0YBlEXYjy(4{F{jb$1s)V|6!R!f2w2s=qA{=)=!YRxqo02Y_pr4$H0<$z@@;`V* z!G=}OtEE#z{8fDQy~RDV-FK1;;2q&|HKZ@+K~GtqMV+h_GSY&fw^9^)V`skLvmsf- zj)l7;9!Ew;Rf@_KwL3CXq)yBg6uLCHM3CUTVef78!j|if$9`SyCP-Y}0ZIdk$iJdrWV#Cn$eP$$8Oy+vJH-0=n)iU^TO0 zhE^oM9*3GJ8@*MVXrbC;^%UO1<>;ulnf_M~e0?x+-s~Oi%|vY52?xcy_y8>T)%6!3 z4=at%(+j$F1dpF`xWayu6xqtVIOO+qvnnQ?fZ>u39mGp;k#@YF70;&ttK}2u%}0GV z4!lp{(v{Lox*AL9@DFPhsNSzN+JSxC67GoSr0H@EOOj=|QUG7b0Wg5(mwUpXT63|APVe3XG)%jJzFiF!t&1sT?c?e~18`*+JE_3V1_# zDjF7e);WZXTzgsg0Q-fHpo8_{KRps7c%RY#?s*zt1xfGW4Q#^OwE^F9?E)s}Vx1qtQ#_OL0 zG0Q0Cqx(q^Paqye!XBkl{djh2zwb`Dlb6%g*MaEN@w-y5jC)P=b>0#2A!swUN!IxsR7 z=w4WZQOO|%9NFigt?Ug3P*D6v&2S1BWh}L^fU02_9Gy8}(j#%-F3%l~B}<(S^4tgH zb_h9ZH*^K%{&DytQ5|1lq*lYk9}Ppg7B%+@FpCPoU&%^U|11bkJ8+%+uryNR2~Z8^ zraho-m%)2-ftz|?@i3?wQnS6wdp|a8 z@XvFA+9ez5;XbVb|F{b-d6lbK4qqUk@~(*IgJ`~lTd|Z89R}_<7ZmUy?2tRuTXZA9 z(8|I+2BR-fjT9h}jlf)IgM5Af`Od|x>Hx?42=nbeD;!u3WZTaiJOyKY1~^PNuB;&U z8w{H}FY|FJSNt3d`Zk^ipTJ*}n0HgD9t;3&8^(WoQ)64f-z&_`=I|@yz@GQwbudF5 zh!0*Pw0&vC)M)rz{OwO(=_Y!Y3;e}QK4KWJ{@@7#O_;)ny#Eio0;D zdJNAfnrD*@Mpa8@N>4Dd*36EHV9o16_Mf7`ElPEL6;FCTYkW4VCKgq~Kv3=O%)Vye z>5W-64OmCT*}EF^{)7294bLis`JNfX{Rhm63*7NlcsYAu8_i%I#lpVp4$7RHtE#~J zb^~qQ$4YyH^1{hDj$noF6}G}LInEu#GRCnerq{BgY+zUF!3kK89V&`3`om~n2Aw~_ z)o$ZyZ2PBZ*-YhR3s3qYXTT#~)y>$3GLC_@KZJi9vp?3MUQ&+F-n`=Ye|u#P7+*iR ziiaS<5113Hxz>5ikNpzXU?HlWr~1sExpcrt;fvJd?E2=$A{T&DnA(vM$SF*qav zwMJl^LwJrNU*~2w?#T5I=8DHL9$QgUoMA1zBD)H#tOwxa%ecdyj812MuOd1liJHV) zX38a=P#jvQz+P|_=H7ZLPcwO5*SM=QJi`n8RWziI6w6iFglx=fJ9qA5r6e%|5B`mupBTW!6)mHVw25n7NWY61=1YB6 zbP(u#Dmb4(>`{@-rN*rD;q21A`54ByE#zZA_Y+0UuP3K!J@%W!>=~!H#_i1L!OWsM zoNYFqb4Kd-FL|Hc#8iPjVG?}M5imu2QuFA-Ro3CP7gEzk3C%kdCGM&NBd8r~xHCVQ z!(2Pcb>?Cn^k!`=VXV(GDi2wM9u#FK*bf_X71j92&76HtY;&1Ay!$WCSxG%;D(}^s zmDiCwtH$}#kozmmnytZ|tYi<{`ETdgM=j(X=SUFqA|ubZ3gerXJ+=+2^CXdBJo+^Q zp4&%wxu5vIP%$gof)G0DT!TwFl{wyswN-$-l_+pmH>p zySdI49${WyW=^=7-{05^?d;~koQvV?2>~A4AVzu~9P6^|nZ>x4KxYms)x{^=*HPxw zHukI!)M6tU-8%gC92lVciC?#Ky;J$SwyeSqj6xSaIx$AQIg6Y9o4XyU@)hS*8~t19 z&3SswnfXQ7e~WSU^!%Z5@ z&pt4h#<3T6rveqtSodNs{Nj}(Ilt1fv)tspJFq7QQ=yKBI~U6P_hxnn*1>jmxE+ky zY{u>cAFp6;W@TqS%&7aQD?cQbUdGdI#u(+{zKb$X(lJ|J@smjL7+2dCmyK&E)`H1d z{zsQT!ze>sVBnD#!zk8fr`gYYl_#3`!_UgW1G|eB>i-;_19)6(7ljXI&LFIf6e&{v zwcWH$-QF6hZ8L4^TO)O9B;~Db+qSK6=J0=~Po5&4^I>D{z1IGhewC|Owg0d>Q+TGb z-0-Z_Qk(O;M)Hw4>~C9Yw(0P|`+0T4@GAMO-29yJR3zhBfdCZFz0~Kna~{uNG1lQL zLpV{W~xn-?1BSIU!rPdzY}MZgx5pAC-aAkd?1(z$#7W zG*97-I;b7*8ZX{fyVK4~vwINbWcNgOS*zA6VM|(Gwm?WICPP z<03q{t8}3RuoFf3+J&59g+0oEb-XqgKy_mZDei#2an|q`>~c&zL@n* zrsDsUCl26QYhW>d@q731^j(O%Ch|RFcy;SJS4()B!hF6lG43&PjX2JdFMcYG)oV+1 zy@{#jA~odZALiL(@X{SQWw+?q&(9s{!ACA}7BbTpGXeV?N_3H(yZ!}MVm<7Eg(d6D z32KeKe~FK~!Y=+n%c(85GJ>_ZjuqI<*`12FKh0};$jSPN1+GtpJw42YXkJ}g>~uKY zyQQe!SHeI?8!Y;%g)D6|FhJ1=#6qtoBIk#ASTLGWr1giQ*%v zXfG0PqZ#GTq}>z{jI2zQ%E=U-f>gF^qMQ|g>g7PXG|{0Uk7+FSfZF}OSJVl*0G67u{Cl0=n}x8*bD27v zLdk4F&s;QrD$oUxfTrI|7-VPRt9*gCa*Nz`-d~PDD{9}v;15KR{SSi0vH@1&NV?EJ zp!BEecIHIAK_U5xzDi%fpV#^e=F|l1d%!?$YPa<$bg2fIv(XH>hzd|)rV*`|O4)KN z>l}TZl54Q*foll-FvRa{=5h^mKJmfT!eGkmR^Di%tH3UZ`?`FI)lvh zKjR{dQI*X8E*UI<4N_b_Lfs~pozH8Tu%@AI5>-AB~%9OX`L5c zr`@4`|M*?>tLs0&zYe(YcfUBl?0)^+JzPVa!OjTykY^oHN>2M_`5+vUO5$+tMSE^h zV|q13qp_YJ)xrGw4{erKPRpz{(>_p5U&GGTqlcj(ihzg61$z>aZ6Yr#Pe)U#_?#KN zkK~(F4EHbxaSJ?%ip<0)z+A+-@)wv5fvCGoN0BXo*mp3t^%J*rBKuU2Sl>ylcNW=Z zE$YZ7y3^<3WO%8n__3x=W{c&9uh$j!#w5O`7#xPyWI~7O27N`Ia*Y^r3AuJ{Ix2Eg z?K%XjYA3w7Fqlgw?8Z2FaB20=tmzi57qh$~m@?HLEzZ}T;vSdhBQ>{Zsx1do@1}+` z_rO$BS2&~ z!?uqjZXb;8EQX(dg^w9cTwu}dmyU=!Eq=hjM)ra4G6c_Xl}y)xQo&FSk%&ML3t+%AK?7R3#%3CHaRC$~6?+!e@v$DsWw*YFww3uQy4?k=IRY~p*BHpi<0XkvjCR&9QrCtK_9m3tQG0@S|(aTZO@lq+Ow6({fo_UbDX-(xs81MelI54GM zWKb8#bK>zaQ|O|b!s?bn31=X>9V=Mpd)&wwu=5IVMnb5ECm4mzaF{)fV8Bcx(wk48 zcWv(RSu>1Ce%IfeXeW7(jhuc3u~Q}1IU2spc2K2Huy5C5YkfFHJf3SQanCdIe1ray z6#6gE;N8X(HPj|@?M%$S3f7lSk3@W^biXiH)T)_^&padTgkcUCW_;Q4ceRsTy;c!qt)Ld~nHdI&1EG&oK>Rv-gs> zl$xOW>FK#O7r|FwTJY!Tu>Hq}5>)FV2CVuxIr0G_g=k{ATyPkEW4EhtAHwCmzp9@w-F&hAcq1nQ%)@Hv0!qLG8yAIbQqO|Xdf zz#~3K-$;Iazg9sLwX+Ij`WtECbqP?)48U$SwvzW1D$ou3PeO$6O|Prmkx=iN)}8O>84!4^Cv+WpPiHNk3z5qY4k$()DY;EdJbhTR4$ z3Pn%%HeGBv$an9fhT+8m>>_eGLgxMs1SORC>IG}RiyZGI?76~NiX2pk&Jnk1#5l7w`6+iP8k#E z2gw5d{}cxEL;V^Y-{By)#q}UCc0+r|{E6Y3pv_Ucs6|wr`9;^g*SsgGt6x`BwcJ!E zs>9=4V-{r|!5y)`yqx)Q@2Cjwwx?6RDFvPB=y+=8igUhnba3Q$6nFgVILpMj->6t` zW3I>q6sAwh$K@9C68Ztd(eND%TiA}e^m6eBR`EXTk_{^xg)a|avQ|~z`jL+sAPW0A zy-C*&;Y8$lh;Cw2U-+})Z|pdLTy-n^vD2#@6n z3X8}2`vvU931)GkuLmIF@8Lx~f>}BR?0W?!X^T4~Fs+b0vL6{h9L@Wea0sY&K@` zo<})hoI`Q`bVNJ8Dm|DOHk~SP8>~eMM>}PTeV47Jt+{P9ddAu5H~Nao*$Ei&=g=3f z1MY4Ro9<(k+YwRM<9<4+;x!}VE6Qp&A&zek;E{Win7l;ZHurY;Ntl(SxrPQeG*l)*6FJ22TY4BN4WxgSJvCx+q>B7*z4Py+DkGeqPH!b&BN^Z8=UqT^8e&h)Hhzz2a9qw=jcFkh3MKcQ4)nv=Km!M^;D?BKQe@GlPi znm*M$AQGj}8p;A*UYh^qXRWhfYyGeVE@F#Fa-A#S8h+U3!u-j{-^DoZHnQ9l@XOo0 z-Nf?5fNl&U3TcbAo(pQR1Vp6^IPYL`lDS|n4Tw~J5ZPU$lC%RvurqN-aUwg^_+hjj zFfMT77ol~K-*`rCagyGgj>9^{A@k@jo5x#!{$HC(hL!nD46*(-UDmhK2h`3i!p}`H z*Mp{1=7w$;uS;v?lkz3m&NS+oXdo0pm5UFT%+Sa&VsNbBdaC zs{X*cO)zrs(b{+?k#1lgGdYGFYYW*|EW1(`ZHociiR-Mv9aiB9)?7EUkj>7=Ld*gK zIgPE}L`Ldk=Dx+6xyfJCll7MdO&ZRf*h~hTf{pvY-S|di86aE+_o~6?`jgL=2L18y zy)QwaQpneRwtqbv7ulicfbouaDtOLMax-HlbrQ1XXgpI#cHyHXl`OR zUey97sC;2ZGSJD8oz8cW%(n@(%*9k%=Kn=WOzcQEYMcwn+k0@z>k~a60XMn=fgGVy^Ez5lMm&C4%B*j64gYarW%79dpR`NVnLD%p;j8lZpMIUr-55q zkgCdi7(+*}`91mkT(E=V)PZYozj9c!VQ3q~v4x4IRvAt*^AltbrHywew9haj$kFqf z%Z#GtQKCMNe$AL?&LG?D%Xz8*){}rDQXOL2!ub5A)=9GhIMGeK_gWa02ZTd-y%dxv zKY0d_!wPRxKQRWAC zCSQMvHcdmUeir&Q)}kHM2Bt(f)qqSOR|R3DPQl*#;cwFlOIgQv)&Me-QPwx~94xA! z16WguxO*QMelA#_E%B^xL7B#boNNYXi6>TRLbfe|rhS52(+qTJxX=V`#_=F~v#FPs z1)(cTgt8BA&SlWcIUrZ%;AOeUeHLNOcANXL_22OTA;MT|lG&0x>KU2OZfm^I6ML7Q zr&owK=sC6;a^{z#F*AV)1Ra@caFgzUFruELD7Uo2ik{#uT;euY1aB&7wPQDy5pA|L zC*rLOTg$n>DCYAN7mQ>0^JIKRTG(045H<%2rN!*9E~=soJR8-$a;VMCVMagDD@u(x3{~e+ z!UeGp+M2)2jp#62;8)*FCQS+Gr&5C)A~XckF9#Q?F`TmuMD!w0mPg3OD$X?H&>QSa zk5wVC-04_^Zrq{~>_<`J@EJZnGB{mNFpn}!aw|oR;3cS^K$hy|>@$;0xM)UM>BWuo z<@xcwrKK)nEpB*WAyTR*`Y^?gCARO4`5Rw*>P_^UK2(1H(1sFV5f|{{{A2zW77~pOwoZ~$JQgO1$G|+lSi?j&y-oM=9DVuiYe1oI zn||DvmZ0RHh{qa$#a=g;zz7^coc7DCDL%C>>Cr}v^;MW>Of@GG{T?+l@T#_PH?|w) zs2TJ|8*h+N-1O;)^qPJkvl^Qf(4ClTy}#(zGg(a~Q4Awr z@ZsDyc#=ol!CRm?zUdIhxdr*q#@s2~Gs_dLHlTjn!SbLqaog(5S&I`+!1exVEkN^i zs96v6`GPpmIA&&}Q~0?xm9FRr6tnY^p=5(!x|w_0KnOG%!lQ3vH6pitEOrvkpdv6D z{(lX8cOmN3#d+%WSi%7)R@cMNSN7G0=~%iZB#QOn=$Ay1c9+mwmj##H493nXd|6W| zK+I1zdjaO#Ff=cYiec7W(<{2<_u!b5#C&o)I)`OGo@iA!hQmA$6Z@LsMs2A&y#TGT z=5JA+ABc7CY;`w_fp~N>_rTN~0(Uzdm_L;bc$kBI&qS3Z6!!U8R2H7#NA0Ml&JnXQ z6WLE3L^hR(A1y)EEkf)d<+E-Y8<~EQftchFx?49<-kpW^hChlARiy85rb?oHS`t?O zJ}XG1T2ED?x+GzR{>77}8bhs#(t4{KvCJJQyAWzj6&}Dibox{=iH|Rs3ymPDDzU#$ z%V8tCR6^WN_V>t2gqPiip2gePzu{yo*HIYg0Ja~9#dPi9T+A+LxsPlEq6 z1;0)(lj*4_ik~WAwxg>v-a3KzE=#Yk_k2foBAC~Bfv?1u zX~iGrDuJo=tV<*|Y=*g?xodgIz48hPl7O9_3y*R&o~)JiR_rP)F%~gbp`(};@A-{L zs)O0V+9~>2&6*hn;%S+U*v%(mC31~mvqhB%eNe5s6%)ocQ$HP=Z zl_fhBu-+&upTG{zFpG#jg|CMEds2+UXCxc(LM!tb zEaE}JdgF_^K?)`V2@|@TN66hXp&v1i-Jgvu%xU>1-$a26ej^4SB=&?cjjEMZLu`W{ z$26kwH7K6%BPN+Ih6r=a0b(+-wl6zvDeQ-3?>iAAv5ck7jQp;%d^`p#)t9GSV|J4i zYoYl;Xh;9VzdCb7r2h$F<{RwCT&C{+HW!JRt-5eu55hCOhkbBzQr;7R+{SnO!cPtt zqD2?@MJjyRy4E6tGe^XC*1T?=L&ah%>Jrt>MW|dPljmJU0e2V-@R6vMjIl0Jy9)w^ zNY4oiW3I?evpvzPM9euFCi!Kvt92S%eb9iND{i;^(5v}JJ`AE-UK%5|MC<>yH9&q# zhjBw{v2Da8VxB6TY2qj0s`%RKWM&cv5Mz}`YbO~c@7qLh9jvY9O{NH3G2dew@(3z( zCc6+F{!83_l)L|tis}Zq^qtT~SVm2K20AZ6f`R9J$1QJ!ib`ecsTfQoca8a%C&)GX z)5}_ssAvH-#K+i~+1!593`gmwp_D=NO$7_U|9F|>;2^Sy=Jgb#hVzRUGb?H!C&1aJ zSqDr_WS)zemWcfapXo>)DZ#u6H&_b|bd=wRjk8sG-=L=@e^O^Z7(a zXYk$ysQK@J0lA&i*pcY{EFXK$Ii80)iAvOc6F>S=IOwZb@Y8}&PacZ}xhft&@xD0K zhIYbPV%Dyr#7u=c)B@{Ky)~>#tZHqTyJ2M1bCiPQNvG3Ikkv6vZ}F+U_n}W`Jr#o0uf>qgRvh zZz1;UMf5nF&rUPTqCI}eT5D+5C@~r|yDnDYI%w@(@|RE)YnTrUzS0*}rzO%xYpFSm z&(_9jd?cRzMKu10e5xpYmP@!LKaB3;Q?zp485Ni*kcYj0j5eo3oaOT5Vgfq;Ifq*Wj~@V-4-r zH11J*>IuU@IC9d@iy{fRaSs@GuPPoN%?k;wR)KovlUGcuqTu#{|~hq*x9 zDQpH=IcbG)+MKY6I&jV!@wv0~<~XtNTZo>YL^>0# z+hju`x!nTpqYs~t1-pNZ?I_B0m0LVddVEt>5P*V0Rq-va%!laG$4S5c4pjPcVp|;I z|Ii-4OT>5&zW00HilZ$=hZQm5CM(u#f*Qtsx=>n!LzLlb!r0r#W(;Zsh1sWy;1cc0 z-gXnacNga1Te4dv=quK#k1oRpR3=aBizWOYiscqHfQ_JG)yOIakRkl$Mm}fn`;w7< zFk{guct>wUK7Q^&Fq`bCgmoqcT0+Of8~pWFV!S1&3Y4Imst-OqoM&Fat!j_|iN`Cn zr%UM;6Fm~~b3M>%|4!F-4RIQlBNjh3opW%Orw2p#sWpI?e559knaJ%dwfzC)Kr6^t z@1m=em%2?7@$Mx2^+@L3WudB*TkK0_pTInzJN*2uXm)K!9is~wWEJ+UAz!tLpS2ln zjILOLIsAlGpm9!6{q|r1zL=;xc4!OM?KUyuc5Z7&{6|ZnEk7f|S2?0ipMz)11Rn4V z4`|VWH3j4#FEOM~*}@5e{Tw7~7^uxikk)GSk1>%ML^%)mXdaZ$Yja9NnaxxQ^kNwn z?G{$3C$ZoIR;4AqUY|ha+EYL2!2hday;l&8XXTV-Cs%(4NB0=s%bz$Yk+08;ZpH&F zokVBWDzf3U`2EuSc8!%%h+j3jV*Icp5#(8Kz^E>EGI!6_(b0N<0LbSdPv%@9X-+0c&E%3s7aw_`qL5f33Tk6^_vqin-e~e9asexnU_2#5safT7ON5+rD4R;d#HO7KY?6E zv5INYw4O{|qaEvdi6`nnjMExKU@Vo=;^;7i(Sfp(&#j;XdM&Y3C>FUqcFyFzlhmnnp=6y;NG7B);N= zofj9%g8jICCz_rs?K7xx9JZ%d>cFpG4%#)6DWL1@5A8XW>`EE?D0w0JYptcOM8y8m z5^)cwV=uVXXzDH7(P``k0=Gy%rybSWp*S#7E2CAU;(bzUq2JJ_pipoXF33#7pJ;eK zUM7tG!?a*C?Z|yEpjtM98vQk?q+CZ{EU%@4zm)$S0?RLgg4!)Q&`Z)opPhPOf1e5& zJvS!(L?@}Awm<>l34I`2sIW!Rqkjv`HIBb?G5a>g@S_Ibn%ZkkYQ_)HXkJFW=#ZI_ zSosE)|1+p^C*CTf#nF$`y@|8kft3w}`8}H+l0)b-#Rj+$JJPM zy?Q|1K~=82`oJ3ihbA1hPqHr5*q2}`j{eTpDGj75>vS}q$ z%Ugwt>kDsr?-NgP?<((2^`WNF$MRK;R!6I)wAy+bqdjrrT3<#@T;GkX?JoKTUU4*7 z*;lDCZ0d*dE&04WN#2Gg>sh&hZKutEhm;-WX<6qL@OD4Y&G_cZ81J>tYKv2L(V zGl;P*YXM)cjNFQt9c<>FwlA@eWaCO*CFGY2rV0 z<+>VWj7Qcq+Z|_rzczlEU6s(@-sbG=ZtPz(V0OT)09Rm-Kr0|yKqvo({&)TQ_%(GO zaz1n{cN}-Fc2#lpQjSRntWQQJ^nzSu45KWsQC=^o_VYA^EjuDLi|4T?$urP1E44=I zlhneVwx0K?#ZrHz1bQxb>r(AnNvF+fCSeD`BWY}WMjh|AbW@%uUjx;wf%2U$J(ts? z)}9&8ZUQxPMd@UpWDBz8v}Lj7vBjeAzQp!Uz9~%>3o!X%0xSFpU62WM0loA*a_%PsTVEUj|fl>b5{nGhuVg7AZcQ>c0 zlyc;8ws5vlR!FJld2s(eW+HxKxOq)m=lznpEahDCyyRgiBU2lCx_f4)c1)?8+#oq^ zO25?1odWyc!@+N54o3d{BB&=+5}@ymVC6rxT$pHLOtc z6BhU&_2jKoAHtc&Qqw3&Ww{NLLKiYKeLc4)h~Ak{?UFi29ZuKGd+#{!L2rL-+k0)a zF@RWb5{i#)jV1ac^Pqgrxzf*aKXBZ#^|akos<@N=Uj`HmDCu9z|CxW`fGYm$-P2ra zU0>YA{oHQ5GeQxSPRa%)!d^qFWG$uMu@9tRfUw+j=|$9Uo|&F1p5Li0nChH^)yeCX zJzrD0rc{Ti8%KZ19Pc7;c{NIF&3WF5Lb=K`=>Fyiw6mH}S&x9T*Pgd_%$u;=X4!Wr z9#o6dD&tVO9r|}#Ya8W%$_M*6dp_9KmRv#}ilysBcS$F4Gx7dyy5g>**U^+o#Z9!f z+Avsn_n3Vi;{EEW;EnVS@fK0Psv&g4bwfjDmv_H9Sx+>Av9jIizH5us+s{nErcz_S20v&gQgVwe_)eq+Yj*8mnlVBj=VcNsI7m&%}798`Pt(B%Dm`A9FcX zp^RwYHlmX91_k+E@bg#DE7+1g#m`zvl*%jUI^BvFv}7%i|K~;_rXGLJbKAz#8FE_H z;0Vq|?c%X_g*VO{!VYHFI_NXa>%ta(OS0LST6<+NRr$xSn134gY-Omen!U4giC@!z zUI9D&CI9yRJNy&;qTLN))Ms?p_bcx=&6V4++rGozUFoe%vrQ+Xdjd|8#H0r1(HecU zHz+!Y-VdJFp4r}|YH6*X`qC4edM3F}N`6n6T1cx+$Iw!Bg8Hv|TvgTO+8F)5(Skf+ zHPK}($p0O&kMu_BLj8Dzt*-r+J;^@Ho@nc5Yiqk;YiR#&&w{$oMEe2yT0T<$sR^Fk z3#$|%?jpu2W)?KI>XY>lxU9plHRsh%Y5`_kXYwxatnmcG(QS_xI0l2VB^o1TnSlL5 zTdhYLQAArEiTpmmN1$^}$}JZ_Ct;HP6cxX#_HFi5dwb=W@?5#A+)&P;IFm!!Z4bBK zw9T?Lu%*bY;hw7089GvL3nA-Y$L-2a&&e11O{(kvaB~jv+m5Mc)hp^fbsLH?q3Ds^ z_GaR}1=>UA6O_~vRZ(lnJmu@!U3N1LChiSpyie5%YbM>40a}83f%~^k%>`d}BwSxZ z&q^M$j?8{4S$Z2QR;uV&?S{VZs-qmVEwQh6y8M3zqz!BuaKrzB|3&|oejD6r+{@j% zUueK?|6}fO=V4_8)@rko*Zy6qLqF9h^sgI;SFOW_uBmhg6jAqiyL+d2EpKo2C%OY; zQ!l2-sX^!o`JuznOl_i$SC4YKa%c;+g8ES7E~w5=I(TM~VP&Grx+;9QP-&^;Cy$qR z6Sq}hKDQ>7mJiChT+>#YnHGoW!aO29W+uUZ^y)VNRU9iW7rI*YQIKv%?^6mhiqA52 zV2m#4Ew!b@Q*G6|YOMB=PMscF4eW9*eLJ(k+tXQ@Y*eBqy_^Z2lj(@92>x1Lx+^`B zQ*Gnzd+ooOfRanm@SYi!`AQAP6h}wLapkK0vaK3gC3Tp{yhBcbpPP+I#>J?S?nT*d zI&q9*PBq@@BdO(Q(06Dz)k5lgZ)tBXZ$FeS4tmFX1H4C3;h68a?n&{CLknY@`h)r3 zkJPleM-L+VYeGKW6tzThUOh%|Lj{|aPQ=qiC_H=>&1Q#0RS6eGee2$~vA7u*qJ2TEuE znm^6nR0NXXD|pFWbJMxBn<=_;i0J5VhDF4u=!zEKXaZL)Q>=c4xBNU5m=Df{e^ z_9|F|r-VgcxTlf!^R}vgmFTY!sh$?MQft}|a*~yL=4I@;h#hT957<+BG#cx-wHDZ- z?P>?Lq*_~zFf|(OWZ~MhPoFxk17Az9g418awIsS9PgB}N;ExWon=X?fTu6O+j6jg zs^mHospsC&FKcDBbf~r1nKWNie?mub6dvmPqB7Gv z#xZRqk_uXN`qAgmw=#)tgGFG_TZrWa^qx0UHx7V7(3E`i2a0y%sDWOj*I+cLo{Ma^ z0a(FvSXKs|P{Cy5eq_YOsC6e%JZ}YJ6iV0RGce8nQQ2Az)9(+}h#PRsE>hzi4W2Yf zXi2qDkot)Ch%N_$8FZrO;x+7oRoL=hbXCsd0`XEHFT=12REqHa(mdm$OiR*{@PEy%=b zJ~kD^)`vzkp}%9FFa_V0UyhXTNZ;u{A0uv%a@dC3>nTH+i{U2Ld4NCD?bQ^ALv!qO zu5(^-oTHPZfYMeOsAN%|*kkPz=%(_w*R{2mk4e4gol50(?58uvH_2!a`REO^61S!Y zp2gs#P0}OvA^5vGc>LztJ9?R~s-IP_`bte9@2g7GeO9fZenfAkGTtMO-merjfRBct z@YF@StX0z2Gd<+3{)e|>bnP|aT-TuU?-CeB7NW-sMEzr69^~bQSD_blDR+D%k;)Az zRdO)#H&NQlN22Ms=nbR2j+6sGcpdI{NqGK0={*iaYoZxw=1{uXvXNihrMqq?otb0l z@tQ=1r4qAM9?>r6p+S8jzk> zphz`{k}7iwUxTw(r{>fSwCp7o>ot37P&?QT8k398rvUOwZXU?MH`vNCbngFV4ncw; zV3o>){ynC9u>^5&Mt*B3{gq4TrQArj_IMclC%{^!V$HsR=)9$-R1hZdTfq-6(F`?+ zA?!{cu`L}wqs95W*A?#fA|}ee6CLO))T7^UFMXb?!6_=UO3%n1=E<{}PjgLL%lxxF za#`CJ+ji7H^4ng^FXa3Dc`bjGfAjZkd8QmB$I`u0LMqR6)FM(Gob@$es8hhY($Le@ zmmHuS9Pw}T!Grp9n>)}M*bkfF`?Hh|qpdu{5<0j1)ZFM zQgd2BcV1=?s4J|nZ)eBR$v1|M#hM@{cj&vl3jZX@C}j@f^~|C_xg_&C-qEA=59{nT z%hOX-leeNgOCwIoRjUraC!XKdo0?TOn5h;Ttog*Myq<8_Lw53-kMyXRd|V*nI?j%C zrZ?F)?eHtu*;&x$II!bbu(xt(l)j~ZZ4*0ro$e*Ux(C|O90V-Eu+yC}lkUpPoXPF5 zV79VWYsr5#vn{vn3E19#tYJJSEfEB+6U1_1a(~pTZU|U^g=`y{U? zHG(bRI;DuO+LNv3k^}#$o`Ai z6g_0w!7o43ADl`BDH|5}DeE#4J2Zxyb$~Mz!xMCd>!#ugjE#LaXr@cSBH-X=jpI*+R zoUvM*hSvP+2bVP;_)~jSJ}S}Y7J`M)>CGL<8Ci&RIB9;QvvCbfo-5`7&VvX3-dk)? zB7G>&d8U`_#7}f61oom3aiUIV?`pnM;-{8mJ?iosUUTYnvnoDoB^dlDsyglHk~{&r zpNwrf${LElcK`oiB~eg1$e$FW|cd8U!R zehrY~64Wp2ac>eh+dHVw#L}O6p3WQ*OPiL@*Pz;Qm{kepq&DH^PJ;P3fE$02Gy0JF zVF0(O6!!g!m`H!L%#;@uPM@7~@m-XpqEZ{waDSojF;9#F3A#Xs%K;+vx?%;o=R#1n zI87bl2FfoM`VFtCGtA(3bfaUZ6wg$NOh^EYzra%;;I#kX964e3pTg=aWT$--RgSO< zKHVFiT}tKiK4xuADklB;IlcLJI6J~D{!8@997wvSW zJ>@4~0WmK{bg>ls(Ti$Z2o;2Za1`d@*JpEry780ISEqiyfR*UTPx7&H|3?kRH|H@L zOshP#%rJaPYrd~7)rZ3DPZ1E5_jtq|JjVrUPG5P=7qEK&;b9W-lJq`M-T2IVXL&or ztGG)=Ckf*e%ujc5hCSF2FCR(dbf2aB^#>m6GC%PE>)`uykhf)={dMeaSMV9%sjP@C zoW%ZhB+e_%UixwO(@_sg4|mo;3&hSn%f|UD!Jjgmf)3Q(Z1R7>=cH&Hs7}{a6t{ zRv{OdUwZD=3(jK_clOm^rmb(zQ3B8B#+4ig#A22Cxt{8Nj$Mu7tV2h zYM1R;*+xeIH9NhRr&HL))9h6&KH&`axf6R8f%hB8 zZU6As>XpHQr$vo@AG;6=!scRq->@tD>Eh4DPaIC1e45vjgpVwY1#QMFtir2X&)vOC zZ)pSalSg1zzKA6epV*1#h@%SctGjjL?yuzU!JP4RR7T%&f^^QtOwL&kVL$uxncrQQ zbH0dET^NSPb?&%8)Y_Wq7bYFFHR%Sti5l1$x_*YD$g~rbr7--_RO0QY;tx=#cvxi3 zQ1bbPvd?flt(TtMSa$F<9xt4m<3%+;hY*d`O2Env<2Br8b>_1E5;iLWJLqSg~+fmha=$h)ri zl1jZ#YiKPIcvW!B8gL04iXW&fKBB8urdwws(cT5>$M@-JP9z>%%uO!HtNq5BX;{z2 z+>*^^M@}VuH{|gf&06@ZX>{B4GiOoDt;>A)Y}6=Ysh>sBv)7PpzXhLpfRgDRSfACo zZS(kP$GCq*sPPrS0`%n8F2Gm!<4pWyKUFgqyR(HAc?-+vp*exC_QwOH<7baFdvg*z zrpH)H|E`

ATdn&eCTgasHa1yEfYFPS@cn@tzbSDPnnYk6)rgekT{Th1-JRub+J&4($2gpymFas_<)7D~*^t|E`L`6~5Y5LH|GnQw1ifuT|6J^9B_NFfD zAWJJwRr4GleNIgwkuHWT*ux~wVyv%o30|SAJIwuij-ZG1DCl>RaS@^mW)CDS2 zE6#@Pji&yZg+720bh+H7-y=x;$erGZHb7-8@-mrA-K;Ny0Q^EMHr=eTEJ!th9u$B2}o!+J@l-=A1x^j!jhyCE)E8r** z^bP$X!dpq_m5(dXo^#pSj5EF)-RXgInBR#`bD*G?qNjrO*N2^vUq43vd>ib2D{RLm z`Wfa^9yM0c|5#TZA!n2qfhOm)^-;1oH#pxpv!kAv&;7|g(62No%nSEPc(_|!FHlpg z$?U`FPOl@83cv&TF}iERh^7b8H*pw7+923alfbn)>5rIHx(@Zg>8Pik@eWh7QM0qb@Rs(e}A zj832+_k#K4f#vj$7;6FE>k|Dw?@Vwq=0;v-qUsTH<@scf{a_dF<0C()2lb#fx{jQB zEe!F2uwl>R4@7QOH1^~kmN_@NR?T4e?;=7-N8Pm?igIn?{x6Vjqj9$qcDhd+%p(?K zie5%k=0c@=U@(oizaPK=Hd0Ifh)r9?^Q^%G?!eDoCL_;@5?L@^>`j@CoCQYBYtWQl z)bqwuO=@Ojg`@GB+O6-c9Q7+FYW7E%sak|-m}m8MdLQ_bx2ZX)u)t@5W%T0f71YwN z>!*3HEqZUg1I(M!R0Qv$-hT`p)O+x7g^KAYb%?fE4>5-c8R+R9f;ROMF}vij4O0w9 z1ao=at`yfNcMrc=ekIx8*X|td+^)3FXh#{xX-9WwE~f`v#*%NqFBnWe(G5_pbH;YK zgpV~pR&_5-&ih&)aF_yQ;F21z_S4dX_uT}MD1nE1haC;0i{To4-U>vxZ-wRJC=@Lt zK5f~+vJ-{0x0m8qUL<}O50`>ajHdKsv6*Sy_sAH^OINVJ#ptuE z2P3{db|np6MJeq49x|En#0Vxa_g=b&chg_>k-0Q*0i+Bta?hfa7!Ue4M_Mh7l6pu@ zrQc}6HAl_92GQ9OJhPWPW)obxl5iKVlYQ@i1GgH>6l1S(lb?78CQVClpEoEv zrqc&-9s-ym(M3>Daa{xkeL{XC&$OMfA5t3boxfJet0NKJqGV@ZVMIXd;?C*YT(aY!OkwB+;c6#*+5f9L1PsDJT*s~12eiC&)pYmT5BCRsq?@rWXcXK-};;M?EZo%Sb z{-1)X+Hqp1bHq(dDIwN+%SS`#yibeQoK6ho#AkdWlKX^(KTTA7j|kMKUecOODVmt4 zG4}Z!NJm#XRUdGxW#)RSU_qbh8*ng7D>JjPz7t9GAd9$92akp2?~mVnO%8ID*_4sw z*?G)wc%HTFQb$gvPgSBJJbgQu`ay2)O7?LP4BWg}-b38&CE)l&sXex37aRXQ*OQnc z{*KN8$xH#ADL{`%bI_Zebd;3iv=8Df3bl&Ed`%dumX2u4pPMomuQH7;o?hrTw~+m? zi&3`8wq>^0wjuU{%5L!gp^jmW5suD|ct?KcB9q>qIJ?XP@5P5 zmhNN%bpTbS{>%)yt%YETM&OT+p`LmbwptW9+e)eyX^1G_5tU3Jhx$%L6Gk1TAssLi zxS^+s&%9vnnb8idNqx?OFuKtK9uM>8{2XNM2LvFgT5$ryh6T6pf2 zsSYh9`hQOD@*E$1kn{fu9B&-nbU(YjnrP!OyQVN(ISuoof9caYNp zHx;d3VA6G1iFw)??H0Q3C*h=i)^dZxcVhx`X}+T<^SoE-pQz|mV0RmF5?XO;CNXD9 zq$^|`-0o&{O|7P1@+haV8}*%bXaf8|Bi4gTYzummY)l%?=iKW|bXv|-=QU;!Z*)Fk zR`g5f0u(XYI+ns%JwZQH6Lz=1?HEcRYamk#V8y@_|VFCY-n5Vjwrq z6jd}HE)%~GX1_|XUkTJ>P7?D^;C1&TLvDao*vjrt<@`4yUrSH#T?g{7L-YgKi05^z zz!@;CO<+|+h`fBcT2@d89|Qac(dtyrM^kzgD`9cGU?0=Xp0Ji$plp(YN14g=;7sTg zyv3(Z*9S7kyA}5Of7F_@=nAv6vop)#xONsbn-C^y59401V7B=kcGFJ8F_f5M3jI3+ zVTAYKo?pa922nR@&0AG`{}0$X{jnN}rcCx!oA}@oyrmA{Q+e?vHKl*0LUM|H$=1|< zg`LiUqV#qp12d)V&JNt%6vuAv^Dsv&|6X-Wb39eLD{Jhb=uN+{eX}iM()4WkBz(X) zv`KqX8T${E;SM?8DR9!7<|}OX2)yMjo@)qIo5IA*IrO)j*x8)b^>kt!(crBgPheO;=Ti3*9cn`X#D{_e*}g&2b?$$ z$odQH&rZ63Iub#@!k0cn2kASy2)~$!@)lj9m;C#Xk6qEXVWZdTmv}FU=_S5N&5eyn zy5P34Y8U9z%Fh#zr$_oV9#01;bAm>F;QwjKl%|m<%qBPAORV=0TNH!`EeBpx1DvHM z^^&P%4>8<^Sa8&yyz*zD09)}XrKLtp^VrMO;>EJtHpsTxcFK0!_RLnAUX8c*3e-vl zDkV^^IAh<1D*FTKyIt+U_8Ye0wp_%&6NrAZ%E#$RyZ~D?1Rmca*5nsejrvr~u7UD) zrM~c)smf`LZQR*bdP8{GPNrVm$1-ivmTSv+JIG!y$Bv)ZzG+^1E2?0**Ai3yz&e#9 zlbVa3j|3;P0Sb|C&5BgLACY;M;Wi$Dxta-UJPMui^Y~4l)^clUg0!1me8k?}!fqXr zwzAWk*xO-LRk}&7q_V`zzc~*Fu?CB<{N1q0f51G)_ zG64*HiMfLA$NQj4zt}?s{NX02_&8WeC6J~5c&7oN4KY}-heWIU$P|5@wco&9d^t!58k(OZFdG!vRplIG%Ad(d7j0VmRu#`G{H~ zK=sdKo8su3jwWLq09qHzv&V8iCh`6>bZT~kBi+R2`7}JUU<3QnDYFAiQp7j9Kr;Nu zv2xI^zpsuT)XO(8J1nnXy0z`K_*67~&TGJ>Y_P1KfRMZ+Qu_reK92jjfw*rDi1T&gh1Rf=3)30Cn!Eb|gs?k! z?BQIi0#>dYh-n+^n3)yiArfq-1su>%W^*_exA1Lg zdDhi*8C)|rGC_GEr#itb3Hv<_7)}Cc?NTiDPF_JIc*G%|FoIVeB(}jt7(7`T< zS-|R|m|A`g_ZC+9JA9cg;D`0C9aP{C;ssaIk^O=!qL*39I!BFOvIc?|$yA4$ zTKmm<@Q~(OYs{TIeH{C^k{uZc;uQxjSed7+3-0dgjBgAZq$XT)6C`T{=wn)**J39y!PGzz9lkZ{f{N;kWg z`*c)zF4i-@z+bB@c7ayeH5}k(C=^nfZi9=0%tXbInyCd4+@&Dk+PwbN;Y^>T&x{(fNOZ@9ROI*)DLA ztYR^4Mx(#k@JQlDm-JZ>ta?o3Z6w#AhY7tzfv#!p-ysym4qI!@j^YWSI=?f4N^5Cm zKi9${HDfYx4p6hzRw}P9I~?l!+_|x^V{X9)y34(5hwUFF(A&>i<`D{W?hi7nu`;Kq zF*mF(td&aO2$#v`b}+T3rP!PNt&6ygyIKuS^hc24iQMj2+}}VkopD46lbVCntuh`< zm#si!7E$AJc$%xsTtuXk@GnDPML(h@GXORQ>i*(Cpg=9TufK#PW~#6hHf9(&Uv5$0 zR-ZGQ;JN3(SKMIE5sQG6m!cZ7h}-xCe%NwzGS!`MaNclpAy2oLSNNSOb)b}Aj5gxT zNx~f|lle?Pg0-$~Z8rWe(S1KWx~)V{v%v@(dp;K-d2deJ#Q2mbE?A=Qk9tD8=A z!{D_Ehs0m(+hfr7{oul_tSRPdaMVs@<{iam)L-+O>&ap?vjiuggLF!`Vk~F+Y*pdD z(Ne6;bkHW&b8@Yw#(pca_z5pIoU>j)Z0f75@_WNYhh>A+nub1xdEAif#&5BsG>*8n z4=On=`F)R!%0gAChFB4sdyY6G3;S4&c>FY#2E%&8t=M5?6LLtEh4)5jvo)u3HC`hp z6$yL=6Qi+;@bz}l@l==I>rwo!ci4kV?BXl)7jxWqGrK!4aeq4Mj)ORBy9D%4#52M? zQsdFZuF}))NgleidnX_lX(5(T({VIKJx=;t!UTr4F z?uE%)my;DKg|PBFnJ679FvnC%v^p}+tD)4xe1OhCNh=>*&mGiP@>?b4S)k}wO(&Ss zY5ge5C5xp5W)z(g_gg>3gT@^C4X+z_g^Ct>Y&?l>{)auyC|nU28q-igm}@rT9yG(^ z78iF~Hw>5AN@^%JG*@!3J9B$$z!1M;ZWr2!$MF@>)+1>KUCq-u=bt#~qnPkLT3X2D z_;px}=kN(fh@*@))@C78K4?BOo{1r3-B*~`+lK0Y5Ag7j;%4~F&**@7DWVlADliYr zVMz|c9BxA8DlL<-i-C0(f<1E)^`%cjZRwyjgrDG&=FmU9mZ{|`6{p7ByJ+((UDoZz z7G{``SpC58)`RD3h0b7U>xXcL`?gnTWj%$rS{hE)G`xB` zCQ=Wv$oJu&_JS8%P~_GNPtC5r+Om)$_Aq|KN^UMbgx$Ck25uR$?M700VXxlbdMlMP zdl2zu6E_J(jW}V2lvSu~Ocx5l2VQ7wGWSa5zy!8)dsZ;DTL}I1eJD#*rYh5x3d<4V z{;t+(X^#2E@E5v^w}fE5m^GhF%tn-}izw97O+Si>-lxcv8dE>3ZOju3a8eJ$Qz<09 zrcb^+`*s1`VXd_l+h5LfNpqF6*_bG9w@$(Uh%t{?)1@$Bx0#H6>xZ?eNVFe>XFn|NloHL}*rtP09!p?u zc~v3S^rG<5N;qqvlq~fYs-pVvgDC7RHu3>h?TmFmTtGx$3mY}riZ%>5$OFw6_z&5N z65>qfM%TDF}{oc03`onaD)<(J3)r7%6X}!|JBg zfZpU3PSGc^1W&gDUU><=b1dijk?9d?i5tll-By&e6MIlWIKT;QX1ym~@YUPT5Gme) zjT;6h{2LZ`xU_*ie{FuYE{ccX0q@}4sMZ>z8gXPSXTKX>u|M~H7Iv~6?DofapbpY} zYcjZCC^=R=BRzI2RLm?aHg^+;%_B!^O)tk5@gQuBSHw+mL}ts;*jaA%r()z&J^rcx zv38J6A2rJvOk#jXyN;&3K7fqlrv%|<`EkY+5gY@ zgR=C09OUL_Afo^m#jmF!2YQ328A#MQlKN0M3Jn8@GkU|BUC4LkBxW?%Kp6^94K8i@p&NG$9HePUg_iT8llL!1*eKmL7LTYzc?2Jr(Z}*rHy%*TMb zmSb-APBeV-5sy;IMU`bTu|@^((qUMT7(C1xUVS>O`v5qi53z(Lh&tm?pU^>Ju*dA~ zEn?d1<`sCKRmDt1OA(yJ@%-c_WN=S;r9sp;@PXt>#aVA(zs5b3i7bB4JWkXLo*!AA}v2J1#=OB-I-QX=k|+~91iQX1-K(fGD9 z8aPM6b8GNkdG+5vxi731-S@93_1Lri|1%;E+bTvy3LM{whksgFD+ zCs~3|_{3BGB=RZFF3H4Vqge+hv43Z>%@<@QFUgAiIZ5@{dtdeADp}$ctp93m@*b+% zgL%FL(5eWS(9P*%s`R&~%z<_2zzQb80YA=9Y0Z;FVh> zh0^h5P@22+8d&@(NKD^>=rNQSdm0~cutUS}{WbBaBgrVeC~CZ+TF^u~%pBy6QX{#C zZH=uAEWw)g4E7Lv5qlf>yc6vU>_2VOY>jNax=qm(jTfd?*ftb`{u2Z!oW3VE(7cPkZqHVO0LVf=ZNR4JVOh|DbXe$^A=1w%D4S zyc#FdhwHkq^}oQC7J^#kA!b?y_wbLA!`uueyo^fa2oUBS^d>|bMT~mj{=rnsK2y`H z36j1Ygk~Kb!*jqn3enNAocGFu-6m80Nd%#stw-x`P!w$mN9&t06iA_XK<-}bm4fN#h;x$o) z+{Dja&-}m`DqXu(hq@V7OdU@FR_ROX^3;i`+foOoo=fSQ;!24~nU^9kQMgv>`qW*i zIXw}~UC*u$HfM>2?dzNy{XPd23wj-tB~9_P&(oF2@Hs>OjF&UKNdG3?rgZbu)=g79 zxNG1z|EjK>%4#`G=xKPh3+ip}K2OfnFUhNt1ZFPAB%VxspLi~DX`(wRTXLS1WvTyo zcW5a_b)kkdLf*+-`Uu7C$V9y_pR0_kg6oSbi@O6;FcVx`Tz8#`j%P}O?J0TuduFZ& z>#tx|XY$tayhx2tU6?vB^=!(pl=dkx{M|5R8eFI_&tjC>cj+C?^W=J;#0GL#+jm=I z`(RjOeU)X3p$uWq8#@m;MOUCJ(z(>}kMhM9YCA8*fJywO3tBcRz*MV6kH7+EPT%o{ zc`JAhr>;xwo%%j?il?Esu^ObgK%6Ua>T`lH&Sn>;F#q(BlqmIsiK>8(Z-=RN%~l!B z$+U7gX{k5@2Gvk=I+L#h;Cqxq@pTw{vp5v`&v}-?sI29w=ZW+*_YCo@^N8Ns-cm3F zf1=gB&3nNc3SX|SnnR6;DLslQ*@@~G?YLgZ>MgH#B>80t${)Nk=uqIupm}LFr?X`U z$Z$BFH%(}oAHi3H3j_}e?BKuM-O^RkvCAflul1u|HFYT}_T5r{Bs-JxCmIPy5*H<9 zO>UGNn!F=fOZk=hz*B&e-N^_MD$ALaKaPy92Ci1FwC*VP7k9j0H@}}$<}bQBy4E{G zoLd|kJc&&97VD6 zL}E|Ev?=i1ezP`nyp6mSy;;3uypO%Fy?>Z_aN7GF9^5tct`=;Bn2UfXE>e?-)5d83Xiv~u|K#o9je~bK);m-?XBLqS#|=Lv z@M&P0pawzxgX^ZXr!SM?X!@S%9x?y=Sdf2E@xXimNBwrXySrLBrrWj%eRYTTLrR*I zqsf<&MkSv3)9QDQ-vfUS{xdP5Wn$K(V#%jd@_HJ;6q}&sHJHXHJ-3&2E_2mn@@7Fl zKmRZOQv+|YNWQ|<}C9Bd)Kn-8{nq*s=ldhTmcLF8`b_i+|{3uPmbZOJaq$`v5EPIn7Xj0&Z0I&Z6 zzX9%|u6>UA_D<3nbAi^<8{~PAGB(*Ssa1mipL4&n{W=D`b?RXL6<>F$tltJyHpCtiYBP zbe3|Kbjr?ej<H!Zh!wg0rvyW1ojI4n5Ja9 zp6QOHy_DuvaJ}IFg3<@22AKXK{?j<^nOxhHy7F`Dmu{-dyrVsznZ(>DF@m|p)e}Z1 zY)rVG5S{oTsb)&|R0S)0#Pi(yS!)5VG#WMj-T&w4EWo1Lx-dL*&Y5KBuscw(ySuKf z*xh1dcVf4{-Hol-b?xrBcDEu(OxKzD-^0Vhy?}6H@3mKc>syjd(^dCZ-;^mRADE7P z#q`89-?TNLx3RHdwEn41W=?V^>4M;ZC8vz<7c#gTn-JmZg{HIFhuST+=eFARANF&O z9nP7qV)!^mJZauo-&wy+^-6tAh=aAe1NPuAb@D@+n%cYCFkPhX1U;|aG)w7lZwViI zeWtCqh9R#ZeOFtVi5o6|qmHfdZlhc5DZOGhT#wK~7WOIy{omAm!aW|2iX-xHUrTC6 zSI9zL0WdVKsZNLa{|0C?fEKL>>$10?xFG% z)j_G0exmV2z(7-cVC&$zp^d{UMp(j2hPMeT9acEZ99lor7hE%_exTFT+BDLbQ#V3% z`Pa(>y^B0i?(L2!TW!lI^BD6!^HQ_PoRnFNiQEgUU2PL>J#0^G`5lW~vEG@!2V|>W zt2>K5HN$lVgWs^+ST&%8={DWd3rv!!PQYnnEVF(D!y4UBOvi-EKLz9oU zjVGpY*tlE}0)Q zUuV|Llrr~bZm>+X%g)>GxgL>8&9C4gt0tyMm6!u?PhZ=Z6tL3t(6q)>!&J^R)HKnQ z$MnhgkKvTAt#%_l`VOhCWERG$163bD2jB9p@^o=magBElaCX8IN_X^j6m(2+41uel ziMt~lF$u0|E)#Zrh)3{lrh7ZVcibNZ>ed8{!&&C2&!bcK2I#><+LmC5j%m7R&Dw@K zmo{8G5KHx$&d)C7%KnqVHF~1mC0#k3xg5{!6Y)ysxn{U8xd*Uw!AMJCcQ5xG_Y8N0 zCjp=Pu&g0pvRZvncq_W3wM1!gQX8?h(2+S>6|sD|)lbPnGzUNH2WK$Ge}KO9Io<=F zVeTTX6^=C9Nox-4H%pMUyfxCg+|u9j#4^a*#J1n=b-wa6^Sgvt&2a5Rn97&x3K&xZ zV?t|($A|wH_D|U9u=MaJ5%!4k5ouwL(5s;XLkoml2%KshtXrYU34-RNlqwwb2YRcy zRyl6ktJ??J3R`Vvjd@+>{>)#Qe=|R`M?K6VEE}vpZCCB39RnTj9D%Mc?l$rb|30;v z$s^Nwo3Gju`cT6Fe7o$1NJAIHKEnw^f+5BrGA|?55N=##$fnPwts%VxQ8|GB7g3T4|s_)$IXza-E7>jo3=o$eoRLf+PG2pG5QF}W?o}nl4 zI7dR4r+x_J*fUS0=a4dSG;jS*5?zpyv_Jbx< zDlHyYU6G4;W@qt|Y&rY+bY@~+8)_69Z~R>)c4Hu zew9nmEtRfn2U?>6NQK4fM&Rj&NOd)9H48LzHA$LQS}jZoOLZpQ56xw%h15y9Ar(PS z_10)$xvwW_q&wn7@g_U~=fV5u!8hCNn?`-l4K6o<`384juqXniF9$Ja0ncUkakmas z&0uitD?orfVw%=V*4_vneunQI+|rw|FqNn@UIs(Zh5eaIopA(Ngl_a&OosERD7ck4 zdLcVAqrfA-1AjE1Oo1Mznr<*g9rg_-m-CnGN-`PF9Atbxk|X*`rX?R$h-RFe6=ahB zM;2x;d9KxDOUCj2cyb+9y7}gl)0jwxp(A+R+;j%$=s4(34`V&@H!D=5)B}W6a67e# zufo7tnP3Tj0CM^)-QF|k)%_{%W!A-35Lx@FKlkTz5fO7qw09?XXnuq3>q2FvJN@J_ zbZnHRzP$)L`WgJn3i2-d)nQoE8q6xOf(U#G(yt_3F@4C&XoOFoZ|{N?`^x?}s6DI5 z44xz-KZl%83R#)+AXe7GLNJTI<*9VnJ_WU}Ohz6K{^KRNy1r!FHj=%KAxHL+oL~#G zdHwildA{GwHA1OWo&y#38T9cY*0UW92a#l8n!rxJ4qV%45MOn{)NcUqB(gT$$xEH^ zePUf!fDh1t<7!Ris~I(cl4J!pf^&OIkH>R5VDEwj89^>N4UP4k>i;M@!H$p}?Ze-c zBdZokrT7k4=}-S)Zb;%TkTUm~=G&Yaq7R0dH9XlL@{nFQCG#Qk zqu9ev!U=F$xx_)7zHIQFg-KfJ9laGQ__dl#t)<3NG(Ulqn(rft-HSS<~f6Z$Hk&d*2pjBq%%!*+E|E!O89cp}z)RpQGfr zic=e#0n&09Xrq!;IocuH&FM^;jGWivT&O{o&qc;7qD$%$%?x4A*&KNFI)Lq(!2aB% zH|7_$%sk*@oAd4`naa?DyYD3z_nMl2B>+INA`QmG5Vwh|1g-$Tz$B3Yc# zRJ^K?&2_Ruk?f071sKIgU$X8C=d{I;e4Y0cAQE@9qmE$R$1}m6$*bttP0C5-`bzxFlT zd<44tp|pgYrb^l;_7^LQ+39(HLRZ3Mp%q!M06J05!|ITYirs$R>k3$&FW_evlcjH* z)rT8OCU-NowHAI>Iue#aPE+~nI|%KybhAhJlEBebgdM8_JRcSKD!-fyv~xbN`))7L zB)qTOV3rrk7v!sO^c6&(+#?rSiEOAct#~UsX9k!nFiY^WO&~Y_FL<_>)QdGBi1IQ= z?-+Kg8#T4fWb0S3%JacTE+K>66K!VU>?%{rZoI6xFca1J(u8oa^pd?Yt-1D8(fnvW3HUC*1zpw5L?tU8HmAC9S8{st@4% zX0l$B(G?|mo{r?BtAG}hz))&I*#-0evvg=EQ+$e}F&2@V-T_MXI@ah3dH3s}>t3OC z)+3W~AObs+>s$;{?*+)a`(QBdAtm8t@8Rx+%Tr6m^d5hAA6~?8q-Z=ysids;)zAqX ziD!_O^<6R6`xZ#aR&?MD$>3JC<5AxLlow*H3Xu_LKKnw0?8uC@5Ya_U?rc_A% z$nzpl|8}rux8Ob zCy3R(^v~9W^`;HpVNPsSeYu`o6P$jA_cDm=KE(RN;5gkwoK=jvOfoC53eS3#x*D7a z5yAv=*W=awg!Z7x)5z3Wgc(@qE?})kB45)$#WX;ZZK48po743_>N>MQ*XE_0EZy6d z*;>1}R|rqlp+kT&#G*t*aKL8VQ@ z116cO297Z$8rSPT=zcIm>a#f7SHbngzQI}Fn@N|$Ro6UgYQ}^Nf94O%XzOarYjb`} zlC`@%!Lf_`UU4jOz4SCkGOoio*1}&*tfAXt_+VJ1&!yY0?WQ}We_>c<%*9OC#sOxd z3SP|Rx~oj3Y6eH;3bC_#H}V;XL{;@ah8fQ66dX5g9c)*L9Je^;!^h@uE^;OlE4Oj( zam9NI%5!{!;3!_BE-1c~g0(A|Id+bzV;8j+?N;4({Zqpl<5=TR!z-OedqH}J6)r3; z7Pd2`hUo^rf4$Q^1>N_Y=NuM$oIQ^{%~sw1*?!s4-dWvw*-_M?cMNk3a^82vdTx4O z!&ToGjk=Fo^lthUW9fklhPP+ExQWS4=fqi}QOqa!@lb4dJl|jyjh5?pqdYxaM;+1j zrPh^}?dFQ+66VI{f6eF3c5^k$O3QHTE!$>ie>qAF*55UB&}WciwCUo4enyth)i3w5 zoIkSdiyDwEe-0sMM2^oLLUe~PQ0byDW_%p;aR)>76H znIHeEQ__=1{JE2o$YEZ3z41HpQtW@_c>U4pvkW{1-uP>7`!s% zpODtUErV(V#+yC_To3pfa4z73F0Yd_x23-w$6}ZXt zgR9S^FY>vew&9Jwxc;!VjMQFz!}pA=Pfhn7XGO;)+Y53A8?Do<&n$Y&60^ZF#OkuO zcT91aTQS<*Y) zKTGgSt#tzosFP4t*ZnDNt*?tc{k+3i(x=xgztr1ofaJaqbIrYnodrVz}t_Ej> zlnkpMo*14tJT^2VsH>@kv7Eu7zoV_}9WqglE) zZC!em%z>7>Hk)In>l*9$(ibCyYR4PYrrv?i0uKkq2KEcQ8F(Y;Y;cW`Bf*7(-UZY& z{Lp@r@`};mE3gm(`h*}dYN6;nGTn$k9QGh z$eH3UO>y06{e7csIutY}cx7;#;EKT`g55!<13Lt?(O1T6L7__Bd}NGygXvT+68LmxsrWF+j(s`}~~<p!|3sLgl?|Du-$6M-UW9ZF4GGH^-X)?{Wb4S{5l2IvfvXKgHA6w4 zr+G%X?${-3wanvb%Tmw&shzy$chc{KDH`#YD@+XT+oenNuOP8V&=XZp{SXsTqo98f>trqO7;t#75XX|$RT zqE@)<*UJyx1zh3Iv5tfGBev((Cf3H**VZ34$+6IJ!tvf=bdGlZbRLJPx3I_Ox$G?< z@AgjfymA$AwxgC^*}2#G$&uUs*Rs^y#WKqw_$TVuhn|Uwj+z}3ZMZFkYr_MVM&-+U zF@K-D&2m(TkV4agPMPW&wn=~dPR}#vPn+9(J|ik)VrEg`rY@-CkqQAY*8ruo0nGgFS(h zOq~Mq8;9tNX|IS2z^)IKqdaq*!FIiMs5vlmdwR~a=c$uZhyFdD{@&ccKH8P(`7Xnv zq8hJG5++FJwJiCzo4rZ*v+QOKiuji>-gHS8QMH6`dof^;Y)0@f3&S*Ww*PRNod1 zXJz8W4DedbKu5jvU6gltH+#~_AWw76ayD~h*p689S{`Rs%ee>W@&IAziW_Awa(1{yx;Zfjp^4x?$C zs+WR{TMQC3(!Wez>RIRN<{a$o#8l@3?sA?J-m+vFs*>?2Nw?Axe9oSdA9j^)n%SD$ zniy>l?HSDiX`c92XeNB2{&))?bF23v^9wGxJGik62`Ji)}bBgn(bF6Ee zyCKZ9y*x>tP2Q#0JstXVx2y&qvsKPV4q-fYvy!~g`=954`;@bzeUEjFrKF{XwYELV zRnXT)^VC!`Y*~1@kio_=nq`_C0XM_?$$78tFN<|bHD44ceDDS_O`J_;Hkjvrpw01`pP=Jc9y0UvzZH1SE?)Z6$=Xc!KOa+ z&U3$WXl&cfT{F96t}-vSF0|{Nsm{DEuk#vfcEj1)HOD>Co9sKJo+ioKaKka<%YbF3 zO{U_eCIPvO4%kzw==L(-d8Dqa-lw~$Ehc4Cckul~4QCMfdG3cct}{L-a>cA4NwG?y&6w(cf4ymeDAC6 zi8h06we^42@77+n5c_+3nj_u0#wEIoxQD{1dES%m)sdM@AunkJpI!v4dUv1MYxLNi zZ|!PZOY0=-ciSpwKKYH%N59c@IPk17S#wdnQ+-lX$22qSY-D_7uJDqfA)%R}Tf(%V z>82yPg+f#RFEDRvc{136Ekq;^-y832=U?-Kw1mH5>FJplt<~*j`)kJ>_hjEvVS(nX z)~Q)7b%d#Wig-b6C~eU6(AP2L4k;GaGBhnP*04m=Nt_AiN(H8={ZC#?_im!Rg#1N{ zJkfj4UC*`8@!M7ti5X`ZY^&`oVE2`>o#g@YPN}GsTT&)-`Sqt&G(=?_4wm?yhC93e#Df6%fwbzXCqkIW8KR=b>+PN z!>Shi_E?a%d13qMDda*=7S@&2cQ)iQRx*AubgWM!rkMO8x0dEzPk(t~&;xy#sC?C10q%!o^fSRv%+!&|a)kFK z=$Hf4@V2{a(Xl-a{(z*`MlQLS_oGP)oc^hT$_EZ>z{v{vvmA z491e&CH@61sq1Xzktw_HKe_hrEY* zrBQTN)CE(T7aZ{=kk3(ItM95x&;va`tDiX&4ilBwMKCk{E4!QqpM>n`!@3-U$@nBY zebSrD+ZMLhxp0cNf|-A^*Nf*(4u`&t>uAeqbO0{yN7z!#1HX8=>-t10(~Ss>oK8_Y%vcp<7|6D9i1<9toPzyINMuO`>mg|4AF!g6sG z=(mS(iRTl?!8fE4o*|v1!7@K38)fo6f=QCmv&rqJz!y-Q zyxJbRmAX>9DupfjAN_KosYr zD%=d&2?Kv$4TSp&o-7y~cMEXoi(!w*4r|MKbqBbh4wCJj&$CP=58NLt_H@3#%zI`M z|23p*p=j2uvDz?n4FjLxRU4UEu@T(OV{-l@$W0HXDpv+#}7yNXFE~nC%4W^(du^7A?FTgf*;H{p+Nq2*f z6?BR>hMA!>7^1#R18oGa$_75kw0V;~?>%e1gPD?Df!%8hkI+>r42f`^iR78@gUjCu zi@-qY98EYq*T}{e<1D|XPPLVa!UXUTC1IAz&5FN(g`zfb=LP1Ugi?Q)O5XCL>}3AM zENWcs!Y-|De2pUK|_!9a=ik zzhEOD2>HY&VnulQ&%$vtg3P)RzMJZN_km1kCVBpjV6Coka(c_9<>%hXoX1?=Xzay4 z*tS$mQrECzU8%h1Q>l55*;yR4qR^0*2(!4K>U$xLPue5(f|Wjxv_)(zhKm{8bvkT1 z4$i?dIy0Wbq0>rU=rwq6dhSwXf8+7Pk`>{F7T)9bgnRQc)nX8=S(m)Y-aOP_PRk`> zD>%lPEah{-`d^NUZGUq2HIa-y)IZN6cV&EY<^SL&>EoFL4$bc@;LPVpv=6sewujg& z+8f(9*+)C~d6U%Hwfpd34{3IDR@ZA(0b4^>M&ym!7r8d#On8s5x*>^y)dQS{gN7tS zHbXXD38^z3ORae3Wj@K<-Z|d7AhS$H@eD)eFmo>JZ`&8gAXk1E_U|&YMC~f&Ddf|t zr;DvXXXnwC*4H)+g-J{YI;Bg1!!Sax*LBve(GJvEbkB4zv~Q(s!dIWubIH};>2b7z zIB*ja270-MJ4ZYI!yD=4hydRh&ism_t_|*R??+IXqo8>$0@`bl6o4eu6$?nGG^2Eh zdW~V3eu1u%_Jg!coFHsgD;+1LRqM!~pOkNUo1k0U!DTbYGuhqVwbX zO=}A^s}O1=o9Uk}qHZIMCbp@lZKZ9aovr<=Eez(M3-WzYTMDe_O|UM0>M+%W^XgLS zN-DYzLEnhj%2288)@Zq$kVmu(PS~hMcF$ z@_`Q1O7P5_fGI0Ueg)2bGbeSSd|S@WxlID2c8yGt5A>J?{8(Lgq`QOb1qi-bjwnYd z`!8EDdo@QDS4D4t`mScYp;JI)z(swM=CqVkH!t8rNRLQW_IcU!WP2MSgt>xrrZa}4 z`sw;E`Ww2c+9x1ZzxsxeduQH{tDd8uEx{UVy>8uNJ8s|aC(^!1kG zz2Tl#u5yn2wwabK=IiFymgTl34xjUaYm3X}G&kfJ?8W0z$y2>X?-1`LIXB(O&DDQ|@35e$U^z4CQjo$k@X@~oA9Mq}`f6P{U844Z z<`8etS}id1I|H4xjh$IYy=Atyho^$Of@`Joq_e2&F>}WngPL0C-UDJP!(9gEHVv3d zKiJ-J@(v=N|KVqxq=vYVo~nPTx))WaQgt3pMbkr7P7BAuJ2*#z;cmF=OP2Rg|JVjr z-R>Ifayw<-pdJz*e%A=>FDNs<$UP=&-Yr$r~Oyw)ZUdIP$Aqc{m_pHY!>=6 zyiLTVuE`K}kWC0=pUKYO{$+U{o$M)7Xmt7OWcR>+Q|$e(i{} zFSTv44W!<2n=_Z;D&;QauH`Pl#FK~M6olz!QF!S zIDMEvbH>wF-r`GuSL1P3-7X2d%1`=^BGkEW-hMW>e1Z&wamU7oqGgIVc|AT^GuhA{R02mS7Q zvEw?J8m@ESbnHPf_=x&|;dw_?Q`NT(oIyD63L!Rk?sw8(R z4ku49YNB63C}amUoPf7@pQ^WvFDUrG`AWl*To%ki4rMkbQP*TNen~2FJ(SypBj8RV%BBgzrt<;D{YJ;>-HE)R8C7n~ZK`-l{>$Q5X_L}A$lY?GLOEp!reYHn4 z4W;?yO56G8vL9`W8ALU7)Et;VFHGdCm(bdo2F407vE{_;3~?ady1T zLezd=sq&IXzmCVUj?ee_vrI3i2J#0EuxRq@e^iZ_Akb1cCD`fB+5(@=dRFWUOd?I_ znmfncdclFxpS3EVWj&`-0J#KvX$%#~Hu(FZ|35tZM)<4)eP4V7$smou11U}1)<@k2 zUbz<3$QMvAzYnem&Ia`(vLB(~buWSzO~|@-YZx&efk_GTJ;WxogQxL^_dj^9j={ti zjXwT~E@%KosJeVZu8l7?jQ+U~eD0vu`;rQ08Bh!FU;|2p+hsCuX=aw}a@c>4z-Kv< zDXuH=iN=9SjZk-kA!r(0K0m;h6hS5pbQlg`4b$n5tfwvwC))$AP?LVyH!$|t=`l@$ zP33?1j7j{r2m0hY9xXZzrkPsm9sGPMygTvqT6P9^Vx;capLbfsdi`Q1(^jH@DzGEX z1fTI;e#?4of|0C0c$7-`lS7fvRPbWEv-o{Zu$y+(Sy&ZzGJowzp< z4kn=&$S5_~jA@*(f3e&N^oGvo_j+;erx4v;r{-d#(rE;1QHajQJlKohyyahh7DYEo zH&7uv>5SfkhhLWy=!fUm#e~=9^iB5X*>q@-7I4eF%JR9Nfqi%eH{3g44(@n_=jcKl zV&(gfAU#~ZhD0$FRR(Z2Gmx?>X!{pnhSq`>8i=g>RBhSq9<0=SqLp1dbtqcv9Vm)u zP9h!+%oypu_t=Yyy!8#9qbLZDzR0~Y!EPwA&np;tTHt9`1TAxxzPZlyD-P%CD_|C? zM&Ici&V<5VwVulSMq>Fi_;VB%a1Hk53bAi-g#(vZq&6$>V-;Q_RX@R>lw;k8u@8at zb`Awm7Ef&WBWop6`1cP)r*G&vRoLo(!FOGPh-)H~F}`EbauKKf;0fi#}%yU-&Ula!dXE&?7mEW7j(~d@Flfm&Na+>#Z-8XdIKH0i2>=T~)6%3+=EcsH=E4+`$uPs^EFEDDI@ICf9K>_3k zd(#AYsX_iMFl&~@5G3ddea+3tO*Cg`E)dII10{5u$p9C@_8kI)k&Asf1eVZ3jCug% zmJ+XiMJwE4wZEx!$XFjZ@G251TfkBsN3upB5pzHq9!D-B+0WBtKmG?Aaw44F|6|3E zB58v`XB6h1J?PqvXAN&43mQ0i`f^4`vvQ?amkf5|Ga1D+kWF8Bo;{qs0sMXkVt`KQ zm$Bd)*72T`*oB=u^)FDTm66BF?06B*S`4eJobaNYvIzF90eh!m*OkcuZ&*?Dq}!e8cIgd0v4| zf5y43#7S(-lja4BWzITlZ;|sfdj9o1O(pbSCp^;_@HzKb|6}aJAAe1rXFMLtG&G__ zKff~Lt_XYCk^9%;jf?Z{?b(ZotacYF2}YO$E~BFrTlkgiOfnxAIps6SP;NrT=kZJr zIqj#B#U*%V%0!RxNL4csV~w-WY03piNt1cX z)9lk4{*A0LXXQ&4HV-%>EBGGmr(>0yaPFsyuebXiXJ&Bxz_APxCBGqqXA1t1jL zf^;;Yi=$ZQp5RQGrH-WSX8)HVZ>!jiUPxbl^l(+U7)tTmZgkWi?){$q`NG#>+{wcK zf1uf1?5=^k=0;8;KqqSXJLQ}}5`A5Rg z5()Coro;z6n>+zL;Y3z{D7}}@b?k6gBs_|4ABD4f4N?`&Px^D_Y^>~8 zxUc>}_T$N@Rp+M({C!T4gj@J62a-9G-ycLw5P;sB3eV6%{OFe8J&V9PGL`*qhb->R z!im;LkHzzbAJ}b8mgQ5iGBONeQ_(9E*zxI{y>0wUdu&)k{>=`rM=KZ&V&Hq&%;`{A z<*y;D%AArW3KI_!R)D!wWV(>sQ%KcjPR~K^k%zZw1RC`obL5AQhkDPB?KO!5HxIg)^s)b`t^A6KHnf@=P{AZ zCHx&7AHRI%c?yZ^4TAZw9oPH8xp(vV9&Ip#b5It$P?&7?3oz;m`nfWm=ycYsE2sAl z*5)$n^U`0Me=7-}%sA{+Bdl)@-f$e88pZf0cuhu&z&oc1BSU0dY4EYGIqsd6%pB+a)74dr1S#_~1~ z$yHmB-Ce9)J*4b4YxtQR4&Vfp;tZ$o2D`Cgq3{GeLmu;RqF0g=mx+R^!YMQ#87z+O zSb(kyhjplak2JJJraz!l?txmW#d-N3Kgo`L+``H% zK#Mj+Mt5LYmEF>^t3B|)Y7@(T!$YdT%Kw7b($8mJyy1bwtS>;~NZES4rWdeX$duH@eW(WC`=voKEDMC7|9r+gGV zze?m5}> z_C0oYKX20(8LY{|wQGz9?ZH_n#QVhXRE>$d@^YGDS@T-NT?Xtze(oE9)>UR%9%fHR za)y)8cRA1t|FBv*WP1@S7zQ@FDR0z+Rhmr4N~8L*F!F&FkaSzvayb z@g_6zg1_M#*XJn({?5T9@N`b$4OagH>#OHECvy5{v0m?y*){BSE-Xt9-a84IxrQBA zJokU`2o@nB|6wZ&;YS&HlLp8_MRq?3Ng2u6eMe49=E|$^HTz?Wl?h^BxZ49H-G&Bw z!>KEZ2NlZdedfd}6OxwWKXgL_^<%{~FgA_D&pC)Mt7V<@qq%m`7tw-!9gno;;4GBj zJwBjWw{q$(a?OHhs94s=&brUy9aoyqEX)Sv0Jy&_e->%`=qlq9^V>@&4oXt6x&-jga{_+gNnrB#6X_aR$ql^A3wHDuS~4B)2d)V`+Aheq z!nj)+-$(I`O#D}wv~!Ac6^GTDiWTTh+^k2_tLWG`2BXhNsw&;+DVq=9PeWgMs-Fdz z+|e1f_Az)aF;rHSuE}U-w`^jf(;FgoFHznX&=C<>%*M!4Zn_tVKr!)H>D6bg$=#7Sh&PO0mQ#WX*(xecw1 z!;LA1Vfv!Fx%4(R(62GHH@-7;*I(9l*OZgii1AF_ybiV^kN8-<7|yW{bSvGX%R%Wy z{RPKOORtlu2GO1SgMl1UWhxZ8sUR{3*w-H${y*$fPIWah0kL>1Qr4W5 zkHTxRd2N^sy8yO{c&cS1$OB$NBShkz74>hWviy^~?V;nV2NMvQP${WH^_pZRUti&^ zN>N>1O#UUDoYGSEFPf~EGG%rnoZ%PMf#jmr2veBsxP+;pB3-UI1wWnoYsvZ@!*XY$ zsm~H~j9~TBK(DBL2bh*K9**!O-1QgzeM+AH5}mX|kSUKZ50-8M`xbz&HXJ$LgdR-9 zswJRr3nE4Tankm2iU$(W|D>iqfiASC@F`OHfn{Yg$*1p03bIg>NouQJgBa0B$uVmjB_5wXoeMk;4zy3QfD z52*5Oq`p~@^=e1ISX(sk3-tp!SVd7o_sB?LgrwIEGF&$vMS@dP;h%Zk0#J^o|%0_zcew&pUSww;FbY zukLf6Ti$(48|g&XhlX7D8M;pUsz$?Ix=vWh#KeNEdM=>|GdNR)9^w${t4yg7F2Qqt z7oD&QpL#id(+aZOu~cmP($|+yE&{KOH~lt-Js#q#XK3yD$b{G-SQ zZ}8P3OZ1icuNvEQniKcUHw5m)mT;Wv=rGDop1L-Ft9TlEByOld+$?oZtpGNwR-N;rQa50PEIf(W0?5T5PZO35REOk ze>wI!1`DFFyAQw{%T!fIeh)Ey@;kNTvE*|vkR6+ftU1X5M{x!{h>x6CnsVDO2KVa+xLN)RsGNn6F3={@C$3H_NWcg5bEbAG&#k5APjCv zdP8T^l)zOcjj@L=4lGp}&2{Z%eIDZPhmhl(oo1JGvaLzN^^b{!E__5|4^b@h+2x zYS1e>f~j17u>u{W$xQ9~&2-=mFyDVsrI97Sh?nsIUwAJvQJ7OykF4%&GMIBgQS?V6 zj^?ba^WFAISil#=eG8GJ-FU<=VFryuj~trr(7d91CvT4wuAN z&UI#J6&XxqrAKn62HOs!=pEZ}gs7?gV!| z&mnJ5-!-__FOfa6AoWF=&NN9lCC-O?sG#OAEH~e<{ezg_mO>S|339PRyurl!7i2}w zbJ~@eU>ThI-K=S(e40t-ci|sM@qPrk@|ph|S!o~t4MoeQ%S(N=k$DFm&U<{A6GX*{ zs_E)rG+QA724uR;H!^j>L0z#XA13y$3;Bx6=-K-Cc;|@MJCT#k02{UrJjNH+au+?h zn?S;hqUxh)p_;z4avYeFF1|@HMsH*;)H`(-;S5apUBGsY5{in^(m3fK>62JZOb}ip zm8VeOUg}K0h{D3LZo}{+KG9>|6`kz^(RH0laXxRTH`1F5KD{lvPb>FC?+u~zpb99M zKKK)3h#wjd`F3 z;?vM=G88@iQhttQ>I;r#64v|?A0o3Eldx6IsR{MLZb#$y(Nc8|1H*rC27T+);@oC>f7gd6?ZhEgu(l(g4$(~Z~1>l^3_Y2FCG z;m(Z4XD>~Lp&A$flkW_CU*$bvo|o?B?jGQWpVB8Y1sqLT?+DLhn0%&t?s$j$o{&8_ zi*2pW$%w%puc2NcOr=xtHItkVV^zYK74lW+EAFCGtudCRo^TQ#=x5X(TI1gpAwRj; z@1cjHGS=r6(9*f_CK~gu9kBQ><+^D8E%ay(!MM#*h2WMFq zI3ddj|5BNIt?nz_=B)3h()ECx$wd6ny+m`<$y&EUTBg&{eVTfjhZ#wI`Iy1P7!9^; zF}>|cXv7xS#}H(v3q1X^)V1ie)C*6L#FfD9pmoCrY-mcy{)Sr)mY?zG=&{C&_j~sT0b-tDG?*`&; zH^zS+hW9%k`;x961Li10ctr28PMCt0$&SsrPtWaMaw1zc`DqP2RS_*sbJWMwasL4 z<`MgRBu~=>A8-y>#iQbNskbItQ%`CthKiM>OwDTD41F*CNL_94G?g{YH9a)*K%TFn z!$VKk+W|5hgNag8$r%^*pJ7)06W02=H^4jJQ^E7goeoD$LDnOu{GGW)My6AB^;QIP zVIr2(5TB-!YpljIWLF>Hq&^nR0=-9cOsd38)?$?~75rUiVJJ)!I$@xC1sJl?$bUSM z;%c%qC-Lzo$#0o`rS#N>b4He6H@46TIgtA4QM~`@zCzro5_WtHQDA+%nmBa#FeX?P zLtYxddZGBa${fKqRJPBc$-&sG*O3n;ONP&`u!-&?ewl?{I4$R3#S@sH^%hB;f*w!7 znm?06KoNwJ6_`$xnF59NiA&>UosKtfpAPbCRNesH5w_EnTdm_zZGNl z&Lk%AsMW1iQ~e7;ryc-NbOC>*I-SxFutZn*_}9CieLdlQ=Z)gsqIsg};1&jeA4|cD zXobHc`==58KcM>bib`L7I)~@euRUEoPd!sznJM(k$E@O?8Wo>igtvb`u{fj2a!t zi^P)UJ)kP6u8uU<;C^+O9VIYrv9VMTey9UtRbjCDm3pkWMpIe$PFG!bMUxKZFj9Cf z)RT5<+G}%a{h&m02-(zEh}4@h&#fmJ!BQ|jeZ-^4OQbXbTj z`+T(W7cBNmZ1o~4C-_uvPl5)V{G@&d^R zg%izA!rN@lPbA_#CZ3QZ7=$z{EJ#MO2N$y9h1TfTMO;0Ci2en+|GVVy&XB{h!K8eg z?9yUlmlU!C*T_1ML+4o)6v9k6Sl;mOSMiOF)M-W77fj%Kb|K43O(_pL@ga9yNj_m& zR@557EZK(ON0aGtAA>h~i50ox8w;mJZcw~m_~}+Sa6y&xPFkwiapVqiVEGS`e@P%$ zeHuhad-RPH-n3kB?LOj6uFqms{S2Pv0F#fafvA2*>{Ekm^;OmGi3iu~yrD)hTpv03a@D>5hf$%CchO&q5hqQ|ZdU@bkY z@MWIQ4!`nZys|0CXm4u!{m2W=Cr`8u>ve}~-X}Aa!sjEh^S{9}KLqXZ0zAcU&hlt{ zQi+UEVfIt0<~8D-+mlI#{EPh4cs$#Ee^}O zmm~P}bJ(rp{LV?%QsG}IKrY=$E+-Nl(~%YK$6CdZS1Q71Q?hMc@ZTD);^*ZiN=!Y`Ufef%e|YBnO5R7C0ZNKcXiQOamd3YGRs~0O(jch zAbvMd1=QlTtFY)r`0gF+w16jC&gnYDYVIYob%JMHOci1U=WRVdy~yu8BnvH)vv@>S zZY{d_Fj@N$B_^S>5y0uV(Tao$(;{;DNnmLe+FuVSy?eD8JTZau>3X zIq45+i|5e}zhwefNvBsZmTNT6s@7b>t{TbeB@_P(XvUr7cQ5c=4&)>U>(UchzJ&}M zk@S9?#tX>B5~{=d@d)Q3hkbZQJ$lGX42~j~pPLNe1wPDJ_wM}7CU*D$ zCrHuhp`2|qSJq;wx+3*sS^oyqC)%P9_VNT>IZMmHv@B!iZgQr+f(ILdf3*l?*;p*} zR3Z)^{8`n6szf^N;Pxmkd}EU4EBwHpAnlfu*QkyiTt)U_BC=YXER%=d!o)TYta$3<$kp`>g9}Z5lDcPjf zbZyKhN7_JMN@vI_Q08AftzakFMqcqOEM{Y1gX#@nCDw8L6(KEH-7ZkiCoJiuTF z4t+2V3v>;pA!WktPpVQ+(NzVAxkiyUstfPYM)H>@IX%0O&u`Q{67d$kkQEw@r@w&r z-3My9A6``v@^=YvI=y5^Yw!`_FNxKB$XyEK`E0@tD3c`qN9D^x?jwR2qXHjA!1?7P z=lTJ=y&4Va!~3$3$5tj!WN=RAaFuMF;Bd}d4Es?sYhNn!EbY)360H0c(Y)30&o?rw z`Z7{8L^#W}jl?f*^-!|A0bQ|AI z=I4r?&||Zo;QQP~?_5TcD>kG*=E2t;h)D5Uz#E|usVad9QeY2s{R-!GJP~*LbgpA>@4&qOhg3F8E zWqG1JfPB|TdT$odTQix=-V}1^`-thM^8H$((kR~VAV|&rXqeo*^97>6O6d3>Nb6c+ znQ7?subiS#yskLx!!S-n%PhZd5OyvI|9BCecs8U&VQ%b#?&*z|+C-JGHE%Wtzg$bM zWfN z1`e@kX`hrVJ&;C7vba+8pmUz1p=!geS&houV{GpuJp7Mna2s!0k0^XO{eya+kIti8 zXq7HhURq-%p4wdA(!tt=;So#3u%+>& zwiAE0<+(?aDH%-0z9*P>wfZu8W)A+&KNnY#crxr3 z`f|$%X-wp`5gYCx@=!1kKk)-PP#?OE2ebfLKa7kHB>v1sJ}(Eha4fdsHIliRlh_3B zPT>Qcgx~&%TD~2xF*|-$DLxgnK^df`EY_|A^3s!7<^-Nb8RSb@k$s$iL3o9^m>P2s z2G+{-UB?o;)g?R9hOdUf$hv{MtmY{e^WI8@IUYYFmFPf0K+or{E4izl41k{;u^n&Y z2m0zh_?J*Tt`JahKG0IrIFnIKVcV_tQ<-UiC0-(Y6v~N<(J`swC2@l|9tmrX))^>v zh1)Y&d@gJP%O{gto`zN^gMTm&FZ2}|nrX;zP5h^8JX=?ELP6>e$`tI;RHmnp(;3YZ zKc=TC7H{ed8Z-#+?YZUUvEzK83(@$s8rqnqLx58Uicojb%Pi$ETtNfM-PwC~_$(5>L=>y@KY{GRXU?)4`<%e*hzLV#B$$Ne!W3!9A zPApQdWN~`ooh_oyw~+5!gJ+mZ0c`ZEcfqW=BY9aZY1Jnsuv5%|CEBwTUMBuMTM7kf4kA1wyBanJga2h{F z9(M6Qikyr@iUuP?W69Mh$m`o^Nm^UCvJy@B=F_68qekIHxuCxhZ?9Ctqh1jnYFj#-6 zitFh(2~}IT!g%r=ZOFTqC(6vuo8}}cH{!J%AudypO)GfrT}0O7S)1(mWDX)dBh@Vf zHEu69=^dT7(~!O4ph`xfwI-lrSNV<*|6V{gzY-ZLGrMw;X>j3xOL*mZxQ-Gz=H!gV zu@i%k>-xm^YI3wD{xt>!qQZ?*h}9X&37v+9KaNLiCR$vBemKH@-oStGP@iCa6YH=G z89a=wKg*u%<>N5_KZ~s0AcJ@rH1rEHG6qm{Pm#Gz*xbRaV=1Iv04cVaGccD3w*pVl zBx}vb;kR^U{Y&$l#dwaYWVFhHY^slxC|v+!*}rB)z@4!5Yk8u1$W9wjz03*a%|Mi7R81Y3r*OCru>G|?Gs9ME!tm+9qLW& zx*N%y&exS#_a0n-Gd6q}a->L8PxeO9mt*;zd+5<;cp`@$9mJ+O0MOLL5TCq94+BCHG19s;$tFj(Rd&()Yp$9)_lY^LS`R;_GP%x%T)jM%L!~R=82ge! zWO*LjF_TF19J^;jhrP!hD3&^zPcNU@@liBnnp+@1+)u^d-# z#apyumqYl;8?tMk@vD?f+9A&ML9E?2R$({mwiWw-6|1Kp@z3KK+#|=cA?ws7WLdD; zS+V~{G|)`+<_JFL@>j}C#lu*ug4fqu!_@)A*dqLo&~-bd0@a?{<dXB`q5W3z(@l6Eld$en zvb>P(ypzJfy&k<3$5Zy;_qTF|8`!W*Tv^E$DjmkFCMlBsBOT{EHRD7ay@ve!PNA^qmI%XUFf{h;83Z zrbCH~lkpRBsU7&WH}GzmW6e{|!Qx&b-~JTe;w?}7nJ2i-^WRkEA-{B#XVa)JVI$tF z@)JwvQvc#^gNTW;b0+JsW-oZ6|Fd)!U{aM|1E0Bbr#D%arD5srSh_(%Lg@wpL9i)7 zP(fM*0TEE7B&EAUI+pJ4USf0R)_lJ+|L>V+VRvTkz3+Rv-gA<{`avlFH*Cbe;gzFs zo*xL72C~C72(PhJklHB zY8_A5&7DVr_5NYKJ`9X^MU!;py(zpVpOjnZILch!r}X`~3#LWN=#Me}2t7ATM_A3o!Bk z{*zwq5BOWoOWuQ?g6vsNRAsU1O+5c2UY|qb<9XI!Q1)t8HH$kpg?EzRxKH4<-pJdE z$n2a%2dkkmKZLtvKE@m@tshx|aL8v!>sh?UvWpqOVIC6iP?#b_HaU@AC5U9iVt2Mf zDt5ynk(u)jWLj}DkRJABva%TX{}I>iU~LCz7)7E2M;BL?Vvi`r9E=G zD3-zlIPWR7&~@P>iPDzgo<;brJ=Wmo{Cvmra+0I+a%Dy2dv!j~ft-GVCOnK3dxz{! z;F+cI+?kIJ#FrqCFY>9xz;D4Ba^C1Q`mHs*SdLh)X49Z&pwVh`V=}2me^}Zx; z=nYFBfl@Bk;{xzJV5KWGPz9RE z2Pf48YR!-{_0S{9?EQ8)JE|hv-msUaK=%>wkTW`Ofya7Y|52+i(-Br-?F|Lza<1(z z_Q+FgXwH5?O}E(p6X?ecuB)Qy>wx{jVE3ai-N@O{jy$g#bkc$+%UUE3A(M~qA!kd5 zGLlK8w5dv3v<%Jc0~VBf~mz2K!GQbbO^4hv@t znuPUuVV)=FWP0=TkD)%9uG|c$)nf-SoXd^pIypn<2FH=$wHEx+md{<}*dKx)i#v-C zmw+X97nr;OQVLhfDdL>u#xKDwOW>A`Xt0gp3fFDGYCG89jU8|ntc!j;1!S`5ztEYL zv_)&zhNAO|hW!!E?^)1_9eQqr1wI_VXau@MqWt;bifXK?Gv412{%r*(M1z-1 z?20Z4v>oxK1^cLOJKhQAKqs}J^z06RI)cai6&0mV%4bPoRf6F!x*{cBk5dGP)t z*2zr%I*Xi-<0-|UMd{*jgC{>`brpbjWv~^5R>zu@O{?1b<6rkt0NoL?kXpPZs1h-9Dd z;jHI;GnQ{A@gsimAvobYoOTDuCPRapprt8z4M(8kRKEQZoZJT5H=sF@q9Vz2b5F71 zGq~;*aEjzF7Z$Yi#}FLZkwB05w;Gzc73*+<<2J~+)w==cB6iknRIEzC93oMdE^;xn~q`ErERP3$)}Md=6;T&wC!A$jA)nxGeW8 z0H4M4$t!4V5BCv&>H*k&2ko8*rw_ngi24l4x0L034z83w01?2k9GDmdq^t3}8n#jH zb6pCUKF6xIA~k=-!x5>v9Qu8S9C!~6TxMq?xl>rP^sXoYP3c^53YysnO-_b}7lkc_ zZD^Ub(DyHJ;wWt0zme4!p(J{=vb#KJlXLLG!tiT8&)5ldFU5Y8`l?}EwU@Q$2V(j8 zwg>LZ;Mv=t%VX?Ms+Dd*8Ta5x6M78tX(k+a4!NcRW6_+su_=ZEy(-AFBH+3?6jd9o zA4FzL?bSNgcbGAOQRlX&Do64RQypJR7EtxyY84EdO{+d(jjyOJUbg1aRhw% zd0HCx-N%}Cu(D&UOXkRUcs~mHTM)Sr&%d!y)hnKUf_+>7jym-rIiRmPP<(0bFQ=@_ z!C_5#r#e(5=ZXaz&-ihp4XXUVmJ@qds7fNC{owP~Xb7n;FUkKEx#J_`mCSRx6@G>t zIKKjho4~u&&$-z}O?bL0_fLRIr7lgwdMg57^g+@JS2W=+8Q@!Fm*@>2lqdeoUHhOv5xp<6ZdJDE`I|shwd8Whm7zyWPtu3IH zR#-xffPh$H2}qXg?4tq{^da_ISF~hzR#S^lCAL!fVPhTKrufI;mr)l~u_ZTLMWFqU{u z4t8CTy_ZDFK8G8ZpyhVMx6;q#KF{0)=S)MNAH#aN!uzL?G*ToLdg)k1G%N8c&P%$#G-PE`wdZDUG8^O_@W}+5f$)9{fNML~I)RT9T_M`ejkGBo zrppo7Cu72rx+?38MJK6Hlvw%F%VaBjxed;|jVws#jww9jt4J7}l{@J{5}5(_SY4Iwyt0+hwVb3mEVtW+jE zNzKGFWP#4}Zu2?|)c!_B?MJE~05j4_L~ykg8E}z3%Ngv8Jn<-yTMixV0@hF2hgcbJ zfM5iapAGtxJ|!jjKRftPc~4f53%Cha7`zh+G^N+t3i3Bgi3PQR>ip;enTC0b-9HV> zdFku)8tB@A_XBWujuix1??W(}%O;op5k5k{j)W+9a% zzxs|H{Ks!s!1uGTJ`rzp6Oez&JzcC+D(h}?rRXuC>;O_;=4zeh4u60pv6}uwJ|5#) z4y1VslJy;svsgtL=&=%pb1;6MRf&ha72I54?=mYhnZK{_4e`dV z0-@{RI~`dpR`zS&6=^Q`-T~iFXXj7BmP*b0Ht;O)NeD|^(G-dN7RU1vSYK7>z5?&W zgFCTBW1-%X$erBKVL^5x-_wXzh_*C%UNkHHfE|B<9rYzPM8)uToLE!Gps9Q0xbnbD z@xZ~!{WuWE|90%KldSnBd)N(K-30Qor{}Dy5U^_n{Y%Cu2Xqw8)s=x!9iAewv3lqM zAJmi&xaVPwCUDolPCS2A=X-LZd?@Sa&9`M*VRK|$S7@&`{2}$BAF&%Zc+Z3a5?Omv z*r)ygJT&BcJ=sGa?opE6Nl&a+cp`nM&RK*%{Uy4l9{OQ4_y3&Lw1+37p#6M&*FpEF zN7$@lflGEodoW}8~$bnACZ;291+}H`$uL2Q?_ne1TZ@{nDS*J+e5S%1dLjeB21SC$f zUXk3=<7)vcIRM=*#HJa|YSyreRjm64*QB6{vVfx06pCcO&K3XiogY}OVe-lk_lVUZRPGA%O%d*%i}z}WCA9c322$%W(oA^w z0T74)#}4i(5jHQ>Ecq9e-}1vrWq8#D`vww6V_gY6zbCZa5xVY%e38CwF-Q-wHp)WZ z?V#>DtgAJVpK-*0<`UWdmhZRW(>z!Qjp2}nTqhNio$)N&^HZ0*#PgDRYUxNNejP2T zS>qw7WEYr|999O}#*IJs8a)1mY+MHn_d{3vp`$BMmqe9kV26&!nw|mvB+e)lZiH*P zgZNb0*roV(5{Z#sRw_^m@)QO56y#Hd{fiA2fsV5w;iV_L~w7B`2_v*lRr8*a4__0J`UFH~+zF6;g8-ob@-~7(vEo7P@aEe6j|f7CkO@u4L<)LbLhUg%9k#02?`= zC+RyBjcm=wnq}=nh^36DSJ5bBrr3j3!k%79WMEBbs|*xX0?1oP@+9yhwx&d;Lg=p& zd|nfplKyF8CrLcxJ(Bzm>wE|`iMM2h3UbFH;PVyFf6dNsK^Z5Zt@B8a$KXZkD1`qd zp0)?B-@wl2!qF3vLfheYiPcAOe;;%sJ;bELrF5E;x&pCc3-Wx4waB*uVEQ)SaYHo) zS$lcDA-h$I~~2S1(Zl>6p?HKB|ZnU7DTV5AR2E zhB44#8t`3=y}6E6CjhY@kq$+}9=7B@S3!4IS%Jp0_OOf3p~?x!pZ8pC5&4v}DNfcI zfXZ{judVo7ddt-b%Z}naPhgxqjGabE`3B(X1r%{9dwPkNHm{Fj|8u_M@7F7@Fr$!nB{%Zfuc-MDfvaBdC$D)8L~NZ8K6p*(cflE1_%@^aTG=&=;{?7`ED z<6|WAdd6NQGEtH)AG3k_di2{NUXOU!gvwHQNmk-2a<~b1lM0kv(5qO~g?L_fR+pQV zRSeT+d9e6BkrlC~rNiHM$j#+cp?%M_BAX=ggQusxq!bttOeyMS9t1Uu)Yj^ zB|Q-z0L@C=U$R|6XzC<9{SdAYJy3}IJmUKS*5wW3Cl7M>EL1-OPXCR29Ot`2JsOx1 z85zxrb0FnaDEJmMlN|{o)|vF%yT^0iLl5te(9$Pq39@-EE07G|GA!LY&_e;fuVWSF z0IJ2gx&Sz62v%#cuT-ey8IV%o9f3<#K1)ZUONUQ`Youq`|6r7hmAvJ<;vq%xl1_ob zy$|>%^VaCvQxbetf?smOA$g&Ll4zE4?D0N)E|$hsbYd<(HQ_wzhqRR|@AK^U{Cx?} zTp}bI{85W_%3W+|>ziRN^|DgY1>ytTXI**0NdaIG3sfX-B6*pW-0vE=&jy?*;fLb= z{Qm|Ge-()k>>)PF@aAUYxM$QKiHP6t@Jj( zgyi{OUNn_=B-3~R?tX!O%nmlBJCs1b2=}SUT4aVwY5s2j_8P-W1%Y#6tXt`$+W`J? za8)@lERl#zb`lNmhtMrzA4+swdQ8Uh3LrfME3#L~1d8AJ2pDBR1%kU6JlR*s7O72B z{@)%+2Sz&9O>N}CN8rbgtoS`#-6T?QKX|#xkI>Dp#MB0btIF2$9{t+E*jA+Acl>OI z9;Ft;!zwbt+eYlPsnF?B?w$dUNVZU7!|Sjgc7J?X<)5t>SYing*Y>4&_V=NxBsYoNOMXsG|qIhSmva8eK%A^8UJ zf+bri^3Q?1kkf~wh`Dw|28e}Ff)$B&6q_oFJ;^CV@sxdhCU`3Z^mFmIV96eqni3)N zphHgrCCN#j<^F}ic5&7xxE0Hs9v;A@I?}Q*@3^6#2!3)x#r@Ik?SVr{b|f*4eC)Iy zzgh5vbccLHuAvMvs}XmR$cy+Se%=x7UJZPugUg3dw#4Z2qpb>X4~g{`Wj{T!HOJv? zeH6w|E}mBc%`u*+`*iY39l@K(^lDINd8k&R0n!I|C)j$#?j-x3$djb^>Pu)y>T@KY zEBQImi)DFL2RH4Zb%8;4R^#J;iBFYewRy3iZi1WT;N=o4%*$tze^2DkITi%|WF@O9!niLANFRnPhC1y_ic ze})7}1u8zCF7;tmfmi@4eFV*l^vi-D#QrJFPkC_o0s9j_Fq5aH@u|cX5AcltS;G=N zmP%FWX(&0cYskM{!2SsLIsz?kLLy#ZN0Ntm&FXIO9O_D*l^v1DCwD#fk&m=>p%p3pApEy-15n;6dtTGehx6samYJ2KX$`-dcw( zQK?(V2|Y!#PvL;P@OINMe%d10TC;!gDGl5Knr zj3kd7fo`}8b-!fSQaPZ5wSTdJdXuA*lfB8T(GPbNbMVpA8a`XQwbo(zzO0jIc=n#o;OYiDaU?r9J zq{rt9@Ol=?dm7f~QSj_F-kXPRl&J^T!RH<8UQ&g3o^Oh!ew4d0eF=z&w3Gabq#I=_|&cT)542pnGmyU)3&MAvTcjUcoX1m?Yv>d`@=jYc0>pCK@GkcPaI6T=)d8<4)XEh)1769qEBD*-U~k6 z$PN~Q!)rW$e;5`L*n{+sp7zA9~m^6>~I-8$MfApD6~9u zU!DI8aedyflzfB4d(GX`Sxbl?>FM_Xj5@-+B^p~eRYMj?)I+6)=@NT735>H?p@Yv~ z@y=7Oje$m9vC`}8`VQaO5~dc3H9bbgNG*og2xr)tbWWBk%ERnaa%^k}HI* z0A729efdu4T;b82(0Unu6A3Mv>@64&ZQubia?cF3fyB!9ai@E%S7kMs@aGnEs`M-u zUtTne3rM{JyBbog1p5(fBwfv~vVX~*%bHf=LrPVxL=r_iN)|%0f+u)tJg_c>yf4jt zoMDM5c7*J!29i>;S7M=x7imKhUSl=luir+lNlrqdQTM{ME|`b{Ub3IJNIy5Qm;93+ z#=g|fh=a&U{ILP2`cJ_W7oJzhy zGOhno5ix5E3xv@tX1sy|3&A-UM>txiQOJWW?Zba^T09_2*`TVv9Khb zBpGS3E99w_kUdS=b#|_ed@o`Fm8kcGN*nXi%?$<`AH6z8sXC`-ERN`6pga&!VF^?;XPB7vt# zoKK=OXSv5^_WJ}|xj3{Wd4UZ6J^*AMgA1v=5IZpr+RDS7BsZtATd8r00Gc9qg!WTe zyL5aNjlx(jup0@kWU7apw1^2)ekr6?e^w}dv&7WJB9z#RoL3gAO@SV7az}}i=7UxW zLnY3zB#PnLCHPycU5h9EuR^5|?@8T{^cs+yj>MDCfX!XpN36KJ>~0^QoZ(;Tk1-F4 zI-O|RcX$)u5-s@?FJvMWv{EB28T=i{m&fc)s+w*>bvk^1hWp+JQ?L2#->~dX20GVy z?=4a$2P-NLjyn)L{*L;Q{zx0C!Rt(C8{8KAMtO+9+Wt)$gf23m&Utdl}aC&1ME*CwVT5K zN*{!I>}@R^FZrQlIBPAkeHGGuBYTkS(o5czIV)0KnasZ@S&PgAITw~)674t%{G>8c zEQuRo&OF4r1lqa#e{NPfuKw`C5fsUGoD_nfBh+AasM zD#|t4kW=?rO}GF58)??V>JS&HCTsu)-|98p-_n<6#@q0 zm&%-mT0lUcQW4BaUA@FQ-mnr6*GpfEK}e~b>@o@5+KHjxWt~sJ#dTIEH3?GZ{1k}C z@D$OiURIF>?nB@}`jyCjb8<3N{I}dZwFERMvofN1Z#Po^A`sgj#{WtvVI@|@vT)w# zUnt@LSBV5T0mhGnDb5EUrvXQ?Q+3uTkp$89QcHac8M%`+slco#P?t&~$@T>3R-c#8 z?}vui5*#@c{OZsuPFA;L+Fg6PxJKCVQ8?kX*J_D8ky_Te*eT~ZwNryQLkH^q#{lJc z*x)&Vqy=n!*w(Sg$o^!ng>$R2chORf ziSCU<&Ypwb&jG0iKu@as?;(RyxlVH0|C0<0kSmfES-`z_bH#kP#)ka8d<$?=Cx*eadXFCdkHtVJ&6jZx=d8@Ij?z&3{z|W8ZPvBoSv|ox0bO|)qQ7SDLu+;ZcR=VnXdw?={g~){ zHRz`er{3!Elxj?t_?+{(muz*FJ+^Md)PCaha52_2m9vIFb9G&6H6?%67^>`sEOGH~ z2_Sch6DyxWflRLj>T*hGH)q#c(T`&R_(+8-Kcqrfs)X|cfgZdnlPO$?UYY~W*TGjU zIDgiP^MMW7+gVQKl&2rR51LCuA`V7I*X13J*j)qiZ8{jZ$l7P%R~Mxl#ZY!zh<@Rb z%!GSk)#NPWX-FC?Yna4o27H7X@f=*3h?X8fSO_BQ((R0d^ z5ZTcVI+(+05b5aI1sojU_Z8@wy!3G}=;pDMouo69vM7|ej=$uTMkl<^+3cn>@^=7| zVmtS*#k>8`w!_ggQ-RbAaCZ}))95VP53Mth6(k^m^F!zJ$nVF~UuO{bnHGlgKTyG8 zQ#^r%lbENnOoEf?c3`bGjKN-pz$(crt_u3-=ngPQH++XUoA3z1d zLFKqs&INqK$-|1!hL=6x;(X#eItav}uk*qK%qMQ@B9pMO0wr_mS6g zcvm7UjnVe!z(s5FfV_a+0JRnp?s$x=VP;TcDev_DCTj}@@MRkZ^LyIzoNl2f#xo(Q?Y)&Vs)p$ z=}@SvHSm87Ee+;LqtSAcSao-s^oiSxNV8>2(qT#^Cr0;H1IB+jqo=n~Q zXY9Bj`L5CY{w2EXEZ5Wpnq}dSj=-iHy0$j&q`~9Ik&E}>!WcL}{N3_Evo5=;hBTc7 zK3DOq;(SxiwRAw@t^~h%nZPpzsQio0nS^Z22@Y%V)XqeQCvp0#4&8KR*1-X^Z*5>H z=Y&6nJMG}<9(G!9=<+{kunUrHHZnO4&iW8Zejv>EC$T|)M63MO7`H#bq&>GTW5|Hagw}h@?SvZkXj&Z~=)0r#w2wU$S zy73{hsUNbaJzD4@>m1J>(%_3)R5(B9Y@FY|0&aSZEXdEvJ|7*jYGBzaU@`$17s3)) zz-hA}9W^_n4S#~C9-@;kAPsASw=+E9L$qxieJFO&FTA?_OK`W2v;5ELGFQP)6*Zj- zX49K)8?sY+8!m%ZOF(svprr(OG6Knd0Qy=+RkdWwVvu0%z|$tEBN|CKjh+i-$%bA+ zawmpl2Jj|&JIxLCu^j}%E5Jcpw7>V3t-lEr9V)@F<#4d2c zN66o$V7Mgb3-3cUo#5Px;OI|kIOMct8tWej?zdtaEW~n~1GH+>$>kn>w`w9?rP}%k z=gr^J;bJQGRGRe@ny3!aZvb?35-RSGEp?dFm+d&qpO5Ya-R;Yu%Z8kA^w3}62)S&T z{ulx`DywV*+?GQjauTf~`ga`9xJ+lwo3@?yyL1IDVoyS&Zo|@S#)<8o^i60_AEANR zB-4>7=XvrpPEKBgb5?W0xwd^iy|`bpuR7dsIQIQzPBqVgdn0URLIvp4UKmTppr`F| zba4>ryb`&QY$eg%=N?@`MxhVlLVwalSvteEW&(F5x_I2SzM>yR3wqiaNM@egytXthO@F0$_vLqHNx44&Se)Jebof#K<8R#F4uGC zF14ehgVKpJuJ?fXDLBY$AH@y|VY!Szdi)4q9pTi%b6aux1Yf1!U?ckyp4t+wXooE7 z4F0F0sVanIhQeR;63mNaIgX4<#M%q6le2VSh=n>{FcoD4`Mv>koVY`mhMM%Bt4v?= z$Mk1v2HrlVDn-toPNyztg$60M{hwZx@dz`C1d;NPOPWs<@*LsS1x_Ec^Cq{i3{eATO$nCyl zS3Spz&=LCm%`rdY=@qR`<~bwX$O(-WVCG5zYhh@x-RYRFUUmNNn#t_)a_TGSaUhd1 z+R+=T67xWI+wzCnn)#T%-C4`8_0jD5L4C9FgZYN8R|m|&W?lMQyQ~jF7j4ay=FDn{ zaa87n^g8G<2FY=p^C!E|PTkSc{h2;di+(nPtuu75%8Tag2i47nr$+$8lThbqPCs`+ zuI`{O@*w+V@^saqfZJHCBk+_i(QzajXPMukr^-OPKVsKE!_FCn1oqg5hECB5a5A_n zPbar;=`sE_Gd7ZqN%Uy`of#XcMoId0U8fkXAbpn_(kG@5eVKC5nYcXtJN8<6u-@t- zsY@fZp3%K22AMn$Ykp{0Dt`wR4Trw=a?L>c@7y!<(YrmT=`fEQZOtNdT7PRcf*Zy% z8%8tJm;|#Job|T0nw^MOScm}U-1?pRB%`_c(wu4)!G14n|4~`uD5H*1C#$>E$Err*@glXFI-JQ6 z&$!bv^vMf6l!Br4^s73{#GJD9J95LPUm;yyhdxF--Gg4bq4zh#zXmXGLFX)uuIVk1 zhZBI}$3|VFrcoz652Fa($eO`lQFO!@f(}@V<+c>;mXlE0987o~Mq)iN#2x@`yL66o)Pd46|!;nx>^gK_s_SvdBt~jfCo_ZVl zdU>;Xesa}uR#$J+U5k0<_6N3Ap?cOE;}2ccehqZXnwr@rQ_K7+@TE4(7-Ag=4Zylz zL3iZe?LC+ekW0<({KvV+Iof$$UFfK(T(AuYWwR2^*2WwCxV}lBpug4HXj_8Cg9iii z0;d9_gQK-%Jv;cwj@*~J{vp&BAHveiMJIvF_OIxDW+@94Mft$K8e4TL{ahNrryiy< z%~W-!9s63br!Tr!ut#8*uEbLkY<&nlSz9l zm}Z<>T!Y2;HQ(-yt?>*?PB~+kK1$1_ z9SS}Ob`5q9E)Jg1zBAqSIj&g|onqI-nb}@Or$)T>ed>Q1**!KrZdLZkxO>ri{j1%D z)w=d^);Yab@aL?Znf0=E2JUIEjK*{T3eh(*(Wq=pFw;X%l%vjT-p-)}g&f!HcZ6kTFdADzGqfc*b`bJu*XCB{f~2Z2o5Tz-EcDzp!sq20KnW zBGm%C+NiVD?do{-l4FkY+*TwfF~eSC9!)&as$$qvcdrq1kFWZeZ z^wM`RYhx(gD7%qd1OEhC zYPXDlt&n>{l;JI49ae#guJgUd3T zXEhG4(XX37g(jk9CWJn*=9&A)}{m@;*{jKwmay9gw+0d4lMN3)9I!=(RgS4V_vbk*c7FgBc1sp`5i5kOZG?h0m@S)pM%bw zN)vluJc?SOZ9ue?={25dnb2Uv;KtymTD1NrQe`N1M+!3!rkHol-1NBp7~8TwHaVWG zy_WK+(q6es=dA^Jk3HzCHVDh>XCr)IA1YUCY$=eu@?#QhN(%l z?aV>tUZ0q^jAcOjmQm2$Y}R5%Ty89)<@jWYL>G43iqh%X&3uS^Oo-?R)tn@Xl4Vu5 zrkTaeE6nw%Y24L+V~X2Mtv-9tuC>(uLa&X}D;XEiu^pLnkqADoGCd^#C7#5JozC2m z`}!c=u5Z$6Xf|zbFnjPq;6|WT@ItVrHeIWxeG&XIkT*~*&`M)Ao!ZA&GrE3k-NWIj`hDYL>sw-{ zxtO|p3k$rYd7d7yHRuNW*vv*>x%|Y??Dj&+6~)W!j7ViZowcSA2l@~Cj%5}@7BS=3 z^aM*b^Oz%zv-+2MydI_3)8{gurxOs!%~YV$$i7s|%eqo5Kepou=2C8^w^Ua;7w({A z%W8Y79ez_(M;S+Hhu=}i@rmQUqmw!v-p{M{aExR&TMYi{EWEEAwi94Xdbw@D%aL4% zR4WCDO4Y|p%4^?j&&~v+()4GYPam6&$kx{QhS`W+ZzXP%N*Ch|*tnaFHcUS`uCLWM z>z8$xQHZHRY3RAG`UiR|eI&16^?&rEdQsyOW2&*%IAdIcZe|%-ukj!+}s^ z6{czYYfds3n}5^Yx{7%L%~;eZ$ZVfq;kbNeWxU6DGstwg<=9DOc~!)M$!}ycY({o0 zs3FXc`i40`<&B_zS5ISR$qoIG-e1qqMrlc!Pm9!QYjd?2{iN%3oizxF=!Zu716H;EV?;f?s*zrgpv`;oV}w-G=4JO`N^n8nn# zj~rzkwH>7#E0{8Km-u2^G=gE3C-N(O_v6X9l%resZD!W|Y@MRR^;0m}Pc5RJr`u^JUAYe``>=~TDW#MbOeyI}$H5oGN`~SK<|Lwi zljz@%blJ3P?t{NpA`u+3)Ys0^?);v`o)?~?-m%`Cz8Ag`{)PT({$aj_-k@iV=LgRW&k|1` z&t-RYcT-nOXD9WhV+|T4nh807+LMWjOE1ZPu(Z43#dZRkCz!DL0`56MtYS9aU}GkQ zot8>h0HP57F9iNU@jhch27nJaV*@2@33V@=uP!Y+E-eXb~Lyr z`%>R#SY~dhF$PKALn-Wd;8?G=a4If``@DOs=c4C~XQStiXS#QjZ;}6;zmos0ccEvV zyM%kF`+$3iJKo*S^|A9S)vMN1`>HL~4EjF*rKCceW3kEPjMqjyt_-^H7Ny5?EdMqI zCziRzoQa^6Gtj1l%P`2(TUE(haD*n-SMAeqN4_S@+NZvMqsJr!OEIV zH&C1X9?__+=*iE>#=f|`60^l(R(E~T@cu&{& zyU^KuqHs%~+Xm(XV+4}(EL!qceTM$C-d!)CU(hCKZM8;P3#|$A@?>ya@WWu0U=GIe z<_<0oF4gYn`OT7+4=r`bp4$ zK?nRnFY*KCKg{QQi2vgu24S#|`{=P!Xs_yUTmdGgUSnRt0pwi__>*a(Rf)dNBzBS; zk1K<`PDA+RW1{RofVI4#`$*y|*eiGFSl<~cxCx#AjwEWqOoeXD{%Z`q#}fs~FdW#0 z&6r!;4U2s%k&l_y8><`f*gE7A?$9B(8#6Tm_Sjw;M-{7|i~)>M+(#rd<%`P1s0=-N_`Da4krp!$qZnx#2M%GefmZwUJTYNGH3FXwobdMDcEQcdbA$U z4r<@w3tnYP>F2?^!36yCTY=+&xZsOmXT6%)oKm=NiEFG=S34KG{&4s6qp(6I@&13r zHuhq7mLz_5g6gYg=&ldQD`vCp$AfM~Y_c@*--Te$Z5>BK_C@csGrQBxei+jt>oNs1 zlb-(-&_JV@99h?lLhICnI~$;@@?v4_qh_rck>N&k*B*v1aECc~WgUYZ2OSA&TeZ8| zLmi|JR)0``RtKs*!Du@$8li5(Yn-4wq#v)-zK7UcA*gF5lAtO2xDa&J4V(1}nY$Cj zYm%U{HP&?Os*z~M;$ZL{ytgK-oj3FEQsOnuv2Hq}`O9IMZiM%WVr8z<7HRvnTTFsX z)pF?-cvV8K{-A%4#VQ_Ry0$?ZsWsQiXce>~V77qP4!^3ZG2Sd3+GC4B4^~neI6Jx) zxQ}~|co+LR`!D%pBXUF(iFogyjV>(ZZ{Tn4PxMcOC%^G5a!0u*x!kTE&X3i?j#tF3 zrx3?_O6K}Lv5Zkn9mv7-Y0IpQRy&D(UmQ9;O*~*QcH=mDP;bKeSdFEagRI2>WTjLH zv?GSn0@-u|I1hok2az>PBLyi_?o&hpN zqfFE-r*=|@s^6<4)Nj=$Ob5ttc(89;W2a69yM@&gOwN3xOjLAwou6l|6Y%8M&{sZ* ziNS5r51)}+_!6IH9~5d3?aqf}dcyBd>5e>{_+AJbdpeU6x?$ziz$VRaJ~37p{qQm_ z=;P6bHhr%)NgJpAL)4-bR!yd!!$@Lg;xOiM{9(-HXNB>XG02ECe$(^mSMadcV4qgd z-Ug2aUj|ESd$nbHsxim<%vK2QG}QX85$@9-hcD89-k%gPHezGMy9j^e%ZM)`&iE($ zfA){`$NBU7)_SVC4QB`EMX2_WQ@+;z)_sIIy0#=FEZ{dkLoz04- z+k9o%nZmOe9h!lk;XoheM=pn;bD7au7TzlZ2P*JkJLbn`5ZU|-XzF;et;ldoAJ*H{ z7!C^eX}UoMyA}54dwUgSD)X}YFasn7$vRw}t1eZStNYb=>POD0&R?BFoOPYC&YR4V zX+cc)Uq@ZXF{T!Lk8RT(&XkG~jjrmmq1HY`NmoECQp@loQB*mLzk=$9M)*_C&^4^r z&e#H5(TSDKbYh|%@Hw*Z8#ZBu{;ki{r-IdA^;!J>pMFulqZ@j(QJ6@{G%Q<%Yq}$M zIzkB%NFFy+-**}_@ft7bFc*dXu{U-sRG&GEx&QRs z^;Y(`k9ZPMEV4pmeB`l+QV~lyj6Kqq*SE#n*}KTI$GzIM#2Mv0iG^<9J!ey*h<@j! zS|wX(0Q&DM^i*!5$p0CC8;i&Xd;!0VfHU`F2?(c+#{>8Y+p#S^NlRc}3r_YCi7Y^j z^7C-U=O*y^DJ-|IATgchNoHX#WP)gW;{*K5zlnK7qY(=-gMO~5o1O614$~9-KfH^x z{67QVtqxX3SuCrnOjurv9{YnTkJ{wePm%fPX}@BRQfex#m1asMB|*tgq^O=UKv_dX zAeW;NHe5$0%(i19(l{bL=N)sHj(v|Qv%fLH{2kGQ{>&q|PekDxJbmf$Rv?^N{hNH3 zg${3rE$7Ety@@sVoYmQ^YhinD9+RK0g*DDuvX0}?@ZHc8J<;dYnQ{3FXzd_-av!d^ z!z}7#LUI`c_?VIpiN zBcHKNZ$}KMmG(S1GdNzWVBEBdDs!EQo-N)%zD<62)asZPaZ|E)$v!dL>gXoB49 zQ{`vn2C`0b3`Iv3R`WR?+ILWQ^2oYk{%YjVX9Oz+s%D+abY*SG+7s|-W%VQ@J67BL z&^uc}c&diO?HH^)klCU3@#L7_;fcnX1BpE6G#Z2LL@X~SQ!EQH<*Eo7zYmdlZ^^VZ zG@D>4#em=LQYA;v;EIj{YNS(lo^#cA|KuL;PIS+59fv0!YH3GfrJa2ocW+8B*+lAy z){$qfj{kT9kL@6nYW`GCDSs&{v+$llCC7;I*CWoe0{Sc!axiNtf{7q)=@WhjDm#w$ zc!agk5PRVds?Fpy!#Bhd_ENFXnkb%39-fE%UWfPeo1roPs}G)I4AQlc{+WJ8uWf8K zDq%}z$G*6TAJvX5Z=MiwWW2RENTR!N%1Ly}2&lI&^B_j!168!nV>9F@uegB-!!ErE z`gs!^+*vEHtqpz=tQAZN?8GWg(sCJBtVl<1_i+E9s1-5(Y&+um=Sa)hH@A_ieZru) z`%yLg<2*Z@wUty;4K7aK`TqBJ%ifiGAAJ8bbwGOdtOwc>>$QED`mgJjC(V}}u|Bd& zg`%7@Uk{y<@Orw#$GPoiTA2^y-C#!pA`;61+*V5Z(l*%lc zH7d|a+hz0&9ku`K(AA=@j_!$`&fY=Z@t&Ek;c91Py6uV8$XuXb4~`4$%lbZRZ`Q|w zJi&rYt2d3I*6h$PWYKFXtFVP;;(>hVc%iIU_A=|apraSQ$##cR9fbs5tX5UmJKi!8 zet^9*@yMRm7-j;uhX)E7RhWl7+MHlr3u(4%_6}rQb1~0+26NlSDPP+Q*{)#^<~1XU zq)ukqe8AjBbixdE;G5@_-j1_8qm|$>aGShSmndoQC>sn0osxh8e3nsH&$HIIT{?V~EzaU#O+K4jF>-Y3$!~$>ViAd)f z#P^wfMr1fAp4f4GX_>c^!`_oFYe}K+&;}!rc594U#9(jekC6GtiA%iIpTncw^ji9L ztt_1WPtY4Y5ZD|T5p1V74YgMrdXpmtNB54c8aFS;&$+wgdzWu}p0f#Nwi8ij{Zl-x z)lJs!K=rh*-Y!m=lJZ|l(wlm32aqO*?rMj3ABtVHM!tirbBEtAoC6`3bC!d%1z zrJ77qIRlq2!aDm2ep(Uw%~qBvz>Aq?TUq&6sg6Wn<7nepPCdwTDkDC}+K;DNaWy_p zrdb0^Zg`0KA@;(=LU$^Alwxkd}ocOmA*?g0+jt-tXv z63l5tuMGVQDjLoN6ScEiHuDGjQs)ZqPXAw#YV?tqxa_YJp5?lct9!zXxH-{%BU<>T zyYo9Xo5QjiruyCI6n-_024r@k{!N^puP|S@D4#fz^Q{fp3Fjw2OKLbAy#+ zTVaoPj8%_1-@7V#T6h&-PhTG2J5OErVrO1;k@Cp4&T<(IgISrIGMbaAOUoFWnK!F+ z;BK&xvCe8?U*wqT^t$6b%RJjXO+4f96zUMO&Z{)E4X|8hb1b9>`c`bCsroyz3>qGY zjo7Y(T-;fERi!_#mP&CYPBOgA1l)oiUx&YZg2`Dq?UV55%2F{m2RXkOUtTwhV{@-% zLeF4o1J~Mqvrix*a^LZ-x=fv-Hdl`_EASPyJx4=7TFuS6Mj?HS=F!rE4}-owWd5ZR_!b1S*0de}3c7*mYhWQYbqO*@&oJs9cV zmX$~+mo0b`-KbI7O1-Si%9%jbZ+EH}kCSsRf|n;V`|?qfW@1$hA{Re}`nwL)yS-+1 z$3UVmX;5^3o|Ml>(i64qflgUpWqy>IGfNNlwW>OPaQE=tk60TuKlXBbz1%1BrsZv% zJ0i!Z*g#}e|0B1qBpZ7&p1&>p`s~ZSFM}`3y!z(VuGhEUZcQJeoeF)aCV49QFGc2w z=@2_O_WPLEQ6(cQ`rmqvIo(PlYmj~;SS=VEoEzwnm6lOFV^&7qtSfcJ4*aNVSeq*0#XhrWFfR%50O- zE#qCr&zXVDV6~0^8P`@z#=9vi`>8!WJ7h`t!E<}G=`PdAqVeAQ)E$H zw%%$+#{RPHbNg+(OL=cU3C-?d@=kB6b`otpLbI8#=D-_mK!kWCe#~TSh+n8ny=5C= zKg=}QV>AJcQ*tuxzN|8l9W@D!C(6Iwa2kiTKEb?!PqJ=i*3LYbk&^K;^GvXlr&U&@{^{AACDbG{( zyczKRLB`kmD%*3lndg`B!3I4}+(uF7kiWE;Lpp*C zbkWcxbd=p(iPv41%7x#t@rzOtLoG)4&hA8 za_rQhd`HgC3?z!RnricL)c?$+?(iA@b{*>n^9B5}PWvI)DDXP-LPoueMHy=|Uj|E9 zr5#J%b^Os$gJPP+l})&p`%T`}dB^A4pZ!|&2LG>~GETaWXkVwDO!?|%p_iRs`BH|w zY4P^ZyX9$L2Bus6)Uw{@5k_Q8v_IxSj6b$}%%Z5*{`Vfc%k5}tyJ_Ck2WrcLNx@rz zHi2KV6so4WWi<}e4=%%=bp^8m3xfeI(|B%m#YXS0oO0}T9(6DAp7Djy9reAB-NT69 zo>m6f)|r{w)WE9D+8MpmtEcZwe~~dPD_>C4@|r({x+@uKUH4WrPRLWv)5iU+YnU@Z zt*@v&Kheme@1i~;gw5$THX47JTP;pU*b|jBrM08J!|phs^aA@AnQ~PepQbz~bE{CV z6Kk(c_QGR7M(%J7yk@6X=N|Pn=aIKh%?fCalf-Gh=Bz^ze1i7)7b$k9a-4}{x$W!8 zyS$|a?f|yNEF!0$!s#>2L*`y;ulAT%!2MYw%CF7y=1FL)BeiuOGh_BoGH5~kgZsdW;}(Mhlv$(7)tDJbu*_Ld-U4+WNlOM`#_hhA(;g-Kg;|fYp+&2 z^oiQU+aNMB=03f*%JPYqRw2#u9TfHr9%gjl}*?lzcAA# zoqGhxp_U|`w+`*{9X{VSDk3|Dr?q^6maj;a?YC3|WiuyZ{l}3X@f*4E@b?;BsD@0p z)>2I`9f9gnPyH>nK}9NDUsKKXipP1H*FJh_mUxa1QpDNH^XpiUieN=s4=j_LG zVrgIFd#a&J);;E^e!&{knMK=$97O}FWjm7BIZu3hje$n5Pv!0H}my(s7 zl@!Pk{911mI^?M2x$nOgwJIhvc6Z#``1}c75<0|}i>)5f*WJu)qOv zCMiqaWP86O?NP>@thC?^)2saH8tgkAu{iRh$RiOYA_n{W`bK$TT+FS6rp=F^l_}`u;&< z^l>@V9rlkyMa@LLUGQAirm0spGIrdwO(43UeK6i8dgQ3feV0N8LY|m$}Z}?Y)V)1(Ce5|lty*X zGBCS~OyUXZ@@A4nn#V~ICDavc%re^(>G_OEZCNz*i z6(_ZPp`F$+GD)$-JLXgEdzg#XxQHE~J zG!w8h_ES5bZp%p}e<$p}iJYF?Xf?8y67PIz6ee@kin)#>sMeotD?q*Bbo-A?IIIL6 zp5Z)Ye(aZt)Uy9b=HNysi4y~VkB#JikJFl@c2C`ywk+d#ma5e^R$1TJr>i5~bG@T|pZgAYo!&N{G479Do7G!NcKg40 zL-);^R0Gc^ZoQS7@fv1|QNk#y_oYIrqc%tTMVmrgq?7)yvD!Lh+o1GNw>sas-lGB1 zJPSNOx;Huhc1*Aj41I1c(er6pfhqwt&@WIaI7Ca+51Q9Qw~;K=0Xh2+(Jk!UL;kv- zGSha?`U*d;iBX#z$snTT?~M88D(g6PP&MqsnI$GH128V&Iolw4Wer ze-~`@#Lmx6Y+(wqVuKSdlfleC7GSL1XzFUA(0UuI>_A_ypHP}gC zTFcDU#uhkaowi&%prvaqsNooHj4^i-Rmf)dD=`j-dYn@es&lD&-SJAf$&T~bT82Ki zW<%FM8EuImohEXfk2w8K&ddaD&6qkn-+tVljMq@cJ|AxR9p0X5)h9055E*@#Z@wqe zoP@Ofo%0gXO)VxI9Zn#|PzTvOm%DVbFSi$=j^#R0)ay!$a#Hz3xd#PhvWrQ08WXYR ze+Pc;;ni2B7hkkL`>D!_=T7*6TR6F~1}v1u5~vFca9~rTQWUv!>dO9)c zheTETVCUAP=Rs9Y{~W{vdBzOF`}}Ki4(2Tp(gkF5a&vO|JbRTh;#bMVOu@<=NR@H( z@QID4)CYCLHXTBQ|1r9)qD4%{Iz-HN685cSp0lom@=;Hjp#JW3yAwT`*l0DpHt!5_ z^NH@3uEx$xD(i>XyV=GPS$}1HNS>q+QCT_3QJr3tekPBuwEqchS7bKqOrrZMSXU(V zn#IDCEkm4%SV-MwUQQ&&ggOw7O*Q%&ZYm^$dTF%TM&dTx&F)rCc2E}?XMp2hsHc{S z>bIN#?ZCODjy&f%pWLNFWfk9%NpKItXD!A6{jEsL2Gk|Gu)$Q~Lg$!jy$(C@Co5`}fodA)Vk_!IA5T4p!g<-e&4=N2D2BruR=u5JCO^UNGxeHk;l?x#+Q&yEI|(RH_q$bC$AQ(BgC3Mz#->rT9(ab(=m$;dUQDkXyRNLzUJ2BK@R@bi!Ocy~F6TLFG<4@VEi z-|ElnLt^!#IjRP+f6rQEj#Mfqm!psvGJB~ec$6NbOQ5;Gp^Trg)|x~6Z8<4DlXt&| zHoBo@s`2jEXo4C1TOYX~J^f_Tb}hK%9(7#9=w zco%VMAO7rq>apjejlSh%)>Qtwh}5pl{P3TtDnHICo0oVCD(BIYkTe0Lot)&jNB-gr z)R9IOqaiyvg?>ta0_$RpE&(n&GlU=UTR*Vgf|Zr!vq(;3dWnOyXVt6N+do9CKA~^P z3GCggRzGw}2rp*J{jtl;>?ame9=26{mS zKdB>mEmd!+&((mMNrm=8^>_61(unFQ_1LxxbC@Ue7~R1 z`|}>J_xQX&9yj5_S$1C@qWh{OYT?7n=)~cPk7%;SiGS=|d`?YF3-PBMeI7=-&l)TG zgqg(dtH#;f))9O8u43(Hy5r08S4q+EYuJ(lyofOcAFAPeMbz>+Re@7gkDZGGKjGwv zJ#UcJ{?(OM(|+I5ehdJ4mgtilrCRh*vQ(;lYE-IOdRn?{ZoAy(xm9v=)aoBim(DFKdp$ATBz?P@ zw!4$n=!_4b;TkI1hm)%FXwjGXcLO}jf#BaJ!)M#ER=uzY^z@r*sPkd!HZnXNWFkA$ zALq0GAF7C~z~aRzw$EqxJU)jXqC3xGR9#B@MgNxQEOxV*4k5+w;EyTpcpG_-?uT(| z?Qdl0B=;DJl8bOw8M0Q?eH-GC+f^rg<%)57&m=p!A7^R1u(;7(`fhi<4=v)v^=>%t zbGEunqFv%<*l(ul&B(*vxk7pHE7xB$c;||1_sD;xyOj7ZT?K#95s?X`&O< z@x>{8(e-B?xqI2&>RXMaMmErjJa3G@$bGGmX&FftHnGs#$w5X`;VtyIi?lrFag97# zJ5h_CUU^2&@O`n7eB5@WM?bNsp|oV2EFEW`6=fe<(`?sg_rrFj>t3J*ql0Li>$cYD zCcswx+0^sUWEw91NY&3gJ5K*#o!-TB_p@ZP*|H7z@fY`c)mXk&HS(+s?cSVKiM|lm zH_4Zi zV~LSa&+VdxxiI|_nS);-jR&kiD_j|8KzAWo<8&HsFs1sPC%RPC^8*qbfQ6@l3iZ`Zybd;cJWw0U}IX-qm5~jo9Ne)x&uXT%Ad`A zh=^Z?V_PJ-}?vi=lmgwa}&*Qq3}p+2N4I=pE&%f%$%5vzGQO?Mgj{*+|PSEB6M zg|ndb#%d8?fXNE=D(z9;D2o*SqLQy_W{GI)H3dCXP9HAVkU1yk+r%stDhE{o^tUtf_tc8?=G^%z z8ru}DRrGrG5a;ARkZx%2?RoYNHc5Z0PWr6mlZmC!%~JEMN#CTiIuAIW0JaMj#e8A%BbiP-q`le`SK5bGQ z-soUgO&9v4O5!{IR-wB0H~}_#Ydv9|`dRy1*{GLfAEL+kPvqm9EP_62CtRE;Q4A0L z*XJ{Gp3zBZh^$8C!X>QCEhOg*nj)E5Z~wzIcxnS zstMUyLsPWyh<)tM)ppg%G__ZDnCiO6RLh>Hit=#&cLm23_DM8L-IRVUeQ9b+V!RyV z$*IY?9gEH=R#!=4V=vj+njS7>VKj3?rHTw zpB5a0yB>rAI#|CGR6F(H+3)7Z3}?}=g1x3giKmNTchb3I1Dx<6FSjk(Ib8+vIV$*v z^Y`Ai%XbFPc%4d$@%VKi`+h6@dyKlx)3W?o7mD2CeA8<5(Q_njKMS##A6Sw-sg$@W z(Ld1^AKsOi2Uq1JGW61oqR+ipk;nJ}5t;lPp4rGVTqIA@fd-sLJM={Jv+0QOP;O)6 zzmr~jp0&BacVDBCrm3SpmsBqz9YZ{x@rXV_Wl6`cto#(#<8!~?!xQ(@Cm-+`M$tt3 z@J4tp``ztpGFQd7;^e(%Jdw$yt0sMLrJPv3tj9HiB*n>`34Bq475tRfxKlLXJU-nF z{1M~qL9ZSMH|G^@B{y$FyVWw=c}({~$-k)SI0@dVl$j;UR<7XN{QFg3UL)i8P(d|g zJWyCAIV}BR-mtuNYM^H1e3w|B9#{0y5|@^2Q=(I`SBo^tOXSW@eJw`xd@7lHLf)9% zFH+SL>B75sS=XW3Sk>$o(wV>MCbE`Rdy<}fh0YiSgS0KYC1*}zP4c+Z@yT~{F4xuO z%S=_Wb``66gStf#ADr{P_~{n~5Arfb(#Gf0zT4rGl7+kJl~3T6o_3dv%&D2U-p;Ih zcuP8;pIbP< z&XV$~xeHX)eVa2!AD3$4jL#&V#nE@t9Cab@v>i_m@^R+VQsr<;oLh7i4D>ynRi|(j zZr@?NFS9diRp|Cc|9*Hnx^gXpsv^g?getpf|TQ%>j^ zHs)JgaSP1;F6-Te?f%Bt=6nBA9JzySugIS}wy-n`52ka*Lo)q6ZpvzxGOYVJ8g~`$ zT+Gf*7b(pZnQ6-M^b(^fVn0l8S%XK#0$XPK=d@10P^3%IPI-?fUzMTxEmghPypk=xpwRWp@X z_~!}_*yVR1|55uNirIOzSzNX-@osWi;(Q%2#$_JYU9M>24S0Jf&*ct?>kB9}S=b4O z&k>U>R4;u%OthtV@ar<3`Qp5#GbQ<@Kj+j)l+zFCId&(PMz6uAkBCN`RbPtl8fU`K zf^beR9HCE44fM^=#MwA!7cP*~yqKQb2+5vD8%$yQ+OZ@Zv%d1>e8msR|1bEclAJ}M z{OoSl=2>>*46ASw3sg@{$NT(-BVuh8q4ERtN;8%|mrebRt?b4c#R;(2^R8M!Dg|P? zQ^fKn;^>j#|!}9_X*>bYTTEd_>)8L;C`*;&q;mw=)F^am?dAuPNVq zGGuZe>06<9(P`q05!q=Edq(%v-Z0j4@cvfy0dc;0oQ%{NdP|6~&$1R%MRPw;-SZxQ z^A4zb1$)`d_t895}?)PBEXijH8~2L=kl#-R$O=qN2TsYWAnp z8J5kgrGrWqY|UR>@MuoS^jCQ^@;0Tm6h2?DCG%BkY0=9|+*AC#BHyO(PB+gxM=e#k zBHy!Eqf!UbGjglvKAYN`xG%9bacc7H#Pm$t{L)9a9c`C+R4u{$!msos>70K{!3VTy zi%iRcGU`+M>6UdrZGH|s5xwWW7c;!U*zd`?TGqLD;w4=eN{eZ96#=M#o|n>^SBeDm zwN{;Umgz~3pSCg){i<&z!h)<2+a6eWl=dD&9*fIh-3aAeSJ=9+JYQ!I&37_9RI%_6 zp6IDidlwpdl<3AckbPs`(NfXvm!Z?@?%zAn#`UfhEji%T-yqp56X!!IyGZYFeq43Y z!5_%&D)#0c-+IjdSK{k3aDrZLJgybSb&vIVNmQ?ai0WTv@~5BAt?HL>%nbZIP=v5C zPWf-=LT}jiBGp1y8}-xVy_Xq3u9s6EeDOrKPG=}9^$`R(5FQ-n*;H}C+PHp;oZGqX zd<|sQ8WnHLSqpK!2h~0*?pzo0K7>2(g8g^%R1S-n+`~Tp%rASK{XR_79ab;4owg}j zI0{nUOqx=KFOsxf1r=zxhe%mxwxg$UJO+)P&gW`wFXz|n;y&`y4ehQWy=P?4JQ$jD zcjBVtA{F14t8%(M*($X?)h^u;);--$`5L*Ca)09){g_UtC+od%OuAjVnZ3Fvq#lwJ zot^kfhI_oc*va_(w4C=zMomaC_Bk9^ctvKBdWTcoceNdI=jz(ET7CEFyuz&orTl*? znJVS^YM7{@C`(s$ls#G5r6SZ1*bVtq)(0LymM=p2JFVZbG=5bb=^n-{c|72U@YGTj z4STKE9u(Qai;nXThl^@Y<2BTvS#GnUH)k{5=ZZR=Xx2SMWEQYdkK(`*Jc{T(9p_cW zsSrt;CC;rYV4WJ$N^uTuS>Jg!hXq$fel{IajQ(gRGH?&9PzWj9$Sdz)EbnAF;hIRM^^9tz`e{lA$eqCNMrS{Kj&XQ18jFkcN>hD@eJ z_OG&}p(z|PgqDeH!Dz_3GMw}^-|Z=p);Lx7Noc((&#ftKQ#x^mjN;>Rd-)0-G}b9;DPA=*|n_qX(~>A9k@i}fjLoc>n@#oeh>Q#rcqT%x+_ zMfl=)+;NE<(sOJ=vhWi=acS7M5}&Uxd$7G=q8j;4tV=~c^bGZpZ`gyrO>B6)=g)Wy zm1X>{V6i>W-C&nhy!_AD^YQR*e_SzNoUA}*C(eJLLCd~|A`^4|p?&v~tYs=~C$j<1 z$ywCq8RVeDDXjS~qWj~`^IZPZbu`CPF@>~P$U_iDpwT<5@RNMa$iKaqbC89tlvs}L zZ_y}E`qX{wNf#)$t~E&07;#RB?soJ_6Y-R)aszF>e-)Hc7NT56CT8<^;CFU#7nyh( zub&NT7i4!Y?KkhI&GS39x`wI%J*4bSTMBP=Bg*Bv;&6i$z>{!4V?Jl?FUWjXsCxan3vRr z_49KtE!>%w`%Ww;;wJs@aSs--wy4I3Wb+mGOVVItS>!eL5hqhuq+UwBm-=67v(5|y z(i78Lb*!tz&eYCL<}OXoOn;evPsF}Mx^(&zJ67AJN~gBdH|He3<6EwWu5KVt)#WEA z(WRZBs>!_OF1WN29Z`;@8>4dSZuL>^3tHPL+ef8bFMmI&vTl|Ns!B$7sVL7xe(edO z5Ld9uLqr1OjQLqOqm&hh^MKCc`$S*%v!MNJ$j~h)(3{6{8_RJn`H%BW;?&nG#TtrQ zv%~aFee!jbCHPl$W=)Z&*pXJz_g=zLAL6NJ@Je)ie+Q2|k8^$!wJNO_;X3b+5;vKq zPv|>1W<1_}-}`-eU$yZ@Yu-_FS*z_(YYw#j18v?4rdY*~Sz(p`f`d2n*|*{MmuZiL z{RPpHp)|>@o;gewepD$oyFf*ZJXR}v5c)x~??SvU!?kP0?5oitIfZ*g6S}ZrU%*$bNOm5y z){c(c<9^X2?mO9|Zwh`_qd!+BeIzZ`Mg9CW@>-MR`9}ENN8WKLL|Y!N8;PPhsx&VU zL7&HBtb}BKMvracZU<=nj1_N=8@u9zW~4Z}w8zQ8rQLlC?GWeY#iF@tuxH8TT zj|j;|-p+^C?A>e>CC(BLPkHjXaNDyOEB2 zkNr5HBB?Cjehb|?1qzvoN2Z8DO~BWWlAXJ7@;}z*Whg4Tsb9x_l@oPJit5B3z3Ysu zFa6OUfBc;}lVtv)`(!g3_DAUEnZ)kI`N=m$>yIScrQS*HNHtP-e`UIR`l56XzpwLG zb-NGO+SC4)-FoMyTBpuWbxhSvElA#D7uN(la%$oz+3H44zf}JgeM+{77u~_aRkt&3 z9G-ZB)vGBnESn~!UL?!a9C#)3T$CDOW~JVevZNQ?dXU& zQ+7Chc@1~>!qeSJ$|&F?czyy zhESHsAa<7t|DIl|u1mwXL>X(nga-L1SvGZ({qn8TpRqAzbC0SQI35PMCHJA+2lVKw zBB!(3PO&S}RnvR%(i&OgyG3ee>Vt5Fm|RhNuczB{RW&gMqPw1KFEXlU&8@F-RV-Xj zqYV+|x!jJ@O0v_%?a0c<84>5X9c~)~b9@PX%;#xVh0j_;Z5Q+NuU8H80L}Q5HTj0@ z4)NCmbnRkui8CCcTW^8X&nQ3(7`^!(E&XW^eX;r29|C!F6b13wQTpXC7g%xmihm2Z9wGl1ILJvrF2+b5{ zZY(kWCM4ie2x1sS@i@yiC1<2kv$qK1%l2q=fLTk4Ty0V{Gny?O$SQZ>qn$#(R-kj&;Q5#A(zt^M`nVX& z3+!4`C?)n$=7{P?RaTm2E5;D}9VHR?xk= zf_&e_?teCXw}J&6L`pAV_kYK&^>ic{ONYHgdtE6%Q2{^9ml^-oF2aus?y*m+Ou-5} zb;sEO@IiT1xJrkp3;jPh|MUDsx_i_tXfEn=7rb3q&_ty5 z;>_J_=nLd;qL}|`(W^4%^CuLrfGk!d*B9~?d&0W^Bm2c*yUtk+(wkp15T!=a#ZzgH z6{2>FMctOD#W+rf>W--2N0wj^3?6%+{z=%&WH-wp-RP3Z0^QM8t6&`=_II(G##Vf| zz4Ah{#VbUQNJnRSC%COG{T1huwn4>C5OQ@LD`%0D0?Gv?e&@sG?YV6eti0ei3810Vl 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 HLiFXo&2)c3 literal 0 HcmV?d00001 diff --git a/tests/test_whisper.py b/tests/test_whisper.py new file mode 100644 index 000000000..8ee3b428c --- /dev/null +++ b/tests/test_whisper.py @@ -0,0 +1,26 @@ +# What is this? +## Tests `litellm.transcription` endpoint +import pytest +import asyncio, time +import aiohttp +from openai import AsyncOpenAI +import sys, os, dotenv +from typing import Optional +from dotenv import load_dotenv + +audio_file = open("./gettysburg.wav", "rb") + +load_dotenv() + +sys.path.insert( + 0, os.path.abspath("../") +) # Adds the parent directory to the system path +import litellm + + +def test_transcription(): + transcript = litellm.transcription(model="whisper-1", file=audio_file) + print(f"transcript: {transcript}") + + +test_transcription() From a6930454604fe6ffef6b9016f43278e6b01cf83c Mon Sep 17 00:00:00 2001 From: Guillermo Date: Fri, 8 Mar 2024 20:33:47 +0100 Subject: [PATCH 222/304] docs: fix yaml typo in proxy/configs.md equals was used instead of : as key-value delimiter in yaml --- docs/my-website/docs/proxy/configs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/my-website/docs/proxy/configs.md b/docs/my-website/docs/proxy/configs.md index 5745685de..a863ec2ca 100644 --- a/docs/my-website/docs/proxy/configs.md +++ b/docs/my-website/docs/proxy/configs.md @@ -49,9 +49,9 @@ model_list: rpm: 6 - model_name: anthropic-claude litellm_params: - model="bedrock/anthropic.claude-instant-v1" + model: bedrock/anthropic.claude-instant-v1 ### [OPTIONAL] SET AWS REGION ### - aws_region_name="us-east-1" + aws_region_name: us-east-1 - model_name: vllm-models litellm_params: model: openai/facebook/opt-125m # the `openai/` prefix tells litellm it's openai compatible From 2aafbe390b80748edbd67e31935af17375a21dc2 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 13:16:12 -0800 Subject: [PATCH 223/304] (feat) read passed api_version --- litellm/proxy/proxy_server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 19ac5c961..d9642b810 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -2670,6 +2670,11 @@ async def chat_completion( except: data = json.loads(body_str) + # Azure OpenAI only: check if user passed api-version + query_params = dict(request.query_params) + if "api-version" in query_params: + data["api_version"] = query_params["api-version"] + # Include original request and headers in the data data["proxy_server_request"] = { "url": str(request.url), From d67c63b0c3f13215b91e5c0fa9719b1e97ac8427 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 13:33:58 -0800 Subject: [PATCH 224/304] (fix) use azure api_version --- litellm/llms/azure.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 01b54987b..6a0c1ec1f 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -333,10 +333,17 @@ class AzureChatCompletion(BaseLLM): azure_client_params["api_key"] = api_key elif azure_ad_token is not None: azure_client_params["azure_ad_token"] = azure_ad_token + + # setting Azure client if client is None: azure_client = AsyncAzureOpenAI(**azure_client_params) else: azure_client = client + if api_version is not None and isinstance( + azure_client._custom_query, dict + ): + # set api_version to version passed by user + azure_client._custom_query.setdefault("api-version", api_version) ## LOGGING logging_obj.pre_call( input=data["messages"], From 2f6e15655a093777b912e59f92ee78a3cfc6acc6 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 13:38:29 -0800 Subject: [PATCH 225/304] (feat) set api_version for Azure --- litellm/llms/azure.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 6a0c1ec1f..9f5b04a04 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -270,6 +270,14 @@ class AzureChatCompletion(BaseLLM): azure_client = AzureOpenAI(**azure_client_params) else: azure_client = client + if api_version is not None and isinstance( + azure_client._custom_query, dict + ): + # set api_version to version passed by user + azure_client._custom_query.setdefault( + "api-version", api_version + ) + response = azure_client.chat.completions.create(**data, timeout=timeout) # type: ignore stringified_response = response.model_dump() ## LOGGING @@ -408,6 +416,10 @@ class AzureChatCompletion(BaseLLM): azure_client = AzureOpenAI(**azure_client_params) else: azure_client = client + azure_client = client + if api_version is not None and isinstance(azure_client._custom_query, dict): + # set api_version to version passed by user + azure_client._custom_query.setdefault("api-version", api_version) ## LOGGING logging_obj.pre_call( input=data["messages"], @@ -461,6 +473,11 @@ class AzureChatCompletion(BaseLLM): azure_client = AsyncAzureOpenAI(**azure_client_params) else: azure_client = client + if api_version is not None and isinstance( + azure_client._custom_query, dict + ): + # set api_version to version passed by user + azure_client._custom_query.setdefault("api-version", api_version) ## LOGGING logging_obj.pre_call( input=data["messages"], From 65ccfc35ca5b5de0386b4fd6b432d1c351b7d4e5 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 13:44:39 -0800 Subject: [PATCH 226/304] (fix) azure extra setting client --- litellm/llms/azure.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 9f5b04a04..0f6786902 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -415,7 +415,6 @@ class AzureChatCompletion(BaseLLM): if client is None: azure_client = AzureOpenAI(**azure_client_params) else: - azure_client = client azure_client = client if api_version is not None and isinstance(azure_client._custom_query, dict): # set api_version to version passed by user From 6b1049217e8df6a14f84121b643fea75ddf28c8e Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 13:48:38 -0800 Subject: [PATCH 227/304] feat(azure.py): add support for calling whisper endpoints on azure --- litellm/llms/azure.py | 111 +++++++++++++++++++++++++++++++++++++++++- litellm/main.py | 88 +++++++++++++++++++++++++++++---- tests/test_whisper.py | 51 ++++++++++++++++++- 3 files changed, 237 insertions(+), 13 deletions(-) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 01b54987b..e19023b03 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -7,8 +7,9 @@ from litellm.utils import ( Message, CustomStreamWrapper, convert_to_model_response_object, + TranscriptionResponse, ) -from typing import Callable, Optional +from typing import Callable, Optional, BinaryIO from litellm import OpenAIConfig import litellm, json import httpx @@ -757,6 +758,114 @@ class AzureChatCompletion(BaseLLM): else: raise AzureOpenAIError(status_code=500, message=str(e)) + def audio_transcriptions( + self, + model: str, + audio_file: BinaryIO, + optional_params: dict, + model_response: TranscriptionResponse, + timeout: float, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + api_version: Optional[str] = None, + client=None, + azure_ad_token: Optional[str] = None, + max_retries=None, + logging_obj=None, + atranscriptions: bool = False, + ): + data = {"model": model, "file": audio_file, **optional_params} + + # init AzureOpenAI Client + azure_client_params = { + "api_version": api_version, + "azure_endpoint": api_base, + "azure_deployment": model, + "max_retries": max_retries, + "timeout": timeout, + } + azure_client_params = select_azure_base_url_or_endpoint( + azure_client_params=azure_client_params + ) + if api_key is not None: + azure_client_params["api_key"] = api_key + elif azure_ad_token is not None: + azure_client_params["azure_ad_token"] = azure_ad_token + + if atranscriptions == True: + return self.async_audio_transcriptions( + audio_file=audio_file, + data=data, + model_response=model_response, + timeout=timeout, + api_key=api_key, + api_base=api_base, + client=client, + azure_client_params=azure_client_params, + max_retries=max_retries, + logging_obj=logging_obj, + ) + if client is None: + azure_client = AzureOpenAI(http_client=litellm.client_session, **azure_client_params) # type: ignore + else: + azure_client = client + response = azure_client.audio.transcriptions.create( + **data, timeout=timeout # type: ignore + ) + stringified_response = response.model_dump() + ## LOGGING + logging_obj.post_call( + input=audio_file.name, + api_key=api_key, + additional_args={"complete_input_dict": data}, + original_response=stringified_response, + ) + final_response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + return final_response + + async def async_audio_transcriptions( + self, + audio_file: BinaryIO, + data: dict, + model_response: TranscriptionResponse, + timeout: float, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + client=None, + azure_client_params=None, + max_retries=None, + logging_obj=None, + ): + response = None + try: + if client is None: + async_azure_client = AsyncAzureOpenAI( + **azure_client_params, + http_client=litellm.aclient_session, + ) + else: + async_azure_client = client + response = await async_azure_client.audio.transcriptions.create( + **data, timeout=timeout + ) # type: ignore + stringified_response = response.model_dump() + ## LOGGING + logging_obj.post_call( + input=audio_file.name, + api_key=api_key, + additional_args={"complete_input_dict": data}, + original_response=stringified_response, + ) + return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="image_generation") # type: ignore + except Exception as e: + ## LOGGING + logging_obj.post_call( + input=input, + api_key=api_key, + original_response=str(e), + ) + raise e + async def ahealth_check( self, model: Optional[str], diff --git a/litellm/main.py b/litellm/main.py index 2df9686fe..f1a745fcc 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -88,6 +88,7 @@ from litellm.utils import ( read_config_args, Choices, Message, + TranscriptionResponse, ) ####### ENVIRONMENT VARIABLES ################### @@ -3065,11 +3066,11 @@ async def aimage_generation(*args, **kwargs): Asynchronously calls the `image_generation` function with the given arguments and keyword arguments. Parameters: - - `args` (tuple): Positional arguments to be passed to the `embedding` function. - - `kwargs` (dict): Keyword arguments to be passed to the `embedding` function. + - `args` (tuple): Positional arguments to be passed to the `image_generation` function. + - `kwargs` (dict): Keyword arguments to be passed to the `image_generation` function. Returns: - - `response` (Any): The response returned by the `embedding` function. + - `response` (Any): The response returned by the `image_generation` function. """ loop = asyncio.get_event_loop() model = args[0] if len(args) > 0 else kwargs["model"] @@ -3091,7 +3092,7 @@ async def aimage_generation(*args, **kwargs): # Await normally init_response = await loop.run_in_executor(None, func_with_context) if isinstance(init_response, dict) or isinstance( - init_response, ModelResponse + init_response, ImageResponse ): ## CACHING SCENARIO response = init_response elif asyncio.iscoroutine(init_response): @@ -3318,7 +3319,43 @@ async def atranscription(*args, **kwargs): Allows router to load balance between them """ - pass + loop = asyncio.get_event_loop() + model = args[0] if len(args) > 0 else kwargs["model"] + ### PASS ARGS TO Image Generation ### + kwargs["atranscription"] = True + custom_llm_provider = None + try: + # Use a partial function to pass your keyword arguments + func = partial(transcription, *args, **kwargs) + + # Add the context to the function + ctx = contextvars.copy_context() + func_with_context = partial(ctx.run, func) + + _, custom_llm_provider, _, _ = get_llm_provider( + model=model, api_base=kwargs.get("api_base", None) + ) + + # Await normally + init_response = await loop.run_in_executor(None, func_with_context) + if isinstance(init_response, dict) or isinstance( + init_response, TranscriptionResponse + ): ## CACHING SCENARIO + response = init_response + elif asyncio.iscoroutine(init_response): + response = await init_response + else: + # Call the synchronous function using run_in_executor + response = await loop.run_in_executor(None, func_with_context) + return response + except Exception as e: + custom_llm_provider = custom_llm_provider or "openai" + raise exception_type( + model=model, + custom_llm_provider=custom_llm_provider, + original_exception=e, + completion_kwargs=args, + ) @client @@ -3356,8 +3393,7 @@ def transcription( model_response = litellm.utils.TranscriptionResponse() - # model, custom_llm_provider, dynamic_api_key, api_base = get_llm_provider(model=model, custom_llm_provider=custom_llm_provider, api_base=api_base) # type: ignore - custom_llm_provider = "openai" + model, custom_llm_provider, dynamic_api_key, api_base = get_llm_provider(model=model, custom_llm_provider=custom_llm_provider, api_base=api_base) # type: ignore optional_params = { "language": language, @@ -3365,8 +3401,40 @@ def transcription( "response_format": response_format, "temperature": None, # openai defaults this to 0 } - if custom_llm_provider == "openai": - return openai_chat_completions.audio_transcriptions( + + if custom_llm_provider == "azure": + # azure configs + api_base = api_base or litellm.api_base or get_secret("AZURE_API_BASE") + + api_version = ( + api_version or litellm.api_version or get_secret("AZURE_API_VERSION") + ) + + azure_ad_token = kwargs.pop("azure_ad_token", None) or get_secret( + "AZURE_AD_TOKEN" + ) + + api_key = ( + api_key + or litellm.api_key + or litellm.azure_key + or get_secret("AZURE_API_KEY") + ) + response = azure_chat_completions.audio_transcriptions( + model=model, + audio_file=file, + optional_params=optional_params, + model_response=model_response, + atranscriptions=atranscriptions, + timeout=timeout, + logging_obj=litellm_logging_obj, + api_base=api_base, + api_key=api_key, + api_version=api_version, + azure_ad_token=azure_ad_token, + ) + elif custom_llm_provider == "openai": + response = openai_chat_completions.audio_transcriptions( model=model, audio_file=file, optional_params=optional_params, @@ -3375,7 +3443,7 @@ def transcription( timeout=timeout, logging_obj=litellm_logging_obj, ) - return + return response ##### Health Endpoints ####################### diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 8ee3b428c..9d8f038c2 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -19,8 +19,55 @@ import litellm def test_transcription(): - transcript = litellm.transcription(model="whisper-1", file=audio_file) + transcript = litellm.transcription( + model="whisper-1", + file=audio_file, + ) print(f"transcript: {transcript}") -test_transcription() +# test_transcription() + + +def test_transcription_azure(): + transcript = litellm.transcription( + model="azure/azure-whisper", + file=audio_file, + api_base=os.getenv("AZURE_EUROPE_API_BASE"), + api_key=os.getenv("AZURE_EUROPE_API_KEY"), + api_version=os.getenv("2024-02-15-preview"), + ) + + assert transcript.text is not None + assert isinstance(transcript.text, str) + + +# test_transcription_azure() + + +@pytest.mark.asyncio +async def test_transcription_async_azure(): + transcript = await litellm.atranscription( + model="azure/azure-whisper", + file=audio_file, + api_base=os.getenv("AZURE_EUROPE_API_BASE"), + api_key=os.getenv("AZURE_EUROPE_API_KEY"), + api_version=os.getenv("2024-02-15-preview"), + ) + + assert transcript.text is not None + assert isinstance(transcript.text, str) + + +# asyncio.run(test_transcription_async_azure()) + + +@pytest.mark.asyncio +async def test_transcription_async_openai(): + transcript = await litellm.atranscription( + model="whisper-1", + file=audio_file, + ) + + assert transcript.text is not None + assert isinstance(transcript.text, str) From 321769a74dbaa2c8d7dd94688a64a568f235c883 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 13:50:34 -0800 Subject: [PATCH 228/304] build(model_prices_and_context_window.json): add pricing for whisper endpoints (openai + azure) --- litellm/model_prices_and_context_window_backup.json | 12 ++++++++++++ model_prices_and_context_window.json | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index d56450b23..18c4b0d9a 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -293,6 +293,18 @@ "output_cost_per_pixel": 0.0, "litellm_provider": "openai" }, + "whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "openai" + }, + "azure/whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "azure" + }, "azure/gpt-4-0125-preview": { "max_tokens": 128000, "max_input_tokens": 128000, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index d56450b23..18c4b0d9a 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -293,6 +293,18 @@ "output_cost_per_pixel": 0.0, "litellm_provider": "openai" }, + "whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "openai" + }, + "azure/whisper-1": { + "mode": "audio_transcription", + "input_cost_per_second": 0, + "output_cost_per_second": 0.0001, + "litellm_provider": "azure" + }, "azure/gpt-4-0125-preview": { "max_tokens": 128000, "max_input_tokens": 128000, From ae54b398d29c773b5a89a6cf7b0396d97f8ac370 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 13:58:15 -0800 Subject: [PATCH 229/304] feat(router.py): add load balancing for async transcription calls --- litellm/main.py | 1 + litellm/router.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/litellm/main.py b/litellm/main.py index f1a745fcc..a04dba4ec 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -3313,6 +3313,7 @@ def image_generation( ##### Transcription ####################### +@client async def atranscription(*args, **kwargs): """ Calls openai + azure whisper endpoints. diff --git a/litellm/router.py b/litellm/router.py index d4c0be862..10f7058b3 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -9,7 +9,7 @@ import copy, httpx from datetime import datetime -from typing import Dict, List, Optional, Union, Literal, Any +from typing import Dict, List, Optional, Union, Literal, Any, BinaryIO import random, threading, time, traceback, uuid import litellm, openai from litellm.caching import RedisCache, InMemoryCache, DualCache @@ -633,6 +633,84 @@ class Router: self.fail_calls[model_name] += 1 raise e + async def atranscription(self, file: BinaryIO, model: str, **kwargs): + try: + kwargs["model"] = model + kwargs["file"] = file + kwargs["original_function"] = self._atranscription + kwargs["num_retries"] = kwargs.get("num_retries", self.num_retries) + timeout = kwargs.get("request_timeout", self.timeout) + kwargs.setdefault("metadata", {}).update({"model_group": model}) + response = await self.async_function_with_fallbacks(**kwargs) + + return response + except Exception as e: + raise e + + async def _atranscription(self, file: BinaryIO, model: str, **kwargs): + try: + verbose_router_logger.debug( + f"Inside _atranscription()- model: {model}; kwargs: {kwargs}" + ) + deployment = self.get_available_deployment( + model=model, + messages=[{"role": "user", "content": "prompt"}], + specific_deployment=kwargs.pop("specific_deployment", None), + ) + kwargs.setdefault("metadata", {}).update( + { + "deployment": deployment["litellm_params"]["model"], + "model_info": deployment.get("model_info", {}), + } + ) + kwargs["model_info"] = deployment.get("model_info", {}) + data = deployment["litellm_params"].copy() + model_name = data["model"] + for k, v in self.default_litellm_params.items(): + if ( + k not in kwargs + ): # prioritize model-specific params > default router params + kwargs[k] = v + elif k == "metadata": + kwargs[k].update(v) + + potential_model_client = self._get_client( + deployment=deployment, kwargs=kwargs, client_type="async" + ) + # check if provided keys == client keys # + dynamic_api_key = kwargs.get("api_key", None) + if ( + dynamic_api_key is not None + and potential_model_client is not None + and dynamic_api_key != potential_model_client.api_key + ): + model_client = None + else: + model_client = potential_model_client + + self.total_calls[model_name] += 1 + response = await litellm.atranscription( + **{ + **data, + "file": file, + "caching": self.cache_responses, + "client": model_client, + **kwargs, + } + ) + self.success_calls[model_name] += 1 + verbose_router_logger.info( + f"litellm.atranscription(model={model_name})\033[32m 200 OK\033[0m" + ) + return response + except Exception as e: + verbose_router_logger.info( + f"litellm.atranscription(model={model_name})\033[31m Exception {str(e)}\033[0m" + ) + if model_name is not None: + self.fail_calls[model_name] += 1 + raise e + async def amoderation(self, model: str, input: str, **kwargs): try: kwargs["model"] = model From 6fa585d001d6c1ed5cf3ee2812f407186554da32 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 14:02:34 -0800 Subject: [PATCH 230/304] test(test_whisper.py): fix test --- tests/test_whisper.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 9d8f038c2..9090f42d6 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -8,7 +8,11 @@ import sys, os, dotenv from typing import Optional from dotenv import load_dotenv -audio_file = open("./gettysburg.wav", "rb") +pwd = os.getcwd() +print(pwd) + +file_path = os.path.join(pwd, "gettysburg.wav") +audio_file = open(file_path, "rb") load_dotenv() From 9274245a0b6f178d0d83fc14b9f618f332413a2c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 14:10:19 -0800 Subject: [PATCH 231/304] test(test_whisper.py): fix getting path for audio file in test --- tests/test_whisper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 9090f42d6..78e885ad3 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -8,7 +8,8 @@ import sys, os, dotenv from typing import Optional from dotenv import load_dotenv -pwd = os.getcwd() +# Get the current directory of the file being run +pwd = os.path.dirname(os.path.realpath(__file__)) print(pwd) file_path = os.path.join(pwd, "gettysburg.wav") From fe125a5131cd73321791adc79d84498c5dbf20d3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 14:19:37 -0800 Subject: [PATCH 232/304] test(test_whisper.py): add testing for load balancing whisper endpoints on router --- litellm/router.py | 22 ++++++++++++++++++++ tests/test_whisper.py | 47 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/litellm/router.py b/litellm/router.py index 10f7058b3..71339aa36 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -634,6 +634,28 @@ class Router: raise e async def atranscription(self, file: BinaryIO, model: str, **kwargs): + """ + Example Usage: + + ``` + from litellm import Router + client = Router(model_list = [ + { + "model_name": "whisper", + "litellm_params": { + "model": "whisper-1", + }, + }, + ]) + + audio_file = open("speech.mp3", "rb") + transcript = await client.atranscription( + model="whisper", + file=audio_file + ) + + ``` + """ try: kwargs["model"] = model kwargs["file"] = file diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 9d8f038c2..bb0971732 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -1,14 +1,20 @@ # What is this? -## Tests `litellm.transcription` endpoint +## Tests `litellm.transcription` endpoint. Outside litellm module b/c of audio file used in testing (it's ~700kb). + import pytest import asyncio, time -import aiohttp +import aiohttp, traceback from openai import AsyncOpenAI import sys, os, dotenv from typing import Optional from dotenv import load_dotenv -audio_file = open("./gettysburg.wav", "rb") +pwd = os.path.dirname(os.path.realpath(__file__)) +print(pwd) + +file_path = os.path.join(pwd, "gettysburg.wav") + +audio_file = open(file_path, "rb") load_dotenv() @@ -16,6 +22,7 @@ sys.path.insert( 0, os.path.abspath("../") ) # Adds the parent directory to the system path import litellm +from litellm import Router def test_transcription(): @@ -71,3 +78,37 @@ async def test_transcription_async_openai(): assert transcript.text is not None assert isinstance(transcript.text, str) + + +@pytest.mark.asyncio +async def test_transcription_on_router(): + litellm.set_verbose = True + print("\n Testing async transcription on router\n") + try: + model_list = [ + { + "model_name": "whisper", + "litellm_params": { + "model": "whisper-1", + }, + }, + { + "model_name": "whisper", + "litellm_params": { + "model": "azure/azure-whisper", + "api_base": os.getenv("AZURE_EUROPE_API_BASE"), + "api_key": os.getenv("AZURE_EUROPE_API_KEY"), + "api_version": os.getenv("2024-02-15-preview"), + }, + }, + ] + + router = Router(model_list=model_list) + response = await router.atranscription( + model="whisper", + file=audio_file, + ) + print(response) + except Exception as e: + traceback.print_exc() + pytest.fail(f"Error occurred: {e}") From 8c6d5b7f16549b740b4f7c2739f224ab29295fa0 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 14:28:07 -0800 Subject: [PATCH 233/304] feat(proxy_server.py): supports `/audio/transcription` endpoint on proxy --- litellm/proxy/proxy_server.py | 147 ++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 19ac5c961..c90f14a97 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3213,6 +3213,153 @@ async def image_generation( ) +@router.post( + "/v1/audio/transcriptions", + dependencies=[Depends(user_api_key_auth)], + response_class=ORJSONResponse, + tags=["image generation"], +) +@router.post( + "/audio/transcriptions", + dependencies=[Depends(user_api_key_auth)], + response_class=ORJSONResponse, + tags=["image generation"], +) +async def audio_transcriptions( + request: Request, + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """ + Same params as: + + https://platform.openai.com/docs/api-reference/audio/createTranscription?lang=curl + """ + global proxy_logging_obj + try: + # Use orjson to parse JSON data, orjson speeds up requests significantly + body = await request.body() + data = orjson.loads(body) + + # Include original request and headers in the data + data["proxy_server_request"] = { + "url": str(request.url), + "method": request.method, + "headers": dict(request.headers), + "body": copy.copy(data), # use copy instead of deepcopy + } + + if data.get("user", None) is None and user_api_key_dict.user_id is not None: + data["user"] = user_api_key_dict.user_id + + data["model"] = ( + general_settings.get("moderation_model", None) # server default + or user_model # model name passed via cli args + or data["model"] # default passed in http request + ) + if user_model: + data["model"] = user_model + + if "metadata" not in data: + data["metadata"] = {} + data["metadata"]["user_api_key"] = user_api_key_dict.api_key + data["metadata"]["user_api_key_metadata"] = user_api_key_dict.metadata + _headers = dict(request.headers) + _headers.pop( + "authorization", None + ) # do not store the original `sk-..` api key in the db + data["metadata"]["headers"] = _headers + data["metadata"]["user_api_key_alias"] = getattr( + user_api_key_dict, "key_alias", None + ) + data["metadata"]["user_api_key_user_id"] = user_api_key_dict.user_id + data["metadata"]["user_api_key_team_id"] = getattr( + user_api_key_dict, "team_id", None + ) + data["metadata"]["endpoint"] = str(request.url) + + ### TEAM-SPECIFIC PARAMS ### + if user_api_key_dict.team_id is not None: + team_config = await proxy_config.load_team_config( + team_id=user_api_key_dict.team_id + ) + if len(team_config) == 0: + pass + else: + team_id = team_config.pop("team_id", None) + data["metadata"]["team_id"] = team_id + data = { + **team_config, + **data, + } # add the team-specific configs to the completion call + + router_model_names = ( + [m["model_name"] for m in llm_model_list] + if llm_model_list is not None + else [] + ) + + ### CALL HOOKS ### - modify incoming data / reject request before calling the model + data = await proxy_logging_obj.pre_call_hook( + user_api_key_dict=user_api_key_dict, data=data, call_type="moderation" + ) + + start_time = time.time() + + ## ROUTE TO CORRECT ENDPOINT ## + # skip router if user passed their key + if "api_key" in data: + response = await litellm.atranscription(**data) + elif ( + llm_router is not None and data["model"] in router_model_names + ): # model in router model list + response = await llm_router.atranscription(**data) + elif ( + llm_router is not None and data["model"] in llm_router.deployment_names + ): # model in router deployments, calling a specific deployment on the router + response = await llm_router.atranscription(**data, specific_deployment=True) + elif ( + llm_router is not None + and llm_router.model_group_alias is not None + and data["model"] in llm_router.model_group_alias + ): # model set in model_group_alias + response = await llm_router.atranscription( + **data + ) # ensure this goes the llm_router, router will do the correct alias mapping + elif user_model is not None: # `litellm --model ` + response = await litellm.atranscription(**data) + else: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail={"error": "Invalid model name passed in"}, + ) + + ### ALERTING ### + data["litellm_status"] = "success" # used for alerting + + return response + except Exception as e: + await proxy_logging_obj.post_call_failure_hook( + user_api_key_dict=user_api_key_dict, original_exception=e + ) + traceback.print_exc() + if isinstance(e, HTTPException): + raise ProxyException( + message=getattr(e, "message", str(e)), + type=getattr(e, "type", "None"), + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), + ) + else: + error_traceback = traceback.format_exc() + error_msg = f"{str(e)}\n\n{error_traceback}" + raise ProxyException( + message=getattr(e, "message", error_msg), + type=getattr(e, "type", "None"), + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", 500), + ) + + @router.post( "/v1/moderations", dependencies=[Depends(user_api_key_auth)], From cc0294b2f2346c0870b446112dc1fdc9826e1676 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 14:29:31 -0800 Subject: [PATCH 234/304] fix(proxy_server.py): fix tagging of endpoints --- litellm/proxy/proxy_server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index c90f14a97..27eeea573 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3066,13 +3066,13 @@ async def embeddings( "/v1/images/generations", dependencies=[Depends(user_api_key_auth)], response_class=ORJSONResponse, - tags=["image generation"], + tags=["images"], ) @router.post( "/images/generations", dependencies=[Depends(user_api_key_auth)], response_class=ORJSONResponse, - tags=["image generation"], + tags=["images"], ) async def image_generation( request: Request, @@ -3217,13 +3217,13 @@ async def image_generation( "/v1/audio/transcriptions", dependencies=[Depends(user_api_key_auth)], response_class=ORJSONResponse, - tags=["image generation"], + tags=["audio"], ) @router.post( "/audio/transcriptions", dependencies=[Depends(user_api_key_auth)], response_class=ORJSONResponse, - tags=["image generation"], + tags=["audio"], ) async def audio_transcriptions( request: Request, From 2d71f54afbb2a29d9ceb7783524c7e39ad22e366 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 15:18:06 -0800 Subject: [PATCH 235/304] (docs) load test litellm --- docs/my-website/docs/load_test.md | 82 ++++++++++++++++++++++++++- docs/my-website/docs/proxy/deploy.md | 14 ----- docs/my-website/img/locust.png | Bin 0 -> 111279 bytes 3 files changed, 81 insertions(+), 15 deletions(-) create mode 100644 docs/my-website/img/locust.png diff --git a/docs/my-website/docs/load_test.md b/docs/my-website/docs/load_test.md index f568b5696..94165fb7b 100644 --- a/docs/my-website/docs/load_test.md +++ b/docs/my-website/docs/load_test.md @@ -1,5 +1,84 @@ +import Image from '@theme/IdealImage'; + # 🔥 Load Test LiteLLM +## Load Test LiteLLM Proxy - 1500+ req/s + +## 1500+ concurrent requests/s + +LiteLLM proxy has been load tested to handle 1500+ concurrent req/s + +```python +import time, asyncio +from openai import AsyncOpenAI, AsyncAzureOpenAI +import uuid +import traceback + +# base_url - litellm proxy endpoint +# api_key - litellm proxy api-key, is created proxy with auth +litellm_client = AsyncOpenAI(base_url="http://0.0.0.0:4000", api_key="sk-1234") + + +async def litellm_completion(): + # Your existing code for litellm_completion goes here + try: + response = await litellm_client.chat.completions.create( + model="azure-gpt-3.5", + messages=[{"role": "user", "content": f"This is a test: {uuid.uuid4()}"}], + ) + print(response) + return response + + except Exception as e: + # If there's an exception, log the error message + with open("error_log.txt", "a") as error_log: + error_log.write(f"Error during completion: {str(e)}\n") + pass + + +async def main(): + for i in range(1): + start = time.time() + n = 1500 # Number of concurrent tasks + tasks = [litellm_completion() for _ in range(n)] + + chat_completions = await asyncio.gather(*tasks) + + successful_completions = [c for c in chat_completions if c is not None] + + # Write errors to error_log.txt + with open("error_log.txt", "a") as error_log: + for completion in chat_completions: + if isinstance(completion, str): + error_log.write(completion + "\n") + + print(n, time.time() - start, len(successful_completions)) + time.sleep(10) + + +if __name__ == "__main__": + # Blank out contents of error_log.txt + open("error_log.txt", "w").close() + + asyncio.run(main()) + +``` + +### Throughput - 30% Increase +LiteLLM proxy + Load Balancer gives **30% increase** in throughput compared to Raw OpenAI API + + +### Latency Added - 0.00325 seconds +LiteLLM proxy adds **0.00325 seconds** latency as compared to using the Raw OpenAI API + + + +### Testing LiteLLM Proxy with Locust +- 1 LiteLLM container can handle ~140 requests/second with 0.4 failures + + + +## Load Test LiteLLM SDK vs OpenAI Here is a script to load test LiteLLM vs OpenAI ```python @@ -84,4 +163,5 @@ async def loadtest_fn(): # Run the event loop to execute the async function asyncio.run(loadtest_fn()) -``` \ No newline at end of file +``` + diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 6de8625d0..4b51f094c 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -350,17 +350,3 @@ Run the command `docker-compose up` or `docker compose up` as per your docker in Your LiteLLM container should be running now on the defined port e.g. `8000`. - - - -## LiteLLM Proxy Performance - -LiteLLM proxy has been load tested to handle 1500 req/s. - -### Throughput - 30% Increase -LiteLLM proxy + Load Balancer gives **30% increase** in throughput compared to Raw OpenAI API - - -### Latency Added - 0.00325 seconds -LiteLLM proxy adds **0.00325 seconds** latency as compared to using the Raw OpenAI API - diff --git a/docs/my-website/img/locust.png b/docs/my-website/img/locust.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcedf1d04b7b4debe3824113e4ea724f9bd4f8b GIT binary patch literal 111279 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�ex$cH^=p?6($O}b>Hb~GD_q05pzC;rZGrHAEZ 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 v{+g6rw`siVYK%vB3T$}N*+GN4OBWBm3)v8H literal 0 HcmV?d00001 From 9ed51e791b2c82ffda88767bc64a0f856f37c572 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 15:24:08 -0800 Subject: [PATCH 236/304] (fix) default num workers --- litellm/proxy/proxy_cli.py | 9 +++- .../proxy_load_test/litellm_proxy_config.yaml | 6 +++ litellm/proxy/proxy_load_test/locustfile.py | 27 ++++++++++ .../proxy/proxy_load_test/openai_endpoint.py | 50 +++++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 litellm/proxy/proxy_load_test/litellm_proxy_config.yaml create mode 100644 litellm/proxy/proxy_load_test/locustfile.py create mode 100644 litellm/proxy/proxy_load_test/openai_endpoint.py diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index f7eba02ec..367bbbb70 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -16,6 +16,13 @@ from importlib import resources import shutil telemetry = None +default_num_workers = 1 +try: + default_num_workers = os.cpu_count() or 1 + if default_num_workers is not None and default_num_workers > 0: + default_num_workers -= 1 +except: + pass def append_query_params(url, params): @@ -57,7 +64,7 @@ def is_port_in_use(port): @click.option("--port", default=8000, help="Port to bind the server to.", envvar="PORT") @click.option( "--num_workers", - default=1, + default=default_num_workers, help="Number of gunicorn workers to spin up", envvar="NUM_WORKERS", ) diff --git a/litellm/proxy/proxy_load_test/litellm_proxy_config.yaml b/litellm/proxy/proxy_load_test/litellm_proxy_config.yaml new file mode 100644 index 000000000..2e107d366 --- /dev/null +++ b/litellm/proxy/proxy_load_test/litellm_proxy_config.yaml @@ -0,0 +1,6 @@ +model_list: + - model_name: gpt-3.5-turbo + litellm_params: + model: openai/my-fake-model + api_key: my-fake-key + api_base: http://0.0.0.0:8090 \ No newline at end of file diff --git a/litellm/proxy/proxy_load_test/locustfile.py b/litellm/proxy/proxy_load_test/locustfile.py new file mode 100644 index 000000000..2cd2e2fcc --- /dev/null +++ b/litellm/proxy/proxy_load_test/locustfile.py @@ -0,0 +1,27 @@ +from locust import HttpUser, task, between + + +class MyUser(HttpUser): + wait_time = between(1, 5) + + @task + def chat_completion(self): + headers = { + "Content-Type": "application/json", + # Include any additional headers you may need for authentication, etc. + } + + # Customize the payload with "model" and "messages" keys + payload = { + "model": "gpt-3.5-turbo", + "messages": [ + {"role": "system", "content": "You are a chat bot."}, + {"role": "user", "content": "Hello, how are you?"}, + ], + # Add more data as necessary + } + + # Make a POST request to the "chat/completions" endpoint + response = self.client.post("chat/completions", json=payload, headers=headers) + + # Print or log the response if needed diff --git a/litellm/proxy/proxy_load_test/openai_endpoint.py b/litellm/proxy/proxy_load_test/openai_endpoint.py new file mode 100644 index 000000000..b3291ce70 --- /dev/null +++ b/litellm/proxy/proxy_load_test/openai_endpoint.py @@ -0,0 +1,50 @@ +# import sys, os +# sys.path.insert( +# 0, os.path.abspath("../") +# ) # Adds the parent directory to the system path +from fastapi import FastAPI, Request, status, HTTPException, Depends +from fastapi.responses import StreamingResponse +from fastapi.security import OAuth2PasswordBearer +from fastapi.middleware.cors import CORSMiddleware + +app = FastAPI() + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +# for completion +@app.post("/chat/completions") +@app.post("/v1/chat/completions") +async def completion(request: Request): + return { + "id": "chatcmpl-123", + "object": "chat.completion", + "created": 1677652288, + "model": "gpt-3.5-turbo-0125", + "system_fingerprint": "fp_44709d6fcb", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "\n\nHello there, how may I assist you today?", + }, + "logprobs": None, + "finish_reason": "stop", + } + ], + "usage": {"prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21}, + } + + +if __name__ == "__main__": + import uvicorn + + # run this on 8090, 8091, 8092 and 8093 + uvicorn.run(app, host="0.0.0.0", port=8090) From 986a5267907b4263db6af8c86b462aff2808cdd8 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 16:25:54 -0800 Subject: [PATCH 237/304] (feat) disable logging per request --- litellm/main.py | 2 ++ litellm/utils.py | 15 +++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index 63649844a..76742eb06 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -563,6 +563,7 @@ def completion( "caching_groups", "ttl", "cache", + "no-log", ] default_params = openai_params + litellm_params non_default_params = { @@ -2417,6 +2418,7 @@ def embedding( "caching_groups", "ttl", "cache", + "no-log", ] default_params = openai_params + litellm_params non_default_params = { diff --git a/litellm/utils.py b/litellm/utils.py index 38836a4bc..01fab699a 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -2985,12 +2985,15 @@ def client(original_function): print_verbose( f"Async Wrapper: Completed Call, calling async_success_handler: {logging_obj.async_success_handler}" ) - asyncio.create_task( - logging_obj.async_success_handler(result, start_time, end_time) - ) - threading.Thread( - target=logging_obj.success_handler, args=(result, start_time, end_time) - ).start() + # check if user does not want this to be logged + if kwargs.get("no-log", False) == False: + asyncio.create_task( + logging_obj.async_success_handler(result, start_time, end_time) + ) + threading.Thread( + target=logging_obj.success_handler, + args=(result, start_time, end_time), + ).start() # RETURN RESULT if hasattr(result, "_hidden_params"): From 4ff68c85623d4c3a52cde986a69d9f29ee0c4ab5 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 16:26:25 -0800 Subject: [PATCH 238/304] (docs) no log requests --- docs/my-website/docs/proxy/enterprise.md | 51 +++++++++++++++++++----- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/docs/my-website/docs/proxy/enterprise.md b/docs/my-website/docs/proxy/enterprise.md index a4f3ea7b1..e0c5374f0 100644 --- a/docs/my-website/docs/proxy/enterprise.md +++ b/docs/my-website/docs/proxy/enterprise.md @@ -12,14 +12,16 @@ Features here are behind a commercial license in our `/enterprise` folder. [**Se ::: Features: -- [ ] Content Moderation with LlamaGuard -- [ ] Content Moderation with Google Text Moderations -- [ ] Content Moderation with LLM Guard -- [ ] Reject calls from Blocked User list -- [ ] Reject calls (incoming / outgoing) with Banned Keywords (e.g. competitors) -- [ ] Tracking Spend for Custom Tags +- ✅ Content Moderation with LlamaGuard +- ✅ Content Moderation with Google Text Moderations +- ✅ Content Moderation with LLM Guard +- ✅ Reject calls from Blocked User list +- ✅ Reject calls (incoming / outgoing) with Banned Keywords (e.g. competitors) +- ✅ Don't log/store specific requests (eg confidential LLM requests) +- ✅ Tracking Spend for Custom Tags -## Content Moderation with LlamaGuard +## Content Moderation +### Content Moderation with LlamaGuard Currently works with Sagemaker's LlamaGuard endpoint. @@ -39,7 +41,7 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "" os.environ["AWS_REGION_NAME"] = "" ``` -### Customize LlamaGuard prompt +#### Customize LlamaGuard prompt To modify the unsafe categories llama guard evaluates against, just create your own version of [this category list](https://github.com/BerriAI/litellm/blob/main/litellm/proxy/llamaguard_prompt.txt) @@ -51,7 +53,7 @@ callbacks: ["llamaguard_moderations"] llamaguard_unsafe_content_categories: /path/to/llamaguard_prompt.txt ``` -## Content Moderation with LLM Guard +### Content Moderation with LLM Guard Set the LLM Guard API Base in your environment @@ -78,7 +80,7 @@ Expected results: LLM Guard: Received response - {"sanitized_prompt": "hello world", "is_valid": true, "scanners": { "Regex": 0.0 }} ``` -## Content Moderation with Google Text Moderation +### Content Moderation with Google Text Moderation Requires your GOOGLE_APPLICATION_CREDENTIALS to be set in your .env (same as VertexAI). @@ -89,7 +91,7 @@ litellm_settings: callbacks: ["google_text_moderation"] ``` -### Set custom confidence thresholds +#### Set custom confidence thresholds Google Moderations checks the test against several categories. [Source](https://cloud.google.com/natural-language/docs/moderating-text#safety_attribute_confidence_scores) @@ -133,6 +135,33 @@ Here are the category specific values: | "legal" | legal_threshold: 0.1 | +## Incognito Requests - Don't log anything + +When `no-log=True`, the request will **not be logged on any callbacks** and there will be **no server logs on litellm** + +```python +import openai +client = openai.OpenAI( + api_key="anything", # proxy api-key + base_url="http://0.0.0.0:8000" # litellm proxy +) + +response = client.chat.completions.create( + model="gpt-3.5-turbo", + messages = [ + { + "role": "user", + "content": "this is a test request, write a short poem" + } + ], + extra_body={ + "no-log": True + } +) + +print(response) +``` + ## Enable Blocked User Lists If any call is made to proxy with this user id, it'll be rejected - use this if you want to let users opt-out of ai features From d6dc28f0ed2d11329d23370071fef7f903e5f599 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 16:27:53 -0800 Subject: [PATCH 239/304] (fix) proxy setting success callbacks --- litellm/proxy/proxy_config.yaml | 9 +++------ litellm/proxy/proxy_server.py | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index 654a50b2f..76c9ed04c 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -5,12 +5,9 @@ model_list: api_base: os.environ/AZURE_API_BASE api_key: os.environ/AZURE_API_KEY api_version: "2023-07-01-preview" - - model_name: azure-gpt-3.5 - litellm_params: - model: gpt-3.5-turbo - api_key: os.environ/OPENAI_API_KEY - model_info: - access_groups: ["public"] +litellm_settings: + set_verbose: True + success_callback: ["langfuse"] router_settings: set_verbose: True debug_level: "DEBUG" \ No newline at end of file diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 19ac5c961..810fdc0d1 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1675,9 +1675,9 @@ class ProxyConfig: # these are litellm callbacks - "langfuse", "sentry", "wandb" else: litellm.success_callback.append(callback) - verbose_proxy_logger.debug( + print( # noqa f"{blue_color_code} Initialized Success Callbacks - {litellm.success_callback} {reset_color_code}" - ) + ) # noqa elif key == "failure_callback": litellm.failure_callback = [] From ddd231a8c23557131a099f5ea26f7b1ba5f7a4a4 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 16:46:38 -0800 Subject: [PATCH 240/304] (feat) use no-log as a litellm param --- litellm/main.py | 3 +++ litellm/utils.py | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index 76742eb06..c8a8dbc1c 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -487,6 +487,8 @@ def completion( ### ASYNC CALLS ### acompletion = kwargs.get("acompletion", False) client = kwargs.get("client", None) + ### Admin Controls ### + no_log = kwargs.get("no-log", False) ######## end of unpacking kwargs ########### openai_params = [ "functions", @@ -727,6 +729,7 @@ def completion( model_info=model_info, proxy_server_request=proxy_server_request, preset_cache_key=preset_cache_key, + no_log=no_log, ) logging.update_environment_variables( model=model, diff --git a/litellm/utils.py b/litellm/utils.py index 01fab699a..163223ab2 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1279,6 +1279,10 @@ class Logging: for callback in callbacks: try: + litellm_params = self.model_call_details.get("litellm_params", {}) + if litellm_params.get("no-log", False) == True: + print_verbose("no-log request, skipping logging") + continue if callback == "lite_debugger": print_verbose("reaches lite_debugger for logging!") print_verbose(f"liteDebuggerClient: {liteDebuggerClient}") @@ -1708,6 +1712,9 @@ class Logging: verbose_logger.debug(f"Async success callbacks: {callbacks}") for callback in callbacks: try: + if kwargs.get("no-log", False) == True: + print_verbose("no-log request, skipping logging") + continue if callback == "cache" and litellm.cache is not None: # set_cache once complete streaming response is built print_verbose("async success_callback: reaches cache for logging!") @@ -2986,14 +2993,13 @@ def client(original_function): f"Async Wrapper: Completed Call, calling async_success_handler: {logging_obj.async_success_handler}" ) # check if user does not want this to be logged - if kwargs.get("no-log", False) == False: - asyncio.create_task( - logging_obj.async_success_handler(result, start_time, end_time) - ) - threading.Thread( - target=logging_obj.success_handler, - args=(result, start_time, end_time), - ).start() + asyncio.create_task( + logging_obj.async_success_handler(result, start_time, end_time) + ) + threading.Thread( + target=logging_obj.success_handler, + args=(result, start_time, end_time), + ).start() # RETURN RESULT if hasattr(result, "_hidden_params"): @@ -3895,6 +3901,7 @@ def get_litellm_params( proxy_server_request=None, acompletion=None, preset_cache_key=None, + no_log=None, ): litellm_params = { "acompletion": acompletion, @@ -3911,6 +3918,7 @@ def get_litellm_params( "model_info": model_info, "proxy_server_request": proxy_server_request, "preset_cache_key": preset_cache_key, + "no-log": no_log, "stream_response": {}, # litellm_call_id: ModelResponse Dict } From 0a538fe679a066608bbf997d5d96d646f52adb90 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 16:56:20 -0800 Subject: [PATCH 241/304] (feat) use no-log to disable per request logging --- litellm/utils.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 163223ab2..32f0f765b 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1281,8 +1281,13 @@ class Logging: try: litellm_params = self.model_call_details.get("litellm_params", {}) if litellm_params.get("no-log", False) == True: - print_verbose("no-log request, skipping logging") - continue + # proxy cost tracking cal backs should run + if not ( + isinstance(callback, CustomLogger) + and "_PROXY_" in callback.__class__.__name__ + ): + print_verbose("no-log request, skipping logging") + continue if callback == "lite_debugger": print_verbose("reaches lite_debugger for logging!") print_verbose(f"liteDebuggerClient: {liteDebuggerClient}") @@ -1711,6 +1716,16 @@ class Logging: callbacks = litellm._async_success_callback verbose_logger.debug(f"Async success callbacks: {callbacks}") for callback in callbacks: + # check if callback can run for this request + litellm_params = self.model_call_details.get("litellm_params", {}) + if litellm_params.get("no-log", False) == True: + # proxy cost tracking cal backs should run + if not ( + isinstance(callback, CustomLogger) + and "_PROXY_" in callback.__class__.__name__ + ): + print_verbose("no-log request, skipping logging") + continue try: if kwargs.get("no-log", False) == True: print_verbose("no-log request, skipping logging") From 37b4dde7fd3ade2eae5a5f5c6dcc11fed5e0d1a3 Mon Sep 17 00:00:00 2001 From: Guillermo Date: Sat, 9 Mar 2024 02:24:07 +0100 Subject: [PATCH 242/304] Add quickstart deploy with k8s --- docs/my-website/docs/proxy/deploy.md | 64 ++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 4b51f094c..b2e48d522 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -68,6 +68,70 @@ CMD ["--port", "4000", "--config", "config.yaml", "--detailed_debug", "--run_gun + + +Deploying a config file based litellm instance, just requires a simple deployment that loads +the config.yaml file via a config map. + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: litellm-config-file +data: + config.yaml: | + model_list: + - model_name: gpt-3.5-turbo # user-facing model alias + litellm_params: # all params accepted by litellm.completion() - https://docs.litellm.ai/docs/completion/input + model: azure/ + api_base: + api_key: + - model_name: gpt-3.5-turbo + litellm_params: + model: azure/gpt-turbo-small-ca + api_base: https://my-endpoint-canada-berri992.openai.azure.com/ + api_key: + - model_name: vllm-model + litellm_params: + model: openai/ + api_base: # e.g. http://0.0.0.0:3000 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: litellm-deployment + labels: + app: litellm +spec: + selector: + matchLabels: + app: litellm + template: + metadata: + labels: + app: litellm + spec: + containers: + - name: litellm + image: ghcr.io/berriai/litellm:main-latest # it is recommended to fix a version generally + ports: + - containerPort: 4000 + volumeMounts: + - name: config-volume + mountPath: /app/proxy_server_config.yaml + subPath: config.yaml + envFrom: + - secretRef: + name: litellm-secrets + volumes: + - name: config-volume + configMap: + name: litellm-config-file + +``` + + + ## Deploy with Database From bb427b465982905a54c4a5b836ae9aab93cdbe8f Mon Sep 17 00:00:00 2001 From: Guillermo Date: Sat, 9 Mar 2024 02:30:17 +0100 Subject: [PATCH 243/304] Update deploy.md --- docs/my-website/docs/proxy/deploy.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index b2e48d522..0ce9c0005 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -70,8 +70,9 @@ CMD ["--port", "4000", "--config", "config.yaml", "--detailed_debug", "--run_gun -Deploying a config file based litellm instance, just requires a simple deployment that loads -the config.yaml file via a config map. +Deploying a config file based litellm instance just requires a simple deployment that loads +the config.yaml file via a config map. Also it would be a good practice to use the env var +declaration for api keys, and attach the env vars with the api key values as an opaque secret. ```yaml apiVersion: v1 @@ -81,20 +82,19 @@ metadata: data: config.yaml: | model_list: - - model_name: gpt-3.5-turbo # user-facing model alias - litellm_params: # all params accepted by litellm.completion() - https://docs.litellm.ai/docs/completion/input - model: azure/ - api_base: - api_key: - model_name: gpt-3.5-turbo litellm_params: model: azure/gpt-turbo-small-ca api_base: https://my-endpoint-canada-berri992.openai.azure.com/ - api_key: - - model_name: vllm-model - litellm_params: - model: openai/ - api_base: # e.g. http://0.0.0.0:3000 + api_key: os.environ/CA_AZURE_OPENAI_API_KEY +--- +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: litellm-secrets +data: + CA_AZURE_OPENAI_API_KEY: bWVvd19pbV9hX2NhdA== # your api key in base64 --- apiVersion: apps/v1 kind: Deployment @@ -127,7 +127,6 @@ spec: - name: config-volume configMap: name: litellm-config-file - ``` From 0fb7afe8202c65e277e962cc0571207cad357e67 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 18:20:27 -0800 Subject: [PATCH 244/304] feat(proxy_server.py): working `/audio/transcription` endpoint --- litellm/llms/azure.py | 27 +++++++--- litellm/llms/openai.py | 4 +- litellm/main.py | 7 +-- litellm/proxy/proxy_server.py | 95 +++++++++++++++++++++-------------- litellm/utils.py | 14 ++++-- tests/test_whisper.py | 2 +- 6 files changed, 95 insertions(+), 54 deletions(-) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index e19023b03..022266996 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -770,9 +770,8 @@ class AzureChatCompletion(BaseLLM): api_version: Optional[str] = None, client=None, azure_ad_token: Optional[str] = None, - max_retries=None, logging_obj=None, - atranscriptions: bool = False, + atranscription: bool = False, ): data = {"model": model, "file": audio_file, **optional_params} @@ -781,9 +780,11 @@ class AzureChatCompletion(BaseLLM): "api_version": api_version, "azure_endpoint": api_base, "azure_deployment": model, - "max_retries": max_retries, "timeout": timeout, } + + max_retries = optional_params.pop("max_retries", None) + azure_client_params = select_azure_base_url_or_endpoint( azure_client_params=azure_client_params ) @@ -792,7 +793,10 @@ class AzureChatCompletion(BaseLLM): elif azure_ad_token is not None: azure_client_params["azure_ad_token"] = azure_ad_token - if atranscriptions == True: + if max_retries is not None: + azure_client_params["max_retries"] = max_retries + + if atranscription == True: return self.async_audio_transcriptions( audio_file=audio_file, data=data, @@ -845,18 +849,29 @@ class AzureChatCompletion(BaseLLM): ) else: async_azure_client = client + response = await async_azure_client.audio.transcriptions.create( **data, timeout=timeout ) # type: ignore + stringified_response = response.model_dump() + ## LOGGING logging_obj.post_call( input=audio_file.name, api_key=api_key, - additional_args={"complete_input_dict": data}, + additional_args={ + "headers": { + "Authorization": f"Bearer {async_azure_client.api_key}" + }, + "api_base": async_azure_client._base_url._uri_reference, + "atranscription": True, + "complete_input_dict": data, + }, original_response=stringified_response, ) - return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="image_generation") # type: ignore + response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + return response except Exception as e: ## LOGGING logging_obj.post_call( diff --git a/litellm/llms/openai.py b/litellm/llms/openai.py index fca950d31..a90d2457a 100644 --- a/litellm/llms/openai.py +++ b/litellm/llms/openai.py @@ -779,10 +779,10 @@ class OpenAIChatCompletion(BaseLLM): client=None, max_retries=None, logging_obj=None, - atranscriptions: bool = False, + atranscription: bool = False, ): data = {"model": model, "file": audio_file, **optional_params} - if atranscriptions == True: + if atranscription == True: return self.async_audio_transcriptions( audio_file=audio_file, data=data, diff --git a/litellm/main.py b/litellm/main.py index a04dba4ec..6deaf653f 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -3385,7 +3385,7 @@ def transcription( Allows router to load balance between them """ - atranscriptions = kwargs.get("atranscriptions", False) + atranscription = kwargs.get("atranscription", False) litellm_call_id = kwargs.get("litellm_call_id", None) logger_fn = kwargs.get("logger_fn", None) proxy_server_request = kwargs.get("proxy_server_request", None) @@ -3421,12 +3421,13 @@ def transcription( or litellm.azure_key or get_secret("AZURE_API_KEY") ) + response = azure_chat_completions.audio_transcriptions( model=model, audio_file=file, optional_params=optional_params, model_response=model_response, - atranscriptions=atranscriptions, + atranscription=atranscription, timeout=timeout, logging_obj=litellm_logging_obj, api_base=api_base, @@ -3440,7 +3441,7 @@ def transcription( audio_file=file, optional_params=optional_params, model_response=model_response, - atranscriptions=atranscriptions, + atranscription=atranscription, timeout=timeout, logging_obj=litellm_logging_obj, ) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 27eeea573..7a04c8e7d 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -120,6 +120,8 @@ from fastapi import ( Header, Response, Form, + UploadFile, + File, ) from fastapi.routing import APIRouter from fastapi.security import OAuth2PasswordBearer @@ -3216,17 +3218,16 @@ async def image_generation( @router.post( "/v1/audio/transcriptions", dependencies=[Depends(user_api_key_auth)], - response_class=ORJSONResponse, tags=["audio"], ) @router.post( "/audio/transcriptions", dependencies=[Depends(user_api_key_auth)], - response_class=ORJSONResponse, tags=["audio"], ) async def audio_transcriptions( request: Request, + file: UploadFile = File(...), user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), ): """ @@ -3237,11 +3238,11 @@ async def audio_transcriptions( global proxy_logging_obj try: # Use orjson to parse JSON data, orjson speeds up requests significantly - body = await request.body() - data = orjson.loads(body) + form_data = await request.form() + data: Dict = {key: value for key, value in form_data.items() if key != "file"} # Include original request and headers in the data - data["proxy_server_request"] = { + data["proxy_server_request"] = { # type: ignore "url": str(request.url), "method": request.method, "headers": dict(request.headers), @@ -3298,44 +3299,60 @@ async def audio_transcriptions( else [] ) - ### CALL HOOKS ### - modify incoming data / reject request before calling the model - data = await proxy_logging_obj.pre_call_hook( - user_api_key_dict=user_api_key_dict, data=data, call_type="moderation" - ) + assert ( + file.filename is not None + ) # make sure filename passed in (needed for type) - start_time = time.time() + with open(file.filename, "wb+") as f: + f.write(await file.read()) + try: + data["file"] = open(file.filename, "rb") + ### CALL HOOKS ### - modify incoming data / reject request before calling the model + data = await proxy_logging_obj.pre_call_hook( + user_api_key_dict=user_api_key_dict, + data=data, + call_type="moderation", + ) - ## ROUTE TO CORRECT ENDPOINT ## - # skip router if user passed their key - if "api_key" in data: - response = await litellm.atranscription(**data) - elif ( - llm_router is not None and data["model"] in router_model_names - ): # model in router model list - response = await llm_router.atranscription(**data) - elif ( - llm_router is not None and data["model"] in llm_router.deployment_names - ): # model in router deployments, calling a specific deployment on the router - response = await llm_router.atranscription(**data, specific_deployment=True) - elif ( - llm_router is not None - and llm_router.model_group_alias is not None - and data["model"] in llm_router.model_group_alias - ): # model set in model_group_alias - response = await llm_router.atranscription( - **data - ) # ensure this goes the llm_router, router will do the correct alias mapping - elif user_model is not None: # `litellm --model ` - response = await litellm.atranscription(**data) - else: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail={"error": "Invalid model name passed in"}, - ) + ## ROUTE TO CORRECT ENDPOINT ## + # skip router if user passed their key + if "api_key" in data: + response = await litellm.atranscription(**data) + elif ( + llm_router is not None and data["model"] in router_model_names + ): # model in router model list + response = await llm_router.atranscription(**data) + + elif ( + llm_router is not None + and data["model"] in llm_router.deployment_names + ): # model in router deployments, calling a specific deployment on the router + response = await llm_router.atranscription( + **data, specific_deployment=True + ) + elif ( + llm_router is not None + and llm_router.model_group_alias is not None + and data["model"] in llm_router.model_group_alias + ): # model set in model_group_alias + response = await llm_router.atranscription( + **data + ) # ensure this goes the llm_router, router will do the correct alias mapping + elif user_model is not None: # `litellm --model ` + response = await litellm.atranscription(**data) + else: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail={"error": "Invalid model name passed in"}, + ) + + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + finally: + os.remove(file.filename) # Delete the saved file ### ALERTING ### data["litellm_status"] = "success" # used for alerting - return response except Exception as e: await proxy_logging_obj.post_call_failure_hook( @@ -3344,7 +3361,7 @@ async def audio_transcriptions( traceback.print_exc() if isinstance(e, HTTPException): raise ProxyException( - message=getattr(e, "message", str(e)), + message=getattr(e, "message", str(e.detail)), type=getattr(e, "type", "None"), param=getattr(e, "param", "None"), code=getattr(e, "status_code", status.HTTP_400_BAD_REQUEST), diff --git a/litellm/utils.py b/litellm/utils.py index 330903f5a..3285f3a08 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -2309,7 +2309,7 @@ def client(original_function): or call_type == CallTypes.transcription.value ): _file_name: BinaryIO = args[1] if len(args) > 1 else kwargs["file"] - messages = _file_name.name + messages = "audio_file" stream = True if "stream" in kwargs and kwargs["stream"] == True else False logging_obj = Logging( model=model, @@ -2607,6 +2607,8 @@ def client(original_function): return result elif "aimg_generation" in kwargs and kwargs["aimg_generation"] == True: return result + elif "atranscription" in kwargs and kwargs["atranscription"] == True: + return result ### POST-CALL RULES ### post_call_processing(original_response=result, model=model or None) @@ -7834,7 +7836,9 @@ def exception_type( message=f"AzureException - {original_exception.message}", llm_provider="azure", model=model, - request=original_exception.request, + request=httpx.Request( + method="POST", url="https://openai.com/" + ), ) else: # if no status code then it is an APIConnectionError: https://github.com/openai/openai-python#handling-errors @@ -7842,7 +7846,11 @@ def exception_type( __cause__=original_exception.__cause__, llm_provider="azure", model=model, - request=original_exception.request, + request=getattr( + original_exception, + "request", + httpx.Request(method="POST", url="https://openai.com/"), + ), ) if ( "BadRequestError.__init__() missing 1 required positional argument: 'param'" diff --git a/tests/test_whisper.py b/tests/test_whisper.py index bb0971732..5cb651951 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -98,7 +98,7 @@ async def test_transcription_on_router(): "model": "azure/azure-whisper", "api_base": os.getenv("AZURE_EUROPE_API_BASE"), "api_key": os.getenv("AZURE_EUROPE_API_KEY"), - "api_version": os.getenv("2024-02-15-preview"), + "api_version": "2024-02-15-preview", }, }, ] From 5850ff470f589959cc4d23fe7b3275b649c81088 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 20:42:12 -0800 Subject: [PATCH 245/304] (feat) disable/enable logging --- litellm/_logging.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/litellm/_logging.py b/litellm/_logging.py index 438fa9743..26693c15e 100644 --- a/litellm/_logging.py +++ b/litellm/_logging.py @@ -31,6 +31,18 @@ def _turn_on_debug(): verbose_proxy_logger.setLevel(level=logging.DEBUG) # set proxy logs to debug +def _disable_debugging(): + verbose_logger.disabled = True + verbose_router_logger.disabled = True + verbose_proxy_logger.disabled = True + + +def _enable_debugging(): + verbose_logger.disabled = False + verbose_router_logger.disabled = False + verbose_proxy_logger.disabled = False + + def print_verbose(print_statement): try: if set_verbose: From 7004940ce4d890fca1c7cd360847103035def2bd Mon Sep 17 00:00:00 2001 From: H0llyW00dzZ Date: Sat, 9 Mar 2024 11:55:31 +0700 Subject: [PATCH 246/304] Update Docs for Kubernetes - [+] docs(deploy.md): add tip about using versioning or SHA digests instead of latest tag --- docs/my-website/docs/proxy/deploy.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 0ce9c0005..7eb5373b4 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -131,6 +131,9 @@ spec: +> [!TIP] +> To avoid issues with predictability, difficulties in rollback, and inconsistent environments, use versioning or SHA digests (for example, `litellm:main-v1.30.3` or `litellm@sha256:12345abcdef...`) instead of `litellm:main-latest`. + ## Deploy with Database From 789183013697dd171a6986c20c9253c70e7e0468 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 21:20:02 -0800 Subject: [PATCH 247/304] (bump) 1.30.4 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 80f5c822c..4c00be910 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.3" +version = "1.30.4" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.3" +version = "1.30.4" version_files = [ "pyproject.toml:^version" ] From 33ba57a1b51050e055a3ddecb186e33bcfb7e640 Mon Sep 17 00:00:00 2001 From: H0llyW00dzZ Date: Sat, 9 Mar 2024 12:37:18 +0700 Subject: [PATCH 248/304] Fix Docs Formatting in Website - [+] docs(deploy.md): move tip about versioning inside the tab item --- docs/my-website/docs/proxy/deploy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 7eb5373b4..496bde05f 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -129,11 +129,11 @@ spec: name: litellm-config-file ``` - - > [!TIP] > To avoid issues with predictability, difficulties in rollback, and inconsistent environments, use versioning or SHA digests (for example, `litellm:main-v1.30.3` or `litellm@sha256:12345abcdef...`) instead of `litellm:main-latest`. + + ## Deploy with Database From 2e66267128564d4670b43de43f5b5ce0db6ee6d5 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Fri, 8 Mar 2024 21:47:11 -0800 Subject: [PATCH 249/304] Updated config.yml --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index daa4d59ec..ff6e6e1b2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,6 +45,7 @@ jobs: pip install "asyncio==3.4.3" pip install "apscheduler==3.10.4" pip install "PyGithub==1.59.1" + pip install python-multipart - save_cache: paths: - ./venv From ea6f42216c313d9b91794eb27a6b0699a1683164 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 21:59:00 -0800 Subject: [PATCH 250/304] (docs) use port 4000 --- README.md | 6 +-- deploy/charts/litellm/README.md | 4 +- deploy/charts/litellm/values.yaml | 2 +- .../docs/embedding/supported_embedding.md | 10 ++-- docs/my-website/docs/index.md | 4 +- docs/my-website/docs/load_test.md | 2 +- docs/my-website/docs/providers/anthropic.md | 8 +-- docs/my-website/docs/providers/bedrock.md | 8 +-- docs/my-website/docs/providers/ollama.md | 2 +- .../docs/providers/openai_compatible.md | 4 +- docs/my-website/docs/proxy/caching.md | 14 ++--- docs/my-website/docs/proxy/call_hooks.md | 4 +- docs/my-website/docs/proxy/cli.md | 2 +- docs/my-website/docs/proxy/configs.md | 16 +++--- docs/my-website/docs/proxy/deploy.md | 10 ++-- docs/my-website/docs/proxy/embedding.md | 2 +- docs/my-website/docs/proxy/enterprise.md | 18 +++---- docs/my-website/docs/proxy/health.md | 10 ++-- docs/my-website/docs/proxy/load_balancing.md | 4 +- docs/my-website/docs/proxy/logging.md | 24 ++++----- .../my-website/docs/proxy/model_management.md | 4 +- docs/my-website/docs/proxy/pii_masking.md | 6 +-- docs/my-website/docs/proxy/quick_start.md | 36 ++++++------- docs/my-website/docs/proxy/reliability.md | 6 +-- docs/my-website/docs/proxy/rules.md | 2 +- .../docs/proxy/streaming_logging.md | 2 +- docs/my-website/docs/proxy/ui.md | 4 +- docs/my-website/docs/proxy/user_keys.md | 30 +++++------ docs/my-website/docs/proxy/users.md | 26 +++++----- docs/my-website/docs/proxy/virtual_keys.md | 28 +++++----- docs/my-website/docs/simple_proxy_old_doc.md | 52 +++++++++---------- litellm/proxy/proxy_cli.py | 6 +-- litellm/router.py | 2 +- 33 files changed, 179 insertions(+), 179 deletions(-) diff --git a/README.md b/README.md index bc8c1bae2..d32372b6c 100644 --- a/README.md +++ b/README.md @@ -143,13 +143,13 @@ pip install 'litellm[proxy]' ```shell $ litellm --model huggingface/bigcode/starcoder -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` ### Step 2: Make ChatCompletions Request to Proxy ```python import openai # openai v1.0.0+ -client = openai.OpenAI(api_key="anything",base_url="http://0.0.0.0:8000") # set proxy to base_url +client = openai.OpenAI(api_key="anything",base_url="http://0.0.0.0:4000") # set proxy to base_url # request sent to model set on litellm proxy, `litellm --model` response = client.chat.completions.create(model="gpt-3.5-turbo", messages = [ { @@ -170,7 +170,7 @@ Set budgets and rate limits across multiple projects ### Request ```shell -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data-raw '{"models": ["gpt-3.5-turbo", "gpt-4", "claude-2"], "duration": "20m","metadata": {"user": "ishaan@berri.ai", "team": "core-infra"}}' diff --git a/deploy/charts/litellm/README.md b/deploy/charts/litellm/README.md index daba8aa68..817781ed0 100644 --- a/deploy/charts/litellm/README.md +++ b/deploy/charts/litellm/README.md @@ -28,7 +28,7 @@ If `db.useStackgresOperator` is used (not yet implemented): | `imagePullSecrets` | Registry credentials for the LiteLLM and initContainer images. | `[]` | | `serviceAccount.create` | Whether or not to create a Kubernetes Service Account for this deployment. The default is `false` because LiteLLM has no need to access the Kubernetes API. | `false` | | `service.type` | Kubernetes Service type (e.g. `LoadBalancer`, `ClusterIP`, etc.) | `ClusterIP` | -| `service.port` | TCP port that the Kubernetes Service will listen on. Also the TCP port within the Pod that the proxy will listen on. | `8000` | +| `service.port` | TCP port that the Kubernetes Service will listen on. Also the TCP port within the Pod that the proxy will listen on. | `4000` | | `ingress.*` | See [values.yaml](./values.yaml) for example settings | N/A | | `proxy_config.*` | See [values.yaml](./values.yaml) for default settings. See [example_config_yaml](../../../litellm/proxy/example_config_yaml/) for configuration examples. | N/A | @@ -76,7 +76,7 @@ When browsing to the URL published per the settings in `ingress.*`, you will be prompted for **Admin Configuration**. The **Proxy Endpoint** is the internal (from the `litellm` pod's perspective) URL published by the `-litellm` Kubernetes Service. If the deployment uses the default settings for this -service, the **Proxy Endpoint** should be set to `http://-litellm:8000`. +service, the **Proxy Endpoint** should be set to `http://-litellm:4000`. The **Proxy Key** is the value specified for `masterkey` or, if a `masterkey` was not provided to the helm command line, the `masterkey` is a randomly diff --git a/deploy/charts/litellm/values.yaml b/deploy/charts/litellm/values.yaml index 1b83fe801..642a50b70 100644 --- a/deploy/charts/litellm/values.yaml +++ b/deploy/charts/litellm/values.yaml @@ -55,7 +55,7 @@ environmentSecrets: [] service: type: ClusterIP - port: 8000 + port: 4000 ingress: enabled: false diff --git a/docs/my-website/docs/embedding/supported_embedding.md b/docs/my-website/docs/embedding/supported_embedding.md index 62a10b44d..7e2374d16 100644 --- a/docs/my-website/docs/embedding/supported_embedding.md +++ b/docs/my-website/docs/embedding/supported_embedding.md @@ -35,7 +35,7 @@ general_settings: ```bash litellm --config /path/to/config.yaml -# RUNNING on http://0.0.0.0:8000 +# RUNNING on http://0.0.0.0:4000 ``` ### Test @@ -44,7 +44,7 @@ litellm --config /path/to/config.yaml ```bash -curl --location 'http://0.0.0.0:8000/embeddings' \ +curl --location 'http://0.0.0.0:4000/embeddings' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{"input": ["Academia.edu uses"], "model": "textembedding-gecko", "encoding_format": "base64"}' @@ -57,7 +57,7 @@ curl --location 'http://0.0.0.0:8000/embeddings' \ from openai import OpenAI client = OpenAI( api_key="sk-1234", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) client.embeddings.create( @@ -72,7 +72,7 @@ client.embeddings.create( ```python from langchain_openai import OpenAIEmbeddings -embeddings = OpenAIEmbeddings(model="textembedding-gecko", openai_api_base="http://0.0.0.0:8000", openai_api_key="sk-1234") +embeddings = OpenAIEmbeddings(model="textembedding-gecko", openai_api_base="http://0.0.0.0:4000", openai_api_key="sk-1234") text = "This is a test document." @@ -200,7 +200,7 @@ Use this for calling `/embedding` endpoints on OpenAI Compatible Servers, exampl from litellm import embedding response = embedding( model = "openai/", # add `openai/` prefix to model so litellm knows to route to OpenAI - api_base="http://0.0.0.0:8000/" # set API Base of your Custom OpenAI Endpoint + api_base="http://0.0.0.0:4000/" # set API Base of your Custom OpenAI Endpoint input=["good morning from litellm"] ) ``` diff --git a/docs/my-website/docs/index.md b/docs/my-website/docs/index.md index d7ed14019..66ec6573c 100644 --- a/docs/my-website/docs/index.md +++ b/docs/my-website/docs/index.md @@ -368,13 +368,13 @@ pip install 'litellm[proxy]' ```shell $ litellm --model huggingface/bigcode/starcoder -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` #### Step 2: Make ChatCompletions Request to Proxy ```python import openai # openai v1.0.0+ -client = openai.OpenAI(api_key="anything",base_url="http://0.0.0.0:8000") # set proxy to base_url +client = openai.OpenAI(api_key="anything",base_url="http://0.0.0.0:4000") # set proxy to base_url # request sent to model set on litellm proxy, `litellm --model` response = client.chat.completions.create(model="gpt-3.5-turbo", messages = [ { diff --git a/docs/my-website/docs/load_test.md b/docs/my-website/docs/load_test.md index 94165fb7b..f85ff9122 100644 --- a/docs/my-website/docs/load_test.md +++ b/docs/my-website/docs/load_test.md @@ -90,7 +90,7 @@ import time, asyncio, litellm #### LITELLM PROXY #### litellm_client = AsyncOpenAI( api_key="sk-1234", # [CHANGE THIS] - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) #### AZURE OPENAI CLIENT #### diff --git a/docs/my-website/docs/providers/anthropic.md b/docs/my-website/docs/providers/anthropic.md index 6aa4b1979..1a7a5fa41 100644 --- a/docs/my-website/docs/providers/anthropic.md +++ b/docs/my-website/docs/providers/anthropic.md @@ -63,7 +63,7 @@ export ANTHROPIC_API_KEY="your-api-key" ```bash $ litellm --model claude-3-opus-20240229 -# Server running on http://0.0.0.0:8000 +# Server running on http://0.0.0.0:4000 ``` ### 3. Test it @@ -73,7 +73,7 @@ $ litellm --model claude-3-opus-20240229 ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -93,7 +93,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -120,7 +120,7 @@ from langchain.prompts.chat import ( from langchain.schema import HumanMessage, SystemMessage chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", # set openai_api_base to the LiteLLM Proxy + openai_api_base="http://0.0.0.0:4000", # set openai_api_base to the LiteLLM Proxy model = "gpt-3.5-turbo", temperature=0.1 ) diff --git a/docs/my-website/docs/providers/bedrock.md b/docs/my-website/docs/providers/bedrock.md index c5b12d4c4..8c6926885 100644 --- a/docs/my-website/docs/providers/bedrock.md +++ b/docs/my-website/docs/providers/bedrock.md @@ -54,7 +54,7 @@ export AWS_REGION_NAME="" ```bash $ litellm --model anthropic.claude-3-sonnet-20240229-v1:0 -# Server running on http://0.0.0.0:8000 +# Server running on http://0.0.0.0:4000 ``` ### 3. Test it @@ -64,7 +64,7 @@ $ litellm --model anthropic.claude-3-sonnet-20240229-v1:0 ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -84,7 +84,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -111,7 +111,7 @@ from langchain.prompts.chat import ( from langchain.schema import HumanMessage, SystemMessage chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", # set openai_api_base to the LiteLLM Proxy + openai_api_base="http://0.0.0.0:4000", # set openai_api_base to the LiteLLM Proxy model = "gpt-3.5-turbo", temperature=0.1 ) diff --git a/docs/my-website/docs/providers/ollama.md b/docs/my-website/docs/providers/ollama.md index 78c91bb63..ec2a231e1 100644 --- a/docs/my-website/docs/providers/ollama.md +++ b/docs/my-website/docs/providers/ollama.md @@ -183,7 +183,7 @@ On the docker container run the `test.py` file using `python3 test.py` ```python import openai -api_base = f"http://0.0.0.0:8000" # base url for server +api_base = f"http://0.0.0.0:4000" # base url for server openai.api_base = api_base openai.api_key = "temp-key" diff --git a/docs/my-website/docs/providers/openai_compatible.md b/docs/my-website/docs/providers/openai_compatible.md index beaf38cfa..f86544c28 100644 --- a/docs/my-website/docs/providers/openai_compatible.md +++ b/docs/my-website/docs/providers/openai_compatible.md @@ -15,7 +15,7 @@ import os response = litellm.completion( model="openai/mistral, # add `openai/` prefix to model so litellm knows to route to OpenAI api_key="sk-1234", # api key to your openai compatible endpoint - api_base="http://0.0.0.0:8000", # set API Base of your Custom OpenAI Endpoint + api_base="http://0.0.0.0:4000", # set API Base of your Custom OpenAI Endpoint messages=[ { "role": "user", @@ -35,7 +35,7 @@ import os response = litellm.embedding( model="openai/GPT-J", # add `openai/` prefix to model so litellm knows to route to OpenAI api_key="sk-1234", # api key to your openai compatible endpoint - api_base="http://0.0.0.0:8000", # set API Base of your Custom OpenAI Endpoint + api_base="http://0.0.0.0:4000", # set API Base of your Custom OpenAI Endpoint input=["good morning from litellm"] ) print(response) diff --git a/docs/my-website/docs/proxy/caching.md b/docs/my-website/docs/proxy/caching.md index ee4874caf..4f1ce18f3 100644 --- a/docs/my-website/docs/proxy/caching.md +++ b/docs/my-website/docs/proxy/caching.md @@ -145,7 +145,7 @@ $ litellm --config /path/to/config.yaml Send the same request twice: ```shell -curl http://0.0.0.0:8000/v1/chat/completions \ +curl http://0.0.0.0:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-3.5-turbo", @@ -153,7 +153,7 @@ curl http://0.0.0.0:8000/v1/chat/completions \ "temperature": 0.7 }' -curl http://0.0.0.0:8000/v1/chat/completions \ +curl http://0.0.0.0:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-3.5-turbo", @@ -166,14 +166,14 @@ curl http://0.0.0.0:8000/v1/chat/completions \ Send the same request twice: ```shell -curl --location 'http://0.0.0.0:8000/embeddings' \ +curl --location 'http://0.0.0.0:4000/embeddings' \ --header 'Content-Type: application/json' \ --data ' { "model": "text-embedding-ada-002", "input": ["write a litellm poem"] }' -curl --location 'http://0.0.0.0:8000/embeddings' \ +curl --location 'http://0.0.0.0:4000/embeddings' \ --header 'Content-Type: application/json' \ --data ' { "model": "text-embedding-ada-002", @@ -227,7 +227,7 @@ from openai import OpenAI client = OpenAI( # This is the default and can be omitted api_key=os.environ.get("OPENAI_API_KEY"), - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) chat_completion = client.chat.completions.create( @@ -255,7 +255,7 @@ from openai import OpenAI client = OpenAI( # This is the default and can be omitted api_key=os.environ.get("OPENAI_API_KEY"), - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) chat_completion = client.chat.completions.create( @@ -281,7 +281,7 @@ from openai import OpenAI client = OpenAI( # This is the default and can be omitted api_key=os.environ.get("OPENAI_API_KEY"), - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) chat_completion = client.chat.completions.create( diff --git a/docs/my-website/docs/proxy/call_hooks.md b/docs/my-website/docs/proxy/call_hooks.md index b00f4e301..9d4d1112e 100644 --- a/docs/my-website/docs/proxy/call_hooks.md +++ b/docs/my-website/docs/proxy/call_hooks.md @@ -63,7 +63,7 @@ litellm_settings: $ litellm /path/to/config.yaml ``` ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --data ' { "model": "gpt-3.5-turbo", "messages": [ @@ -162,7 +162,7 @@ litellm_settings: $ litellm /path/to/config.yaml ``` ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --data ' { "model": "gpt-3.5-turbo", "messages": [ diff --git a/docs/my-website/docs/proxy/cli.md b/docs/my-website/docs/proxy/cli.md index d366f1f6b..28b210b16 100644 --- a/docs/my-website/docs/proxy/cli.md +++ b/docs/my-website/docs/proxy/cli.md @@ -15,7 +15,7 @@ Cli arguments, --host, --port, --num_workers ``` ## --port - - **Default:** `8000` + - **Default:** `4000` - The port to bind the server to. - **Usage:** ```shell diff --git a/docs/my-website/docs/proxy/configs.md b/docs/my-website/docs/proxy/configs.md index a863ec2ca..68b49502d 100644 --- a/docs/my-website/docs/proxy/configs.md +++ b/docs/my-website/docs/proxy/configs.md @@ -13,7 +13,7 @@ Set model list, `api_base`, `api_key`, `temperature` & proxy server settings (`m | `general_settings` | Server settings, example setting `master_key: sk-my_special_key` | | `environment_variables` | Environment Variables example, `REDIS_HOST`, `REDIS_PORT` | -**Complete List:** Check the Swagger UI docs on `/#/config.yaml` (e.g. http://0.0.0.0:8000/#/config.yaml), for everything you can pass in the config.yaml. +**Complete List:** Check the Swagger UI docs on `/#/config.yaml` (e.g. http://0.0.0.0:4000/#/config.yaml), for everything you can pass in the config.yaml. ## Quick Start @@ -55,7 +55,7 @@ model_list: - model_name: vllm-models litellm_params: model: openai/facebook/opt-125m # the `openai/` prefix tells litellm it's openai compatible - api_base: http://0.0.0.0:8000 + api_base: http://0.0.0.0:4000 rpm: 1440 model_info: version: 2 @@ -91,7 +91,7 @@ Sends request to model where `model_name=gpt-3.5-turbo` on config.yaml. If multiple with `model_name=gpt-3.5-turbo` does [Load Balancing](https://docs.litellm.ai/docs/proxy/load_balancing) ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -111,7 +111,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ Sends this request to model where `model_name=bedrock-claude-v1` on config.yaml ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "bedrock-claude-v1", @@ -131,7 +131,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # Sends request to model where `model_name=gpt-3.5-turbo` on config.yaml. @@ -179,7 +179,7 @@ messages = [ # Sends request to model where `model_name=gpt-3.5-turbo` on config.yaml. chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", # set openai base to the proxy + openai_api_base="http://0.0.0.0:4000", # set openai base to the proxy model = "gpt-3.5-turbo", temperature=0.1 ) @@ -189,7 +189,7 @@ print(response) # Sends request to model where `model_name=bedrock-claude-v1` on config.yaml. claude_chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", # set openai base to the proxy + openai_api_base="http://0.0.0.0:4000", # set openai base to the proxy model = "bedrock-claude-v1", temperature=0.1 ) @@ -560,7 +560,7 @@ litellm --config config.yaml Sends Request to `bedrock-cohere` ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "bedrock-cohere", diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 496bde05f..1a0d3abad 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -241,10 +241,10 @@ helm install \ kubectl \ port-forward \ service/mydeploy-litellm \ - 8000:8000 + 4000:4000 ``` -Your OpenAI proxy server is now running on `http://127.0.0.1:8000`. +Your OpenAI proxy server is now running on `http://127.0.0.1:4000`. @@ -393,11 +393,11 @@ services: target: runtime image: ghcr.io/berriai/litellm:main-latest ports: - - "8000:8000" # Map the container port to the host, change the host port if necessary + - "4000:4000" # Map the container port to the host, change the host port if necessary volumes: - ./litellm-config.yaml:/app/config.yaml # Mount the local configuration file # You can change the port or number of workers as per your requirements or pass any new supported CLI augument. Make sure the port passed here matches with the container port defined above in `ports` value - command: [ "--config", "/app/config.yaml", "--port", "8000", "--num_workers", "8" ] + command: [ "--config", "/app/config.yaml", "--port", "4000", "--num_workers", "8" ] # ...rest of your docker-compose config if any ``` @@ -415,4 +415,4 @@ Run the command `docker-compose up` or `docker compose up` as per your docker in > Use `-d` flag to run the container in detached mode (background) e.g. `docker compose up -d` -Your LiteLLM container should be running now on the defined port e.g. `8000`. +Your LiteLLM container should be running now on the defined port e.g. `4000`. diff --git a/docs/my-website/docs/proxy/embedding.md b/docs/my-website/docs/proxy/embedding.md index 0f3a01a90..2adaaa247 100644 --- a/docs/my-website/docs/proxy/embedding.md +++ b/docs/my-website/docs/proxy/embedding.md @@ -38,7 +38,7 @@ $ litellm --config /path/to/config.yaml 3. Test the embedding call ```shell -curl --location 'http://0.0.0.0:8000/v1/embeddings' \ +curl --location 'http://0.0.0.0:4000/v1/embeddings' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{ diff --git a/docs/my-website/docs/proxy/enterprise.md b/docs/my-website/docs/proxy/enterprise.md index e0c5374f0..93786eff4 100644 --- a/docs/my-website/docs/proxy/enterprise.md +++ b/docs/my-website/docs/proxy/enterprise.md @@ -58,7 +58,7 @@ callbacks: ["llamaguard_moderations"] Set the LLM Guard API Base in your environment ```env -LLM_GUARD_API_BASE = "http://0.0.0.0:8000" +LLM_GUARD_API_BASE = "http://0.0.0.0:4000" ``` Add `llmguard_moderations` as a callback @@ -143,7 +143,7 @@ When `no-log=True`, the request will **not be logged on any callbacks** and ther import openai client = openai.OpenAI( api_key="anything", # proxy api-key - base_url="http://0.0.0.0:8000" # litellm proxy + base_url="http://0.0.0.0:4000" # litellm proxy ) response = client.chat.completions.create( @@ -175,7 +175,7 @@ litellm_settings: ### How to test ```bash -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -202,7 +202,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ **Block all calls for a user id** ``` -curl -X POST "http://0.0.0.0:8000/user/block" \ +curl -X POST "http://0.0.0.0:4000/user/block" \ -H "Authorization: Bearer sk-1234" \ -D '{ "user_ids": [, ...] @@ -212,7 +212,7 @@ curl -X POST "http://0.0.0.0:8000/user/block" \ **Unblock calls for a user id** ``` -curl -X POST "http://0.0.0.0:8000/user/unblock" \ +curl -X POST "http://0.0.0.0:4000/user/unblock" \ -H "Authorization: Bearer sk-1234" \ -D '{ "user_ids": [, ...] @@ -230,7 +230,7 @@ litellm_settings: ### Test this ```bash -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -263,7 +263,7 @@ Set `extra_body={"metadata": { }}` to `metadata` you want to pass import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -291,7 +291,7 @@ print(response) Pass `metadata` as part of the request body ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data '{ "model": "gpt-3.5-turbo", @@ -317,7 +317,7 @@ from langchain.prompts.chat import ( from langchain.schema import HumanMessage, SystemMessage chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", + openai_api_base="http://0.0.0.0:4000", model = "gpt-3.5-turbo", temperature=0.1, extra_body={ diff --git a/docs/my-website/docs/proxy/health.md b/docs/my-website/docs/proxy/health.md index f0b797329..03dd91731 100644 --- a/docs/my-website/docs/proxy/health.md +++ b/docs/my-website/docs/proxy/health.md @@ -12,10 +12,10 @@ The proxy exposes: #### Request Make a GET Request to `/health` on the proxy ```shell -curl --location 'http://0.0.0.0:8000/health' -H "Authorization: Bearer sk-1234" +curl --location 'http://0.0.0.0:4000/health' -H "Authorization: Bearer sk-1234" ``` -You can also run `litellm -health` it makes a `get` request to `http://0.0.0.0:8000/health` for you +You can also run `litellm -health` it makes a `get` request to `http://0.0.0.0:4000/health` for you ``` litellm --health ``` @@ -60,7 +60,7 @@ $ litellm /path/to/config.yaml 3. Query health endpoint: ``` -curl --location 'http://0.0.0.0:8000/health' +curl --location 'http://0.0.0.0:4000/health' ``` ### Embedding Models @@ -119,7 +119,7 @@ Unprotected endpoint for checking if proxy is ready to accept requests Example Request: ```bash -curl --location 'http://0.0.0.0:8000/health/readiness' +curl --location 'http://0.0.0.0:4000/health/readiness' ``` Example Response: @@ -153,7 +153,7 @@ Example Request: ``` curl -X 'GET' \ - 'http://0.0.0.0:8000/health/liveliness' \ + 'http://0.0.0.0:4000/health/liveliness' \ -H 'accept: application/json' ``` diff --git a/docs/my-website/docs/proxy/load_balancing.md b/docs/my-website/docs/proxy/load_balancing.md index ad5e91203..691592cb6 100644 --- a/docs/my-website/docs/proxy/load_balancing.md +++ b/docs/my-website/docs/proxy/load_balancing.md @@ -45,7 +45,7 @@ $ litellm --config /path/to/config.yaml ### Step 3: Use proxy - Call a model group [Load Balancing] Curl Command ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -65,7 +65,7 @@ If you want to call a specific model defined in the `config.yaml`, you can call In this example it will call `azure/gpt-turbo-small-ca`. Defined in the config on Step 1 ```bash -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "azure/gpt-turbo-small-ca", diff --git a/docs/my-website/docs/proxy/logging.md b/docs/my-website/docs/proxy/logging.md index bf4216c0e..589199a07 100644 --- a/docs/my-website/docs/proxy/logging.md +++ b/docs/my-website/docs/proxy/logging.md @@ -150,7 +150,7 @@ litellm --config proxy_config.yaml ``` ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Authorization: Bearer sk-1234' \ --data ' { "model": "gpt-3.5-turbo", @@ -174,7 +174,7 @@ On Success Usage: {'completion_tokens': 10, 'prompt_tokens': 11, 'total_tokens': 21}, Cost: 3.65e-05, Response: {'id': 'chatcmpl-8S8avKJ1aVBg941y5xzGMSKrYCMvN', 'choices': [{'finish_reason': 'stop', 'index': 0, 'message': {'content': 'Good morning! How can I assist you today?', 'role': 'assistant'}}], 'created': 1701716913, 'model': 'gpt-3.5-turbo-0613', 'object': 'chat.completion', 'system_fingerprint': None, 'usage': {'completion_tokens': 10, 'prompt_tokens': 11, 'total_tokens': 21}} - Proxy Metadata: {'user_api_key': None, 'headers': Headers({'host': '0.0.0.0:8000', 'user-agent': 'curl/7.88.1', 'accept': '*/*', 'authorization': 'Bearer sk-1234', 'content-length': '199', 'content-type': 'application/x-www-form-urlencoded'}), 'model_group': 'gpt-3.5-turbo', 'deployment': 'gpt-3.5-turbo-ModelID-gpt-3.5-turbo'} + Proxy Metadata: {'user_api_key': None, 'headers': Headers({'host': '0.0.0.0:4000', 'user-agent': 'curl/7.88.1', 'accept': '*/*', 'authorization': 'Bearer sk-1234', 'content-length': '199', 'content-type': 'application/x-www-form-urlencoded'}), 'model_group': 'gpt-3.5-turbo', 'deployment': 'gpt-3.5-turbo-ModelID-gpt-3.5-turbo'} ``` #### Logging Proxy Request Object, Header, Url @@ -374,7 +374,7 @@ async def log_event(request: Request): if __name__ == "__main__": import uvicorn - uvicorn.run(app, host="127.0.0.1", port=8000) + uvicorn.run(app, host="127.0.0.1", port=4000) ``` @@ -383,7 +383,7 @@ if __name__ == "__main__": #### Step 2. Set your `GENERIC_LOGGER_ENDPOINT` to the endpoint + route we should send callback logs to ```shell -os.environ["GENERIC_LOGGER_ENDPOINT"] = "http://localhost:8000/log-event" +os.environ["GENERIC_LOGGER_ENDPOINT"] = "http://localhost:4000/log-event" ``` #### Step 3. Create a `config.yaml` file and set `litellm_settings`: `success_callback` = ["generic"] @@ -445,7 +445,7 @@ Expected output on Langfuse Pass `metadata` as part of the request body ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data '{ "model": "gpt-3.5-turbo", @@ -472,7 +472,7 @@ Set `extra_body={"metadata": { }}` to `metadata` you want to pass import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -509,7 +509,7 @@ from langchain.prompts.chat import ( from langchain.schema import HumanMessage, SystemMessage chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", + openai_api_base="http://0.0.0.0:4000", model = "gpt-3.5-turbo", temperature=0.1, extra_body={ @@ -663,7 +663,7 @@ litellm --config config.yaml --debug Test Request ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "Azure OpenAI GPT-4 East", @@ -698,7 +698,7 @@ litellm_settings: Now, when you [generate keys](./virtual_keys.md) for this team-id ```bash -curl -X POST 'http://0.0.0.0:8000/key/generate' \ +curl -X POST 'http://0.0.0.0:4000/key/generate' \ -H 'Authorization: Bearer sk-1234' \ -H 'Content-Type: application/json' \ -D '{"team_id": "ishaans-secret-project"}' @@ -742,7 +742,7 @@ litellm --config config.yaml --debug Test Request ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "Azure OpenAI GPT-4 East", @@ -903,7 +903,7 @@ litellm --config config.yaml --debug Test Request ``` -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -947,7 +947,7 @@ litellm --config config.yaml --debug Test Request ``` -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", diff --git a/docs/my-website/docs/proxy/model_management.md b/docs/my-website/docs/proxy/model_management.md index 8160e2aa7..0a236185f 100644 --- a/docs/my-website/docs/proxy/model_management.md +++ b/docs/my-website/docs/proxy/model_management.md @@ -24,7 +24,7 @@ Retrieve detailed information about each model listed in the `/models` endpoint, ```bash -curl -X GET "http://0.0.0.0:8000/model/info" \ +curl -X GET "http://0.0.0.0:4000/model/info" \ -H "accept: application/json" \ ``` @@ -42,7 +42,7 @@ Add a new model to the list in the `config.yaml` by providing the model paramete ```bash -curl -X POST "http://0.0.0.0:8000/model/new" \ +curl -X POST "http://0.0.0.0:4000/model/new" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "model_name": "azure-gpt-turbo", "litellm_params": {"model": "azure/gpt-3.5-turbo", "api_key": "os.environ/AZURE_API_KEY", "api_base": "my-azure-api-base"} }' diff --git a/docs/my-website/docs/proxy/pii_masking.md b/docs/my-website/docs/proxy/pii_masking.md index 0d559d910..a95a6d771 100644 --- a/docs/my-website/docs/proxy/pii_masking.md +++ b/docs/my-website/docs/proxy/pii_masking.md @@ -96,7 +96,7 @@ Turn off PII masking for a given key. Do this by setting `permissions: {"pii": false}`, when generating a key. ```shell -curl --location 'http://0.0.0.0:8000/key/generate' \ +curl --location 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{ @@ -119,7 +119,7 @@ The proxy support 2 request-level PII controls: Set `allow_pii_controls` to true for a given key. This will allow the user to set request-level PII controls. ```bash -curl --location 'http://0.0.0.0:8000/key/generate' \ +curl --location 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer my-master-key' \ --header 'Content-Type: application/json' \ --data '{ @@ -136,7 +136,7 @@ from openai import OpenAI client = OpenAI( # This is the default and can be omitted api_key=os.environ.get("OPENAI_API_KEY"), - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) chat_completion = client.chat.completions.create( diff --git a/docs/my-website/docs/proxy/quick_start.md b/docs/my-website/docs/proxy/quick_start.md index 4f508ee59..d44970348 100644 --- a/docs/my-website/docs/proxy/quick_start.md +++ b/docs/my-website/docs/proxy/quick_start.md @@ -21,7 +21,7 @@ Run the following command to start the litellm proxy ```shell $ litellm --model huggingface/bigcode/starcoder -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` ### Test @@ -250,7 +250,7 @@ litellm --config your_config.yaml ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -270,7 +270,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -297,7 +297,7 @@ from langchain.prompts.chat import ( from langchain.schema import HumanMessage, SystemMessage chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", # set openai_api_base to the LiteLLM Proxy + openai_api_base="http://0.0.0.0:4000", # set openai_api_base to the LiteLLM Proxy model = "gpt-3.5-turbo", temperature=0.1 ) @@ -321,7 +321,7 @@ print(response) ```python from langchain.embeddings import OpenAIEmbeddings -embeddings = OpenAIEmbeddings(model="sagemaker-embeddings", openai_api_base="http://0.0.0.0:8000", openai_api_key="temp-key") +embeddings = OpenAIEmbeddings(model="sagemaker-embeddings", openai_api_base="http://0.0.0.0:4000", openai_api_key="temp-key") text = "This is a test document." @@ -331,7 +331,7 @@ query_result = embeddings.embed_query(text) print(f"SAGEMAKER EMBEDDINGS") print(query_result[:5]) -embeddings = OpenAIEmbeddings(model="bedrock-embeddings", openai_api_base="http://0.0.0.0:8000", openai_api_key="temp-key") +embeddings = OpenAIEmbeddings(model="bedrock-embeddings", openai_api_base="http://0.0.0.0:4000", openai_api_key="temp-key") text = "This is a test document." @@ -340,7 +340,7 @@ query_result = embeddings.embed_query(text) print(f"BEDROCK EMBEDDINGS") print(query_result[:5]) -embeddings = OpenAIEmbeddings(model="bedrock-titan-embeddings", openai_api_base="http://0.0.0.0:8000", openai_api_key="temp-key") +embeddings = OpenAIEmbeddings(model="bedrock-titan-embeddings", openai_api_base="http://0.0.0.0:4000", openai_api_key="temp-key") text = "This is a test document." @@ -407,11 +407,11 @@ services: litellm: image: ghcr.io/berriai/litellm:main ports: - - "8000:8000" # Map the container port to the host, change the host port if necessary + - "4000:4000" # Map the container port to the host, change the host port if necessary volumes: - ./litellm-config.yaml:/app/config.yaml # Mount the local configuration file # You can change the port or number of workers as per your requirements or pass any new supported CLI augument. Make sure the port passed here matches with the container port defined above in `ports` value - command: [ "--config", "/app/config.yaml", "--port", "8000", "--num_workers", "8" ] + command: [ "--config", "/app/config.yaml", "--port", "4000", "--num_workers", "8" ] # ...rest of your docker-compose config if any ``` @@ -429,7 +429,7 @@ Run the command `docker-compose up` or `docker compose up` as per your docker in > Use `-d` flag to run the container in detached mode (background) e.g. `docker compose up -d` -Your LiteLLM container should be running now on the defined port e.g. `8000`. +Your LiteLLM container should be running now on the defined port e.g. `4000`. ## Using with OpenAI compatible projects @@ -442,7 +442,7 @@ Set `base_url` to the LiteLLM Proxy server import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -463,7 +463,7 @@ print(response) ```shell litellm --model gpt-3.5-turbo -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` #### 1. Clone the repo @@ -474,9 +474,9 @@ git clone https://github.com/danny-avila/LibreChat.git #### 2. Modify Librechat's `docker-compose.yml` -LiteLLM Proxy is running on port `8000`, set `8000` as the proxy below +LiteLLM Proxy is running on port `4000`, set `4000` as the proxy below ```yaml -OPENAI_REVERSE_PROXY=http://host.docker.internal:8000/v1/chat/completions +OPENAI_REVERSE_PROXY=http://host.docker.internal:4000/v1/chat/completions ``` #### 3. Save fake OpenAI key in Librechat's `.env` @@ -502,7 +502,7 @@ In the [config.py](https://continue.dev/docs/reference/Models/openai) set this a api_key="IGNORED", model="fake-model-name", context_length=2048, # customize if needed for your model - api_base="http://localhost:8000" # your proxy server url + api_base="http://localhost:4000" # your proxy server url ), ``` @@ -514,7 +514,7 @@ Credits [@vividfog](https://github.com/jmorganca/ollama/issues/305#issuecomment- ```shell $ pip install aider -$ aider --openai-api-base http://0.0.0.0:8000 --openai-api-key fake-key +$ aider --openai-api-base http://0.0.0.0:4000 --openai-api-key fake-key ``` @@ -528,7 +528,7 @@ from autogen import AssistantAgent, UserProxyAgent, oai config_list=[ { "model": "my-fake-model", - "api_base": "http://localhost:8000", #litellm compatible endpoint + "api_base": "http://localhost:4000", #litellm compatible endpoint "api_type": "open_ai", "api_key": "NULL", # just a placeholder } @@ -566,7 +566,7 @@ import guidance # set api_base to your proxy # set api_key to anything -gpt4 = guidance.llms.OpenAI("gpt-4", api_base="http://0.0.0.0:8000", api_key="anything") +gpt4 = guidance.llms.OpenAI("gpt-4", api_base="http://0.0.0.0:4000", api_key="anything") experts = guidance(''' {{#system~}} diff --git a/docs/my-website/docs/proxy/reliability.md b/docs/my-website/docs/proxy/reliability.md index f241e4ec0..7527a3d5b 100644 --- a/docs/my-website/docs/proxy/reliability.md +++ b/docs/my-website/docs/proxy/reliability.md @@ -45,7 +45,7 @@ litellm_settings: **Set dynamically** ```bash -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "zephyr-beta", @@ -101,7 +101,7 @@ LiteLLM Proxy supports setting a `timeout` per request ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data-raw '{ "model": "gpt-3.5-turbo", @@ -121,7 +121,7 @@ import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) response = client.chat.completions.create( diff --git a/docs/my-website/docs/proxy/rules.md b/docs/my-website/docs/proxy/rules.md index 415607b61..60e990d91 100644 --- a/docs/my-website/docs/proxy/rules.md +++ b/docs/my-website/docs/proxy/rules.md @@ -30,7 +30,7 @@ $ litellm /path/to/config.yaml ``` ```bash -curl --location 'http://0.0.0.0:8000/v1/chat/completions' \ +curl --location 'http://0.0.0.0:4000/v1/chat/completions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer sk-1234' \ --data '{ diff --git a/docs/my-website/docs/proxy/streaming_logging.md b/docs/my-website/docs/proxy/streaming_logging.md index 6bc5882d1..3fa896467 100644 --- a/docs/my-website/docs/proxy/streaming_logging.md +++ b/docs/my-website/docs/proxy/streaming_logging.md @@ -65,7 +65,7 @@ litellm --config proxy_config.yaml ``` ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Authorization: Bearer sk-1234' \ --data ' { "model": "gpt-3.5-turbo", diff --git a/docs/my-website/docs/proxy/ui.md b/docs/my-website/docs/proxy/ui.md index 188a2a2eb..cca9d4434 100644 --- a/docs/my-website/docs/proxy/ui.md +++ b/docs/my-website/docs/proxy/ui.md @@ -28,12 +28,12 @@ Follow [setup](./virtual_keys.md#setup) ```bash litellm --config /path/to/config.yaml -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` ### 2. Go to UI ```bash -http://0.0.0.0:8000/ui # /ui +http://0.0.0.0:4000/ui # /ui ``` diff --git a/docs/my-website/docs/proxy/user_keys.md b/docs/my-website/docs/proxy/user_keys.md index fcccffaa0..d86d3ae09 100644 --- a/docs/my-website/docs/proxy/user_keys.md +++ b/docs/my-website/docs/proxy/user_keys.md @@ -26,7 +26,7 @@ Set `extra_body={"metadata": { }}` to `metadata` you want to pass import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -92,7 +92,7 @@ print(response) Pass `metadata` as part of the request body ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data '{ "model": "gpt-3.5-turbo", @@ -123,7 +123,7 @@ from langchain.prompts.chat import ( from langchain.schema import HumanMessage, SystemMessage chat = ChatOpenAI( - openai_api_base="http://0.0.0.0:8000", + openai_api_base="http://0.0.0.0:4000", model = "gpt-3.5-turbo", temperature=0.1, extra_body={ @@ -195,7 +195,7 @@ from openai import OpenAI # set base_url to your proxy server # set api_key to send to proxy server -client = OpenAI(api_key="", base_url="http://0.0.0.0:8000") +client = OpenAI(api_key="", base_url="http://0.0.0.0:4000") response = client.embeddings.create( input=["hello from litellm"], @@ -209,7 +209,7 @@ print(response) ```shell -curl --location 'http://0.0.0.0:8000/embeddings' \ +curl --location 'http://0.0.0.0:4000/embeddings' \ --header 'Content-Type: application/json' \ --data ' { "model": "text-embedding-ada-002", @@ -223,7 +223,7 @@ curl --location 'http://0.0.0.0:8000/embeddings' \ ```python from langchain.embeddings import OpenAIEmbeddings -embeddings = OpenAIEmbeddings(model="sagemaker-embeddings", openai_api_base="http://0.0.0.0:8000", openai_api_key="temp-key") +embeddings = OpenAIEmbeddings(model="sagemaker-embeddings", openai_api_base="http://0.0.0.0:4000", openai_api_key="temp-key") text = "This is a test document." @@ -233,7 +233,7 @@ query_result = embeddings.embed_query(text) print(f"SAGEMAKER EMBEDDINGS") print(query_result[:5]) -embeddings = OpenAIEmbeddings(model="bedrock-embeddings", openai_api_base="http://0.0.0.0:8000", openai_api_key="temp-key") +embeddings = OpenAIEmbeddings(model="bedrock-embeddings", openai_api_base="http://0.0.0.0:4000", openai_api_key="temp-key") text = "This is a test document." @@ -242,7 +242,7 @@ query_result = embeddings.embed_query(text) print(f"BEDROCK EMBEDDINGS") print(query_result[:5]) -embeddings = OpenAIEmbeddings(model="bedrock-titan-embeddings", openai_api_base="http://0.0.0.0:8000", openai_api_key="temp-key") +embeddings = OpenAIEmbeddings(model="bedrock-titan-embeddings", openai_api_base="http://0.0.0.0:4000", openai_api_key="temp-key") text = "This is a test document." @@ -296,7 +296,7 @@ from openai import OpenAI # set base_url to your proxy server # set api_key to send to proxy server -client = OpenAI(api_key="", base_url="http://0.0.0.0:8000") +client = OpenAI(api_key="", base_url="http://0.0.0.0:4000") response = client.moderations.create( input="hello from litellm", @@ -310,7 +310,7 @@ print(response) ```shell -curl --location 'http://0.0.0.0:8000/moderations' \ +curl --location 'http://0.0.0.0:4000/moderations' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer sk-1234' \ --data '{"input": "Sample text goes here", "model": "text-moderation-stable"}' @@ -421,7 +421,7 @@ user_config = { import openai client = openai.OpenAI( api_key="sk-1234", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # send request to `user-azure-instance` @@ -489,7 +489,7 @@ const { OpenAI } = require('openai'); const openai = new OpenAI({ apiKey: "sk-1234", - baseURL: "http://0.0.0.0:8000" + baseURL: "http://0.0.0.0:4000" }); async function main() { @@ -516,7 +516,7 @@ Here's how to do it: import openai client = openai.OpenAI( api_key="sk-1234", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -541,7 +541,7 @@ Pass in the litellm_params (E.g. api_key, api_base, etc.) via the `extra_body` p import openai client = openai.OpenAI( api_key="sk-1234", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -571,7 +571,7 @@ const { OpenAI } = require('openai'); const openai = new OpenAI({ apiKey: "sk-1234", - baseURL: "http://0.0.0.0:8000" + baseURL: "http://0.0.0.0:4000" }); async function main() { diff --git a/docs/my-website/docs/proxy/users.md b/docs/my-website/docs/proxy/users.md index 9c8927caf..12cbda9d0 100644 --- a/docs/my-website/docs/proxy/users.md +++ b/docs/my-website/docs/proxy/users.md @@ -44,7 +44,7 @@ litellm /path/to/config.yaml **Step 3. Send test call** ```bash -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Autherization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{ @@ -72,7 +72,7 @@ By default the `max_budget` is set to `null` and is not checked for keys #### **Add budgets to users** ```shell -curl --location 'http://localhost:8000/user/new' \ +curl --location 'http://localhost:4000/user/new' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{"models": ["azure-models"], "max_budget": 0, "user_id": "krrish3@berri.ai"}' @@ -96,7 +96,7 @@ curl --location 'http://localhost:8000/user/new' \ `budget_duration`: Budget is reset at the end of specified duration. If not set, budget is never reset. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"). ``` -curl 'http://0.0.0.0:8000/user/new' \ +curl 'http://0.0.0.0:4000/user/new' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -113,7 +113,7 @@ Now you can just call `/key/generate` with that user_id (i.e. krrish3@berri.ai) - **Spend Tracking**: spend for this key will update krrish3@berri.ai's spend as well ```bash -curl --location 'http://0.0.0.0:8000/key/generate' \ +curl --location 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{"models": ["azure-models"], "user_id": "krrish3@berri.ai"}' @@ -127,7 +127,7 @@ You can: #### **Add budgets to users** ```shell -curl --location 'http://localhost:8000/team/new' \ +curl --location 'http://localhost:4000/team/new' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -238,7 +238,7 @@ By default the `max_budget` is set to `null` and is not checked for keys #### **Add budgets to keys** ```bash -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -250,7 +250,7 @@ curl 'http://0.0.0.0:8000/key/generate' \ Example Request to `/chat/completions` when key has crossed budget ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer ' \ --data ' { @@ -278,7 +278,7 @@ Expected Response from `/chat/completions` when key has crossed budget `budget_duration`: Budget is reset at the end of specified duration. If not set, budget is never reset. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"). ``` -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -310,7 +310,7 @@ By default the `model_max_budget` is set to `{}` and is not checked for keys #### **Add model specific budgets to keys** ```bash -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -335,7 +335,7 @@ Use `/user/new`, to persist rate limits across multiple keys. ```shell -curl --location 'http://0.0.0.0:8000/user/new' \ +curl --location 'http://0.0.0.0:4000/user/new' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{"user_id": "krrish@berri.ai", "max_parallel_requests": 10, "tpm_limit": 20, "rpm_limit": 4}' @@ -359,7 +359,7 @@ curl --location 'http://0.0.0.0:8000/user/new' \ Use `/key/generate`, if you want them for just that key. ```shell -curl --location 'http://0.0.0.0:8000/key/generate' \ +curl --location 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{"max_parallel_requests": 10, "tpm_limit": 20, "rpm_limit": 4}' @@ -401,7 +401,7 @@ model_list: **Step 2. Create key with access group** ```bash -curl --location 'http://localhost:8000/user/new' \ +curl --location 'http://localhost:4000/user/new' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{"models": ["beta-models"], # 👈 Model Access Group @@ -414,7 +414,7 @@ curl --location 'http://localhost:8000/user/new' \ Just include user_id in the `/key/generate` request. ```bash -curl --location 'http://0.0.0.0:8000/key/generate' \ +curl --location 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{"models": ["azure-models"], "user_id": "krrish@berri.ai"}' diff --git a/docs/my-website/docs/proxy/virtual_keys.md b/docs/my-website/docs/proxy/virtual_keys.md index 70fd6e6a8..e84b3c16f 100644 --- a/docs/my-website/docs/proxy/virtual_keys.md +++ b/docs/my-website/docs/proxy/virtual_keys.md @@ -59,7 +59,7 @@ litellm --config /path/to/config.yaml **Step 3: Generate temporary keys** ```shell -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{"models": ["gpt-3.5-turbo", "gpt-4", "claude-2"], "duration": "20m","metadata": {"user": "ishaan@berri.ai"}}' @@ -70,7 +70,7 @@ curl 'http://0.0.0.0:8000/key/generate' \ ### Request ```shell -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -105,7 +105,7 @@ Request Params: ```python { "key": "sk-kdEXbIqZRwEeEiHwdg7sFA", # Bearer token - "expires": "2023-11-19T01:38:25.838000+00:00" # datetime object + "expires": "2023-11-19T01:38:25.834000+00:00" # datetime object "key_name": "sk-...7sFA" # abbreviated key string, ONLY stored in db if `allow_user_auth: true` set - [see](./ui.md) ... } @@ -147,7 +147,7 @@ model_list: **Step 2: Generate a user key - enabling them access to specific models, custom model aliases, etc.** ```bash -curl -X POST "https://0.0.0.0:8000/key/generate" \ +curl -X POST "https://0.0.0.0:4000/key/generate" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ @@ -182,7 +182,7 @@ model_list: **Step 2. Create key with access group** ```bash -curl --location 'http://localhost:8000/key/generate' \ +curl --location 'http://localhost:4000/key/generate' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{"models": ["beta-models"], # 👈 Model Access Group @@ -194,7 +194,7 @@ curl --location 'http://localhost:8000/key/generate' \ ### Request ```shell -curl -X GET "http://0.0.0.0:8000/key/info?key=sk-02Wr4IAlN3NvPXvL5JVvDA" \ +curl -X GET "http://0.0.0.0:4000/key/info?key=sk-02Wr4IAlN3NvPXvL5JVvDA" \ -H "Authorization: Bearer sk-1234" ``` @@ -228,7 +228,7 @@ Request Params: ### Request ```shell -curl 'http://0.0.0.0:8000/key/update' \ +curl 'http://0.0.0.0:4000/key/update' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -266,7 +266,7 @@ Request Params: ### Request ```shell -curl 'http://0.0.0.0:8000/key/delete' \ +curl 'http://0.0.0.0:4000/key/delete' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -500,7 +500,7 @@ curl --location 'http://0.0.0.0:4000/chat/completions' \ Set `max_budget` in (USD $) param in the `key/generate` request. By default the `max_budget` is set to `null` and is not checked for keys ```shell -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{ @@ -517,7 +517,7 @@ curl 'http://0.0.0.0:8000/key/generate' \ Example Request to `/chat/completions` when key has crossed budget ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer sk-ULl_IKCVFy2EZRzQB16RUA' \ --data ' { @@ -545,10 +545,10 @@ Expected Response from `/chat/completions` when key has crossed budget LiteLLM exposes a `/user/new` endpoint to create budgets for users, that persist across multiple keys. -This is documented in the swagger (live on your server root endpoint - e.g. `http://0.0.0.0:8000/`). Here's an example request. +This is documented in the swagger (live on your server root endpoint - e.g. `http://0.0.0.0:4000/`). Here's an example request. ```shell -curl --location 'http://localhost:8000/user/new' \ +curl --location 'http://localhost:4000/user/new' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data-raw '{"models": ["azure-models"], "max_budget": 0, "user_id": "krrish3@berri.ai"}' @@ -571,7 +571,7 @@ The request is a normal `/key/generate` request body + a `max_budget` field. You can get spend for a key by using the `/key/info` endpoint. ```bash -curl 'http://0.0.0.0:8000/key/info?key=' \ +curl 'http://0.0.0.0:4000/key/info?key=' \ -X GET \ -H 'Authorization: Bearer ' ``` @@ -771,7 +771,7 @@ general_settings: #### Step 3. Generate Key ```bash -curl --location 'http://0.0.0.0:8000/key/generate' \ +curl --location 'http://0.0.0.0:4000/key/generate' \ --header 'Authorization: Bearer sk-1234' \ --header 'Content-Type: application/json' \ --data '{"models": ["azure-models"], "aliases": {"mistral-7b": "gpt-3.5-turbo"}, "duration": null}' diff --git a/docs/my-website/docs/simple_proxy_old_doc.md b/docs/my-website/docs/simple_proxy_old_doc.md index b48e345e1..9dcb27797 100644 --- a/docs/my-website/docs/simple_proxy_old_doc.md +++ b/docs/my-website/docs/simple_proxy_old_doc.md @@ -22,7 +22,7 @@ $ pip install 'litellm[proxy]' ```shell $ litellm --model huggingface/bigcode/starcoder -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` ### Test @@ -39,7 +39,7 @@ This will now automatically route any requests for gpt-3.5-turbo to bigcode star ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -59,7 +59,7 @@ curl --location 'http://0.0.0.0:8000/chat/completions' \ import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -246,7 +246,7 @@ Set `base_url` to the LiteLLM Proxy server import openai client = openai.OpenAI( api_key="anything", - base_url="http://0.0.0.0:8000" + base_url="http://0.0.0.0:4000" ) # request sent to model set on litellm proxy, `litellm --model` @@ -267,7 +267,7 @@ print(response) ```shell litellm --model gpt-3.5-turbo -#INFO: Proxy running on http://0.0.0.0:8000 +#INFO: Proxy running on http://0.0.0.0:4000 ``` #### 1. Clone the repo @@ -278,9 +278,9 @@ git clone https://github.com/danny-avila/LibreChat.git #### 2. Modify Librechat's `docker-compose.yml` -LiteLLM Proxy is running on port `8000`, set `8000` as the proxy below +LiteLLM Proxy is running on port `4000`, set `4000` as the proxy below ```yaml -OPENAI_REVERSE_PROXY=http://host.docker.internal:8000/v1/chat/completions +OPENAI_REVERSE_PROXY=http://host.docker.internal:4000/v1/chat/completions ``` #### 3. Save fake OpenAI key in Librechat's `.env` @@ -306,7 +306,7 @@ In the [config.py](https://continue.dev/docs/reference/Models/openai) set this a api_key="IGNORED", model="fake-model-name", context_length=2048, # customize if needed for your model - api_base="http://localhost:8000" # your proxy server url + api_base="http://localhost:4000" # your proxy server url ), ``` @@ -318,7 +318,7 @@ Credits [@vividfog](https://github.com/jmorganca/ollama/issues/305#issuecomment- ```shell $ pip install aider -$ aider --openai-api-base http://0.0.0.0:8000 --openai-api-key fake-key +$ aider --openai-api-base http://0.0.0.0:4000 --openai-api-key fake-key ``` @@ -332,7 +332,7 @@ from autogen import AssistantAgent, UserProxyAgent, oai config_list=[ { "model": "my-fake-model", - "api_base": "http://localhost:8000", #litellm compatible endpoint + "api_base": "http://localhost:4000", #litellm compatible endpoint "api_type": "open_ai", "api_key": "NULL", # just a placeholder } @@ -370,7 +370,7 @@ import guidance # set api_base to your proxy # set api_key to anything -gpt4 = guidance.llms.OpenAI("gpt-4", api_base="http://0.0.0.0:8000", api_key="anything") +gpt4 = guidance.llms.OpenAI("gpt-4", api_base="http://0.0.0.0:4000", api_key="anything") experts = guidance(''' {{#system~}} @@ -479,7 +479,7 @@ $ litellm --config /path/to/config.yaml #### Step 3: Use proxy Curl Command ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "zephyr-alpha", @@ -529,7 +529,7 @@ $ litellm --config /path/to/config.yaml #### Step 3: Use proxy Curl Command ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "gpt-3.5-turbo", @@ -586,7 +586,7 @@ litellm_settings: **Set dynamically** ```bash -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Content-Type: application/json' \ --data ' { "model": "zephyr-beta", @@ -615,7 +615,7 @@ model_list: - model_name: custom_embedding_model litellm_params: model: openai/custom_embedding # the `openai/` prefix tells litellm it's openai compatible - api_base: http://0.0.0.0:8000/ + api_base: http://0.0.0.0:4000/ - model_name: custom_embedding_model litellm_params: model: openai/custom_embedding # the `openai/` prefix tells litellm it's openai compatible @@ -665,7 +665,7 @@ litellm --config /path/to/config.yaml **Step 3: Generate temporary keys** ```shell -curl 'http://0.0.0.0:8000/key/generate' \ +curl 'http://0.0.0.0:4000/key/generate' \ --h 'Authorization: Bearer sk-1234' \ --d '{"models": ["gpt-3.5-turbo", "gpt-4", "claude-2"], "duration": "20m"}' ``` @@ -719,7 +719,7 @@ model_list: **Step 2: Generate a user key - enabling them access to specific models, custom model aliases, etc.** ```bash -curl -X POST "https://0.0.0.0:8000/key/generate" \ +curl -X POST "https://0.0.0.0:4000/key/generate" \ -H "Authorization: Bearer sk-1234" \ -H "Content-Type: application/json" \ -d '{ @@ -737,7 +737,7 @@ curl -X POST "https://0.0.0.0:8000/key/generate" \ You can get spend for a key by using the `/key/info` endpoint. ```bash -curl 'http://0.0.0.0:8000/key/info?key=' \ +curl 'http://0.0.0.0:4000/key/info?key=' \ -X GET \ -H 'Authorization: Bearer ' ``` @@ -868,7 +868,7 @@ $ litellm --config /path/to/config.yaml #### Using Caching Send the same request twice: ```shell -curl http://0.0.0.0:8000/v1/chat/completions \ +curl http://0.0.0.0:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-3.5-turbo", @@ -876,7 +876,7 @@ curl http://0.0.0.0:8000/v1/chat/completions \ "temperature": 0.7 }' -curl http://0.0.0.0:8000/v1/chat/completions \ +curl http://0.0.0.0:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-3.5-turbo", @@ -889,7 +889,7 @@ curl http://0.0.0.0:8000/v1/chat/completions \ Caching can be switched on/off per `/chat/completions` request - Caching **on** for completion - pass `caching=True`: ```shell - curl http://0.0.0.0:8000/v1/chat/completions \ + curl http://0.0.0.0:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-3.5-turbo", @@ -900,7 +900,7 @@ Caching can be switched on/off per `/chat/completions` request ``` - Caching **off** for completion - pass `caching=False`: ```shell - curl http://0.0.0.0:8000/v1/chat/completions \ + curl http://0.0.0.0:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-3.5-turbo", @@ -963,10 +963,10 @@ https://api.openai.com/v1/chat/completions \ Use this to health check all LLMs defined in your config.yaml #### Request ```shell -curl --location 'http://0.0.0.0:8000/health' +curl --location 'http://0.0.0.0:4000/health' ``` -You can also run `litellm -health` it makes a `get` request to `http://0.0.0.0:8000/health` for you +You can also run `litellm -health` it makes a `get` request to `http://0.0.0.0:4000/health` for you ``` litellm --health ``` @@ -1087,7 +1087,7 @@ litellm -config config.yaml #### Run a test request to Proxy ```shell -curl --location 'http://0.0.0.0:8000/chat/completions' \ +curl --location 'http://0.0.0.0:4000/chat/completions' \ --header 'Authorization: Bearer sk-1244' \ --data ' { "model": "gpt-3.5-turbo", @@ -1213,7 +1213,7 @@ LiteLLM proxy adds **0.00325 seconds** latency as compared to using the Raw Open ``` #### --port - - **Default:** `8000` + - **Default:** `4000` - The port to bind the server to. - **Usage:** ```shell diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index 367bbbb70..e5bcff646 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -61,7 +61,7 @@ def is_port_in_use(port): @click.option( "--host", default="0.0.0.0", help="Host for the server to listen on.", envvar="HOST" ) -@click.option("--port", default=8000, help="Port to bind the server to.", envvar="PORT") +@click.option("--port", default=4000, help="Port to bind the server to.", envvar="PORT") @click.option( "--num_workers", default=default_num_workers, @@ -273,7 +273,7 @@ def run_server( ], } - response = requests.post("http://0.0.0.0:8000/queue/request", json=data) + response = requests.post("http://0.0.0.0:4000/queue/request", json=data) response = response.json() @@ -507,7 +507,7 @@ def run_server( print( f"Unable to connect to DB. DATABASE_URL found in environment, but prisma package not found." ) - if port == 8000 and is_port_in_use(port): + if port == 4000 and is_port_in_use(port): port = random.randint(1024, 49152) from litellm.proxy.proxy_server import app diff --git a/litellm/router.py b/litellm/router.py index d4c0be862..2827a307c 100644 --- a/litellm/router.py +++ b/litellm/router.py @@ -246,7 +246,7 @@ class Router: "122999-2828282-277: { "model": "gpt-3", - "api_base": "http://localhost:8000", + "api_base": "http://localhost:4000", "num_requests": 20, "avg_latency": 0.001, "num_failures": 0, From 5ffbcf79d35350d9fe210d5becd0ca903ac53a83 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:01:44 -0800 Subject: [PATCH 251/304] fix(proxy_server.py): fix argon cfi checking --- litellm/proxy/proxy_server.py | 66 +++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 3ab3b2c04..51fefef50 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -319,7 +319,9 @@ async def user_api_key_auth( ### CHECK IF ADMIN ### # note: never string compare api keys, this is vulenerable to a time attack. Use secrets.compare_digest instead - is_master_key_valid = ph.verify(api_key, litellm_master_key_hash) + + is_master_key_valid = ph.verify(litellm_master_key_hash, api_key) + if is_master_key_valid: return UserAPIKeyAuth( api_key=master_key, @@ -1762,7 +1764,6 @@ class ProxyConfig: ) if master_key and master_key.startswith("os.environ/"): master_key = litellm.get_secret(master_key) - litellm_master_key_hash = ph.hash(master_key) ### CUSTOM API KEY AUTH ### ## pass filepath @@ -6871,42 +6872,45 @@ async def health_endpoint( else, the health checks will be run on models when /health is called. """ global health_check_results, use_background_health_checks, user_model - - if llm_model_list is None: - # if no router set, check if user set a model using litellm --model ollama/llama2 - if user_model is not None: - healthy_endpoints, unhealthy_endpoints = await perform_health_check( - model_list=[], cli_model=user_model + try: + if llm_model_list is None: + # if no router set, check if user set a model using litellm --model ollama/llama2 + if user_model is not None: + healthy_endpoints, unhealthy_endpoints = await perform_health_check( + model_list=[], cli_model=user_model + ) + return { + "healthy_endpoints": healthy_endpoints, + "unhealthy_endpoints": unhealthy_endpoints, + "healthy_count": len(healthy_endpoints), + "unhealthy_count": len(unhealthy_endpoints), + } + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail={"error": "Model list not initialized"}, ) + + ### FILTER MODELS FOR ONLY THOSE USER HAS ACCESS TO ### + if len(user_api_key_dict.models) > 0: + allowed_model_names = user_api_key_dict.models + else: + allowed_model_names = [] # + if use_background_health_checks: + return health_check_results + else: + healthy_endpoints, unhealthy_endpoints = await perform_health_check( + llm_model_list, model + ) + return { "healthy_endpoints": healthy_endpoints, "unhealthy_endpoints": unhealthy_endpoints, "healthy_count": len(healthy_endpoints), "unhealthy_count": len(unhealthy_endpoints), } - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail={"error": "Model list not initialized"}, - ) - - ### FILTER MODELS FOR ONLY THOSE USER HAS ACCESS TO ### - if len(user_api_key_dict.models) > 0: - allowed_model_names = user_api_key_dict.models - else: - allowed_model_names = [] # - if use_background_health_checks: - return health_check_results - else: - healthy_endpoints, unhealthy_endpoints = await perform_health_check( - llm_model_list, model - ) - - return { - "healthy_endpoints": healthy_endpoints, - "unhealthy_endpoints": unhealthy_endpoints, - "healthy_count": len(healthy_endpoints), - "unhealthy_count": len(unhealthy_endpoints), - } + except Exception as e: + traceback.print_exc() + raise e @router.get( From eb531364486ebce736eb2c2150d5b0b110eff134 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 8 Mar 2024 22:05:39 -0800 Subject: [PATCH 252/304] (ci/cd) run again --- litellm/tests/test_streaming.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py index c513447b0..2896b4a71 100644 --- a/litellm/tests/test_streaming.py +++ b/litellm/tests/test_streaming.py @@ -511,7 +511,7 @@ def test_completion_mistral_api_stream(): def test_completion_deep_infra_stream(): - # deep infra currently includes role in the 2nd chunk + # deep infra,currently includes role in the 2nd chunk # waiting for them to make a fix on this litellm.set_verbose = True try: From fac01f8481ecdcbd672de05c564ad898bb6763fe Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:23:21 -0800 Subject: [PATCH 253/304] fix(azure.py): add pre call logging for transcription calls --- litellm/llms/azure.py | 29 +++++++++++++++++++++++++++++ litellm/utils.py | 1 + tests/test_whisper.py | 3 +++ 3 files changed, 33 insertions(+) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index e19023b03..fb0d8b621 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -15,6 +15,7 @@ import litellm, json import httpx from .custom_httpx.azure_dall_e_2 import CustomHTTPTransport, AsyncCustomHTTPTransport from openai import AzureOpenAI, AsyncAzureOpenAI +import uuid class AzureOpenAIError(Exception): @@ -809,6 +810,19 @@ class AzureChatCompletion(BaseLLM): azure_client = AzureOpenAI(http_client=litellm.client_session, **azure_client_params) # type: ignore else: azure_client = client + + ## LOGGING + logging_obj.pre_call( + input=f"audio_file_{uuid.uuid4()}", + api_key=azure_client.api_key, + additional_args={ + "headers": {"Authorization": f"Bearer {azure_client.api_key}"}, + "api_base": azure_client._base_url._uri_reference, + "atranscription": True, + "complete_input_dict": data, + }, + ) + response = azure_client.audio.transcriptions.create( **data, timeout=timeout # type: ignore ) @@ -845,6 +859,21 @@ class AzureChatCompletion(BaseLLM): ) else: async_azure_client = client + + ## LOGGING + logging_obj.pre_call( + input=f"audio_file_{uuid.uuid4()}", + api_key=async_azure_client.api_key, + additional_args={ + "headers": { + "Authorization": f"Bearer {async_azure_client.api_key}" + }, + "api_base": async_azure_client._base_url._uri_reference, + "atranscription": True, + "complete_input_dict": data, + }, + ) + response = await async_azure_client.audio.transcriptions.create( **data, timeout=timeout ) # type: ignore diff --git a/litellm/utils.py b/litellm/utils.py index 330903f5a..c8a03245a 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -981,6 +981,7 @@ class Logging: curl_command = self.model_call_details # only print verbose if verbose logger is not set + if verbose_logger.level == 0: # this means verbose logger was not switched on - user is in litellm.set_verbose=True print_verbose(f"\033[92m{curl_command}\033[0m\n") diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 78e885ad3..7b6a4aa01 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -35,6 +35,7 @@ def test_transcription(): def test_transcription_azure(): + litellm.set_verbose = True transcript = litellm.transcription( model="azure/azure-whisper", file=audio_file, @@ -46,6 +47,8 @@ def test_transcription_azure(): assert transcript.text is not None assert isinstance(transcript.text, str) + raise Exception("it worked") + # test_transcription_azure() From 5f15047a03c97192d95dd261dad0cbd66f614664 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:27:36 -0800 Subject: [PATCH 254/304] build(config.yml): test specific whisper endpoint --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index daa4d59ec..1fd19905c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -182,7 +182,7 @@ jobs: command: | pwd ls - python -m pytest -vv tests/ -x --junitxml=test-results/junit.xml --durations=5 + python -m pytest -vv tests/test_whisper.py -x --junitxml=test-results/junit.xml --durations=5 no_output_timeout: 120m # Store test results From 0432c85bf79b53e6f85d26a94610bd0a90fdbcf9 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:43:07 -0800 Subject: [PATCH 255/304] test(test_whisper.py): add debugging for circle ci error --- tests/test_whisper.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 7b6a4aa01..b409a8f33 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -36,6 +36,7 @@ def test_transcription(): def test_transcription_azure(): litellm.set_verbose = True + print(f"AZURE EUROPE API BASE: {os.getenv('AZURE_EUROPE_API_BASE', None)}") transcript = litellm.transcription( model="azure/azure-whisper", file=audio_file, From c0c76707a1b14deb3f3b517807965dc732ad29ca Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:44:22 -0800 Subject: [PATCH 256/304] test(test_whisper.py): cleanup test --- tests/test_whisper.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_whisper.py b/tests/test_whisper.py index b409a8f33..62e50392c 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -48,8 +48,6 @@ def test_transcription_azure(): assert transcript.text is not None assert isinstance(transcript.text, str) - raise Exception("it worked") - # test_transcription_azure() From 7ff8fa09d614d61e71265941e2940a00769f3b1c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:51:17 -0800 Subject: [PATCH 257/304] test(test_whisper.py): hardcode api base --- tests/test_whisper.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 62e50392c..dfeebb161 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -36,13 +36,12 @@ def test_transcription(): def test_transcription_azure(): litellm.set_verbose = True - print(f"AZURE EUROPE API BASE: {os.getenv('AZURE_EUROPE_API_BASE', None)}") transcript = litellm.transcription( model="azure/azure-whisper", file=audio_file, - api_base=os.getenv("AZURE_EUROPE_API_BASE"), + api_base="https://my-endpoint-europe-berri-992.openai.azure.com/", api_key=os.getenv("AZURE_EUROPE_API_KEY"), - api_version=os.getenv("2024-02-15-preview"), + api_version="2024-02-15-preview", ) assert transcript.text is not None @@ -57,9 +56,9 @@ async def test_transcription_async_azure(): transcript = await litellm.atranscription( model="azure/azure-whisper", file=audio_file, - api_base=os.getenv("AZURE_EUROPE_API_BASE"), + api_base="https://my-endpoint-europe-berri-992.openai.azure.com/", api_key=os.getenv("AZURE_EUROPE_API_KEY"), - api_version=os.getenv("2024-02-15-preview"), + api_version="2024-02-15-preview", ) assert transcript.text is not None From daa371ade900a93b5b6abe0cc16d6c1e37ba01e8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:41:32 -0800 Subject: [PATCH 258/304] fix(utils.py): add support for anthropic params in get_supported_openai_params --- litellm/__init__.py | 2 +- litellm/utils.py | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index 506147166..04c2d23c7 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -570,7 +570,7 @@ from .utils import ( _calculate_retry_after, _should_retry, get_secret, - get_mapped_model_params, + get_supported_openai_params, ) from .llms.huggingface_restapi import HuggingfaceConfig from .llms.anthropic import AnthropicConfig diff --git a/litellm/utils.py b/litellm/utils.py index 32f0f765b..83f2a7ec1 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4581,7 +4581,7 @@ def get_optional_params( if stream: optional_params["stream"] = stream elif "anthropic" in model: - supported_params = get_mapped_model_params( + supported_params = get_supported_openai_params( model=model, custom_llm_provider=custom_llm_provider ) _check_valid_arg(supported_params=supported_params) @@ -5048,7 +5048,7 @@ def get_optional_params( return optional_params -def get_mapped_model_params(model: str, custom_llm_provider: str): +def get_supported_openai_params(model: str, custom_llm_provider: str): """ Returns the supported openai params for a given model + provider """ @@ -5057,6 +5057,18 @@ def get_mapped_model_params(model: str, custom_llm_provider: str): return litellm.AmazonAnthropicClaude3Config().get_supported_openai_params() else: return litellm.AmazonAnthropicConfig().get_supported_openai_params() + elif custom_llm_provider == "ollama_chat": + return litellm.OllamaChatConfig().get_supported_openai_params() + elif custom_llm_provider == "anthropic": + return [ + "stream", + "stop", + "temperature", + "top_p", + "max_tokens", + "tools", + "tool_choice", + ] def get_llm_provider( From aeb3cbc9b6f9e53a79b44b9e43c68493b672652c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 22:49:24 -0800 Subject: [PATCH 259/304] fix(utils.py): add additional providers to get_supported_openai_params --- litellm/utils.py | 146 +++++++++++++++++++++++++++-------------------- 1 file changed, 85 insertions(+), 61 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 83f2a7ec1..3d80ddf58 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4254,15 +4254,9 @@ def get_optional_params( ## raise exception if provider doesn't support passed in param if custom_llm_provider == "anthropic": ## check if unsupported param passed in - supported_params = [ - "stream", - "stop", - "temperature", - "top_p", - "max_tokens", - "tools", - "tool_choice", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # handle anthropic params if stream: @@ -4286,17 +4280,9 @@ def get_optional_params( optional_params["tools"] = tools elif custom_llm_provider == "cohere": ## check if unsupported param passed in - supported_params = [ - "stream", - "temperature", - "max_tokens", - "logit_bias", - "top_p", - "frequency_penalty", - "presence_penalty", - "stop", - "n", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # handle cohere params if stream: @@ -4897,25 +4883,9 @@ def get_optional_params( extra_body # openai client supports `extra_body` param ) elif custom_llm_provider == "openrouter": - supported_params = [ - "functions", - "function_call", - "temperature", - "top_p", - "n", - "stream", - "stop", - "max_tokens", - "presence_penalty", - "frequency_penalty", - "logit_bias", - "user", - "response_format", - "seed", - "tools", - "tool_choice", - "max_retries", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if functions is not None: @@ -4969,28 +4939,9 @@ def get_optional_params( ) else: # assume passing in params for openai/azure openai print_verbose(f"UNMAPPED PROVIDER, ASSUMING IT'S OPENAI/AZURE") - supported_params = [ - "functions", - "function_call", - "temperature", - "top_p", - "n", - "stream", - "stop", - "max_tokens", - "presence_penalty", - "frequency_penalty", - "logit_bias", - "user", - "response_format", - "seed", - "tools", - "tool_choice", - "max_retries", - "logprobs", - "top_logprobs", - "extra_headers", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider="openai" + ) _check_valid_arg(supported_params=supported_params) if functions is not None: optional_params["functions"] = functions @@ -5069,6 +5020,79 @@ def get_supported_openai_params(model: str, custom_llm_provider: str): "tools", "tool_choice", ] + elif custom_llm_provider == "cohere": + return [ + "stream", + "temperature", + "max_tokens", + "logit_bias", + "top_p", + "frequency_penalty", + "presence_penalty", + "stop", + "n", + ] + elif custom_llm_provider == "maritalk": + return [ + "stream", + "temperature", + "max_tokens", + "top_p", + "presence_penalty", + "stop", + ] + elif custom_llm_provider == "openai" or custom_llm_provider == "azure": + return [ + "functions", + "function_call", + "temperature", + "top_p", + "n", + "stream", + "stop", + "max_tokens", + "presence_penalty", + "frequency_penalty", + "logit_bias", + "user", + "response_format", + "seed", + "tools", + "tool_choice", + "max_retries", + "logprobs", + "top_logprobs", + "extra_headers", + ] + elif custom_llm_provider == "openrouter": + return [ + "functions", + "function_call", + "temperature", + "top_p", + "n", + "stream", + "stop", + "max_tokens", + "presence_penalty", + "frequency_penalty", + "logit_bias", + "user", + "response_format", + "seed", + "tools", + "tool_choice", + "max_retries", + ] + elif custom_llm_provider == "mistral": + return [ + "temperature", + "top_p", + "stream", + "max_tokens", + "tools", + "tool_choice", + ] def get_llm_provider( From fd52b502a63ab34c5ca9dfe5e5c116bba54f3305 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 23:06:26 -0800 Subject: [PATCH 260/304] fix(utils.py): *new* get_supported_openai_params() function Returns the supported openai params for a given model + provider --- litellm/utils.py | 293 +++++++++++++++++++++++++++++------------------ 1 file changed, 180 insertions(+), 113 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index 3d80ddf58..44921f72e 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4305,14 +4305,9 @@ def get_optional_params( optional_params["stop_sequences"] = stop elif custom_llm_provider == "maritalk": ## check if unsupported param passed in - supported_params = [ - "stream", - "temperature", - "max_tokens", - "top_p", - "presence_penalty", - "stop", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # handle cohere params if stream: @@ -4331,14 +4326,9 @@ def get_optional_params( optional_params["stopping_tokens"] = stop elif custom_llm_provider == "replicate": ## check if unsupported param passed in - supported_params = [ - "stream", - "temperature", - "max_tokens", - "top_p", - "stop", - "seed", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if stream: @@ -4359,7 +4349,9 @@ def get_optional_params( optional_params["stop_sequences"] = stop elif custom_llm_provider == "huggingface": ## check if unsupported param passed in - supported_params = ["stream", "temperature", "max_tokens", "top_p", "stop", "n"] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # temperature, top_p, n, stream, stop, max_tokens, n, presence_penalty default to None if temperature is not None: @@ -4398,16 +4390,9 @@ def get_optional_params( ) # since we handle translating echo, we should not send it to TGI request elif custom_llm_provider == "together_ai": ## check if unsupported param passed in - supported_params = [ - "stream", - "temperature", - "max_tokens", - "top_p", - "stop", - "frequency_penalty", - "tools", - "tool_choice", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if stream: @@ -4428,16 +4413,9 @@ def get_optional_params( optional_params["tool_choice"] = tool_choice elif custom_llm_provider == "ai21": ## check if unsupported param passed in - supported_params = [ - "stream", - "n", - "temperature", - "max_tokens", - "top_p", - "stop", - "frequency_penalty", - "presence_penalty", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if stream: @@ -4460,7 +4438,9 @@ def get_optional_params( custom_llm_provider == "palm" or custom_llm_provider == "gemini" ): # https://developers.generativeai.google/tutorials/curl_quickstart ## check if unsupported param passed in - supported_params = ["temperature", "top_p", "stream", "n", "stop", "max_tokens"] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if temperature is not None: @@ -4489,14 +4469,9 @@ def get_optional_params( ): print_verbose(f"(start) INSIDE THE VERTEX AI OPTIONAL PARAM BLOCK") ## check if unsupported param passed in - supported_params = [ - "temperature", - "top_p", - "max_tokens", - "stream", - "tools", - "tool_choice", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if temperature is not None: @@ -4526,7 +4501,9 @@ def get_optional_params( ) elif custom_llm_provider == "sagemaker": ## check if unsupported param passed in - supported_params = ["stream", "temperature", "max_tokens", "top_p", "stop", "n"] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # temperature, top_p, n, stream, stop, max_tokens, n, presence_penalty default to None if temperature is not None: @@ -4553,8 +4530,10 @@ def get_optional_params( max_tokens = 1 optional_params["max_new_tokens"] = max_tokens elif custom_llm_provider == "bedrock": + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) if "ai21" in model: - supported_params = ["max_tokens", "temperature", "top_p", "stream"] _check_valid_arg(supported_params=supported_params) # params "maxTokens":200,"temperature":0,"topP":250,"stop_sequences":[], # https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=j2-ultra @@ -4567,9 +4546,6 @@ def get_optional_params( if stream: optional_params["stream"] = stream elif "anthropic" in model: - supported_params = get_supported_openai_params( - model=model, custom_llm_provider=custom_llm_provider - ) _check_valid_arg(supported_params=supported_params) # anthropic params on bedrock # \"max_tokens_to_sample\":300,\"temperature\":0.5,\"top_p\":1,\"stop_sequences\":[\"\\\\n\\\\nHuman:\"]}" @@ -4586,7 +4562,6 @@ def get_optional_params( optional_params=optional_params, ) elif "amazon" in model: # amazon titan llms - supported_params = ["max_tokens", "temperature", "stop", "top_p", "stream"] _check_valid_arg(supported_params=supported_params) # see https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=titan-large if max_tokens is not None: @@ -4603,7 +4578,6 @@ def get_optional_params( if stream: optional_params["stream"] = stream elif "meta" in model: # amazon / meta llms - supported_params = ["max_tokens", "temperature", "top_p", "stream"] _check_valid_arg(supported_params=supported_params) # see https://us-west-2.console.aws.amazon.com/bedrock/home?region=us-west-2#/providers?model=titan-large if max_tokens is not None: @@ -4615,7 +4589,6 @@ def get_optional_params( if stream: optional_params["stream"] = stream elif "cohere" in model: # cohere models on bedrock - supported_params = ["stream", "temperature", "max_tokens"] _check_valid_arg(supported_params=supported_params) # handle cohere params if stream: @@ -4625,7 +4598,6 @@ def get_optional_params( if max_tokens is not None: optional_params["max_tokens"] = max_tokens elif "mistral" in model: - supported_params = ["max_tokens", "temperature", "stop", "top_p", "stream"] _check_valid_arg(supported_params=supported_params) # mistral params on bedrock # \"max_tokens\":400,\"temperature\":0.7,\"top_p\":0.7,\"stop\":[\"\\\\n\\\\nHuman:\"]}" @@ -4669,7 +4641,9 @@ def get_optional_params( optional_params["stop_sequences"] = stop elif custom_llm_provider == "cloudflare": # https://developers.cloudflare.com/workers-ai/models/text-generation/#input - supported_params = ["max_tokens", "stream"] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if max_tokens is not None: @@ -4677,14 +4651,9 @@ def get_optional_params( if stream is not None: optional_params["stream"] = stream elif custom_llm_provider == "ollama": - supported_params = [ - "max_tokens", - "stream", - "top_p", - "temperature", - "frequency_penalty", - "stop", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if max_tokens is not None: @@ -4708,16 +4677,9 @@ def get_optional_params( non_default_params=non_default_params, optional_params=optional_params ) elif custom_llm_provider == "nlp_cloud": - supported_params = [ - "max_tokens", - "stream", - "temperature", - "top_p", - "presence_penalty", - "frequency_penalty", - "n", - "stop", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if max_tokens is not None: @@ -4737,7 +4699,9 @@ def get_optional_params( if stop is not None: optional_params["stop_sequences"] = stop elif custom_llm_provider == "petals": - supported_params = ["max_tokens", "temperature", "top_p", "stream"] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) # max_new_tokens=1,temperature=0.9, top_p=0.6 if max_tokens is not None: @@ -4749,18 +4713,9 @@ def get_optional_params( if stream: optional_params["stream"] = stream elif custom_llm_provider == "deepinfra": - supported_params = [ - "temperature", - "top_p", - "n", - "stream", - "stop", - "max_tokens", - "presence_penalty", - "frequency_penalty", - "logit_bias", - "user", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if temperature is not None: if ( @@ -4787,14 +4742,9 @@ def get_optional_params( if user: optional_params["user"] = user elif custom_llm_provider == "perplexity": - supported_params = [ - "temperature", - "top_p", - "stream", - "max_tokens", - "presence_penalty", - "frequency_penalty", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if temperature is not None: if ( @@ -4813,15 +4763,9 @@ def get_optional_params( if frequency_penalty: optional_params["frequency_penalty"] = frequency_penalty elif custom_llm_provider == "anyscale": - supported_params = [ - "temperature", - "top_p", - "stream", - "max_tokens", - "stop", - "frequency_penalty", - "presence_penalty", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) if model in [ "mistralai/Mistral-7B-Instruct-v0.1", "mistralai/Mixtral-8x7B-Instruct-v0.1", @@ -4849,14 +4793,9 @@ def get_optional_params( if max_tokens: optional_params["max_tokens"] = max_tokens elif custom_llm_provider == "mistral": - supported_params = [ - "temperature", - "top_p", - "stream", - "max_tokens", - "tools", - "tool_choice", - ] + supported_params = get_supported_openai_params( + model=model, custom_llm_provider=custom_llm_provider + ) _check_valid_arg(supported_params=supported_params) if temperature is not None: optional_params["temperature"] = temperature @@ -5002,12 +4941,27 @@ def get_optional_params( def get_supported_openai_params(model: str, custom_llm_provider: str): """ Returns the supported openai params for a given model + provider + + Example: + ``` + get_supported_openai_params(model="anthropic.claude-3", custom_llm_provider="bedrock") + ``` """ if custom_llm_provider == "bedrock": if model.startswith("anthropic.claude-3"): return litellm.AmazonAnthropicClaude3Config().get_supported_openai_params() - else: + elif model.startswith("anthropic"): return litellm.AmazonAnthropicConfig().get_supported_openai_params() + elif model.startswith("ai21"): + return ["max_tokens", "temperature", "top_p", "stream"] + elif model.startswith("amazon"): + return ["max_tokens", "temperature", "stop", "top_p", "stream"] + elif model.startswith("meta"): + return ["max_tokens", "temperature", "top_p", "stream"] + elif model.startswith("cohere"): + return ["stream", "temperature", "max_tokens"] + elif model.startswith("mistral"): + return ["max_tokens", "temperature", "stop", "top_p", "stream"] elif custom_llm_provider == "ollama_chat": return litellm.OllamaChatConfig().get_supported_openai_params() elif custom_llm_provider == "anthropic": @@ -5093,6 +5047,119 @@ def get_supported_openai_params(model: str, custom_llm_provider: str): "tools", "tool_choice", ] + elif custom_llm_provider == "replicate": + return [ + "stream", + "temperature", + "max_tokens", + "top_p", + "stop", + "seed", + ] + elif custom_llm_provider == "huggingface": + return ["stream", "temperature", "max_tokens", "top_p", "stop", "n"] + elif custom_llm_provider == "together_ai": + return [ + "stream", + "temperature", + "max_tokens", + "top_p", + "stop", + "frequency_penalty", + "tools", + "tool_choice", + ] + elif custom_llm_provider == "ai21": + return [ + "stream", + "n", + "temperature", + "max_tokens", + "top_p", + "stop", + "frequency_penalty", + "presence_penalty", + ] + elif custom_llm_provider == "palm" or custom_llm_provider == "gemini": + return ["temperature", "top_p", "stream", "n", "stop", "max_tokens"] + elif custom_llm_provider == "vertex_ai": + return [ + "temperature", + "top_p", + "max_tokens", + "stream", + "tools", + "tool_choice", + ] + elif custom_llm_provider == "sagemaker": + return ["stream", "temperature", "max_tokens", "top_p", "stop", "n"] + elif custom_llm_provider == "aleph_alpha": + return [ + "max_tokens", + "stream", + "top_p", + "temperature", + "presence_penalty", + "frequency_penalty", + "n", + "stop", + ] + elif custom_llm_provider == "cloudflare": + return ["max_tokens", "stream"] + elif custom_llm_provider == "ollama": + return [ + "max_tokens", + "stream", + "top_p", + "temperature", + "frequency_penalty", + "stop", + ] + elif custom_llm_provider == "nlp_cloud": + return [ + "max_tokens", + "stream", + "temperature", + "top_p", + "presence_penalty", + "frequency_penalty", + "n", + "stop", + ] + elif custom_llm_provider == "petals": + return ["max_tokens", "temperature", "top_p", "stream"] + elif custom_llm_provider == "deepinfra": + return [ + "temperature", + "top_p", + "n", + "stream", + "stop", + "max_tokens", + "presence_penalty", + "frequency_penalty", + "logit_bias", + "user", + ] + elif custom_llm_provider == "perplexity": + return [ + "temperature", + "top_p", + "stream", + "max_tokens", + "presence_penalty", + "frequency_penalty", + ] + elif custom_llm_provider == "anyscale": + return [ + "temperature", + "top_p", + "stream", + "max_tokens", + "stop", + "frequency_penalty", + "presence_penalty", + ] def get_llm_provider( From c15c05e46038cef1359bc804cdc598d6edcfa7bd Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 23:07:26 -0800 Subject: [PATCH 261/304] build(config.yml): fix config.yml --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1fd19905c..daa4d59ec 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -182,7 +182,7 @@ jobs: command: | pwd ls - python -m pytest -vv tests/test_whisper.py -x --junitxml=test-results/junit.xml --durations=5 + python -m pytest -vv tests/ -x --junitxml=test-results/junit.xml --durations=5 no_output_timeout: 120m # Store test results From fef47618a7ba5996a8bb3ecf9a01bb525ed07870 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 23:31:18 -0800 Subject: [PATCH 262/304] =?UTF-8?q?bump:=20version=201.30.4=20=E2=86=92=20?= =?UTF-8?q?1.30.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4c00be910..9808352d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.4" +version = "1.30.5" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.4" +version = "1.30.5" version_files = [ "pyproject.toml:^version" ] From 775997b283e34d3bbeb628d801d3e03741de5175 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 23:33:54 -0800 Subject: [PATCH 263/304] fix(openai.py): fix async audio transcription --- litellm/llms/openai.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/llms/openai.py b/litellm/llms/openai.py index 64c0aa3af..9850cd61e 100644 --- a/litellm/llms/openai.py +++ b/litellm/llms/openai.py @@ -862,7 +862,7 @@ class OpenAIChatCompletion(BaseLLM): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="image_generation") # type: ignore + return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore except Exception as e: ## LOGGING logging_obj.post_call( From b0fa25dfbda17a02df36a47b2236612424a22876 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 23:51:24 -0800 Subject: [PATCH 264/304] docs(audio_transcription.md): add docs on audio transcription --- docs/my-website/docs/audio_transcription.md | 85 +++++++++++++++++++++ docs/my-website/sidebars.js | 5 +- 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 docs/my-website/docs/audio_transcription.md diff --git a/docs/my-website/docs/audio_transcription.md b/docs/my-website/docs/audio_transcription.md new file mode 100644 index 000000000..09fa1a1b9 --- /dev/null +++ b/docs/my-website/docs/audio_transcription.md @@ -0,0 +1,85 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Audio Transcription + +Use this to loadbalance across Azure + OpenAI. + +## Quick Start + +```python +from litellm import transcription +import os + +# set api keys +os.environ["OPENAI_API_KEY"] = "" +audio_file = open("/path/to/audio.mp3", "rb") + +response = transcription(model="whisper", file=audio_file) + +print(f"response: {response}") +``` + +## Proxy Usage + +### Add model to config + + + + + +```yaml +model_list: +- model_name: whisper + litellm_params: + model: whisper-1 + api_key: os.environ/OPENAI_API_KEY + model_info: + mode: audio_transcription + +general_settings: + master_key: sk-1234 +``` + + + +```yaml +model_list: +- model_name: whisper + litellm_params: + model: whisper-1 + api_key: os.environ/OPENAI_API_KEY + model_info: + mode: audio_transcription +- model_name: whisper + litellm_params: + model: azure/azure-whisper + api_version: 2024-02-15-preview + api_base: os.environ/AZURE_EUROPE_API_BASE + api_key: os.environ/AZURE_EUROPE_API_KEY + model_info: + mode: audio_transcription + +general_settings: + master_key: sk-1234 +``` + + + + +### Start proxy + +```bash +litellm --config /path/to/config.yaml + +# RUNNING on http://0.0.0.0:8000 +``` + +### Test + +```bash +curl --location 'http://0.0.0.0:4000/v1/audio/transcriptions' \ +--header 'Authorization: Bearer sk-1234' \ +--form 'file=@"/Users/krrishdholakia/Downloads/gettysburg.wav"' \ +--form 'model="whisper"' +``` diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 7aaf2e114..33720b43e 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -101,12 +101,13 @@ const sidebars = { }, { type: "category", - label: "Embedding(), Moderation(), Image Generation()", + label: "Embedding(), Moderation(), Image Generation(), Audio Transcriptions()", items: [ "embedding/supported_embedding", "embedding/async_embedding", "embedding/moderation", - "image_generation" + "image_generation", + "audio_transcription" ], }, { From d8a6b8216d4f1992cf72c98122cfbfdbb6d4d5a8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 8 Mar 2024 23:54:13 -0800 Subject: [PATCH 265/304] docs(input.md): add docs on 'get_supported_openai_params' --- docs/my-website/docs/completion/input.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/my-website/docs/completion/input.md b/docs/my-website/docs/completion/input.md index e3ad9245d..fd5594610 100644 --- a/docs/my-website/docs/completion/input.md +++ b/docs/my-website/docs/completion/input.md @@ -24,6 +24,17 @@ print(response) ``` ### Translated OpenAI params + +Use this function to get an up-to-date list of supported openai params for any model + provider. + +```python +from litellm import get_supported_openai_params + +response = get_supported_openai_params(model="anthropic.claude-3", custom_llm_provider="bedrock") + +print(response) # ["max_tokens", "tools", "tool_choice", "stream"] +``` + This is a list of openai params we translate across providers. This list is constantly being updated. From 7a1b3ca30dc145f6604393e89e30c007e23e632d Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Sun, 10 Mar 2024 01:52:36 +0530 Subject: [PATCH 266/304] feat(helm-chart): redis as cache managed by chart --- .gitignore | 1 + deploy/charts/litellm/Chart.yaml | 4 ++++ deploy/charts/litellm/templates/_helpers.tpl | 8 ++++++++ deploy/charts/litellm/templates/deployment.yaml | 11 +++++++++++ deploy/charts/litellm/values.yaml | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/.gitignore b/.gitignore index de1c7598f..b03bc895b 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ deploy/charts/litellm/*.tgz deploy/charts/litellm/charts/* deploy/charts/*.tgz litellm/proxy/vertex_key.json +**/.vim/ diff --git a/deploy/charts/litellm/Chart.yaml b/deploy/charts/litellm/Chart.yaml index 6ecdebb50..cc08a9921 100644 --- a/deploy/charts/litellm/Chart.yaml +++ b/deploy/charts/litellm/Chart.yaml @@ -31,3 +31,7 @@ dependencies: version: ">=13.3.0" repository: oci://registry-1.docker.io/bitnamicharts condition: db.deployStandalone + - name: redis + version: ">=18.0.0" + repository: oci://registry-1.docker.io/bitnamicharts + condition: redis.enabled diff --git a/deploy/charts/litellm/templates/_helpers.tpl b/deploy/charts/litellm/templates/_helpers.tpl index b8893d07c..fa563fadc 100644 --- a/deploy/charts/litellm/templates/_helpers.tpl +++ b/deploy/charts/litellm/templates/_helpers.tpl @@ -60,3 +60,11 @@ Create the name of the service account to use {{- default "default" .Values.serviceAccount.name }} {{- end }} {{- end }} + +{{/* +Get redis service name +*/}} +{{- define "litellm.redis.serviceName" -}} +{{- printf "%s-headless" (default "redis" .Values.redis.nameOverride | trunc 63 | trimSuffix "-") -}} +{{- end -}} + diff --git a/deploy/charts/litellm/templates/deployment.yaml b/deploy/charts/litellm/templates/deployment.yaml index 6ed112dac..bc2a0bd09 100644 --- a/deploy/charts/litellm/templates/deployment.yaml +++ b/deploy/charts/litellm/templates/deployment.yaml @@ -142,6 +142,17 @@ spec: secretKeyRef: name: {{ include "litellm.fullname" . }}-masterkey key: masterkey + {{- if .Values.redis.enabled }} + - name: REDIS_HOST + value: {{ template "litellm.redis.serviceName" . }} + - name: REDIS_PORT + value: {{ if .Values.redis.sentinel.enabled }}{{ .Values.redis.sentinel.service.ports.sentinel }}{{ else }}{{ .Values.redis.master.service.ports.redis}}{{ end }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "redis.secretName" . }} + key: {{include "redis.secretPasswordKey" . }} + {{- end }} envFrom: {{- range .Values.environmentSecrets }} - secretRef: diff --git a/deploy/charts/litellm/values.yaml b/deploy/charts/litellm/values.yaml index 1b83fe801..9b697b013 100644 --- a/deploy/charts/litellm/values.yaml +++ b/deploy/charts/litellm/values.yaml @@ -166,3 +166,9 @@ postgresql: # existingSecret: "" # secretKeys: # userPasswordKey: password + +# requires cache: true in config file +# either enable this or pass a secret for REDIS_HOST, REDIS_PORT, REDIS_PASSWORD or REDIS_URL +# with cache: true to use existing redis instance +redis: + enabled: false From 7ae7e95da174523ca56d4c932f32582f92faf10b Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 13:04:52 -0800 Subject: [PATCH 267/304] (docs) litellm getting started clarify sdk vs proxy --- docs/my-website/docs/index.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/my-website/docs/index.md b/docs/my-website/docs/index.md index d7ed14019..d3284e6fb 100644 --- a/docs/my-website/docs/index.md +++ b/docs/my-website/docs/index.md @@ -13,7 +13,14 @@ https://github.com/BerriAI/litellm - Retry/fallback logic across multiple deployments (e.g. Azure/OpenAI) - [Router](https://docs.litellm.ai/docs/routing) - Track spend & set budgets per project [OpenAI Proxy Server](https://docs.litellm.ai/docs/simple_proxy) -## Basic usage +## How to use LiteLLM +You can use litellm through either: +1. [OpenAI proxy Server](#openai-proxy) - Server to call 100+ LLMs, load balance, cost tracking across projects +2. [LiteLLM python SDK](#basic-usage) - Python Client to call 100+ LLMs, load balance, cost tracking + +## LiteLLM Python SDK + +### Basic usage Open In Colab @@ -144,7 +151,7 @@ response = completion( -## Streaming +### Streaming Set `stream=True` in the `completion` args. @@ -276,7 +283,7 @@ response = completion( -## Exception handling +### Exception handling LiteLLM maps exceptions across all supported providers to the OpenAI exceptions. All our exceptions inherit from OpenAI's exception types, so any error-handling you have for that, should work out of the box with LiteLLM. @@ -292,7 +299,7 @@ except OpenAIError as e: print(e) ``` -## Logging Observability - Log LLM Input/Output ([Docs](https://docs.litellm.ai/docs/observability/callbacks)) +### Logging Observability - Log LLM Input/Output ([Docs](https://docs.litellm.ai/docs/observability/callbacks)) LiteLLM exposes pre defined callbacks to send data to Langfuse, LLMonitor, Helicone, Promptlayer, Traceloop, Slack ```python from litellm import completion @@ -311,7 +318,7 @@ litellm.success_callback = ["langfuse", "llmonitor"] # log input/output to langf response = completion(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hi 👋 - i'm openai"}]) ``` -## Track Costs, Usage, Latency for streaming +### Track Costs, Usage, Latency for streaming Use a callback function for this - more info on custom callbacks: https://docs.litellm.ai/docs/observability/custom_callback ```python From 4b60bea975b93a5caa4f1cbcb3c8cfe1c5190dfc Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 13:05:01 -0800 Subject: [PATCH 268/304] fix(proxy/utils.py): add more logging for prisma client get_data error --- litellm/proxy/utils.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 32f799360..89976ff0d 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -761,6 +761,7 @@ class PrismaClient: int ] = None, # pagination, number of rows to getch when find_all==True ): + args_passed_in = locals() verbose_proxy_logger.debug( f"PrismaClient: get_data: token={token}, table_name: {table_name}, query_type: {query_type}, user_id: {user_id}, user_id_list: {user_id_list}, team_id: {team_id}, team_id_list: {team_id_list}, key_val: {key_val}" ) @@ -794,6 +795,12 @@ class PrismaClient: response.expires, datetime ): response.expires = response.expires.isoformat() + else: + # Token does not exist. + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail=f"Authentication Error: invalid user key - user key does not exist in db. User Key={token}", + ) elif query_type == "find_all" and user_id is not None: response = await self.db.litellm_verificationtoken.find_many( where={"user_id": user_id}, @@ -997,7 +1004,7 @@ class PrismaClient: except Exception as e: import traceback - prisma_query_info = f"LiteLLM Prisma Client Exception: get_data: token={token}, table_name: {table_name}, query_type: {query_type}, user_id: {user_id}, user_id_list: {user_id_list}, team_id: {team_id}, team_id_list: {team_id_list}, key_val: {key_val}" + prisma_query_info = f"LiteLLM Prisma Client Exception: Error with `get_data`. Args passed in: {args_passed_in}" error_msg = prisma_query_info + str(e) print_verbose(error_msg) error_traceback = error_msg + "\n" + traceback.format_exc() From 5692481515742fa7220f4ecd246227d516ac4f47 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 13:06:37 -0800 Subject: [PATCH 269/304] =?UTF-8?q?bump:=20version=201.30.5=20=E2=86=92=20?= =?UTF-8?q?1.30.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9808352d6..fa7a78775 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.5" +version = "1.30.6" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -74,7 +74,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.5" +version = "1.30.6" version_files = [ "pyproject.toml:^version" ] From b3646f6644efaa6dc8ec851e035069833797f954 Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Sun, 10 Mar 2024 02:37:10 +0530 Subject: [PATCH 270/304] fix: redis context --- deploy/charts/litellm/Chart.lock | 9 ++++++--- deploy/charts/litellm/templates/deployment.yaml | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/deploy/charts/litellm/Chart.lock b/deploy/charts/litellm/Chart.lock index 7b6ed69d9..f13578d8d 100644 --- a/deploy/charts/litellm/Chart.lock +++ b/deploy/charts/litellm/Chart.lock @@ -1,6 +1,9 @@ dependencies: - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts - version: 13.3.1 -digest: sha256:f5c129150f0d38dd06752ab37f3c8e143d7c14d30379af058767bcd9f4ba83dd -generated: "2024-01-19T11:32:56.694808861+11:00" + version: 14.3.1 +- name: redis + repository: oci://registry-1.docker.io/bitnamicharts + version: 18.19.1 +digest: sha256:8660fe6287f9941d08c0902f3f13731079b8cecd2a5da2fbc54e5b7aae4a6f62 +generated: "2024-03-10T02:28:52.275022+05:30" diff --git a/deploy/charts/litellm/templates/deployment.yaml b/deploy/charts/litellm/templates/deployment.yaml index bc2a0bd09..42cf84935 100644 --- a/deploy/charts/litellm/templates/deployment.yaml +++ b/deploy/charts/litellm/templates/deployment.yaml @@ -150,8 +150,8 @@ spec: - name: REDIS_PASSWORD valueFrom: secretKeyRef: - name: {{ include "redis.secretName" . }} - key: {{include "redis.secretPasswordKey" . }} + name: {{ include "redis.secretName" .Subcharts.redis }} + key: {{include "redis.secretPasswordKey" .Subcharts.redis }} {{- end }} envFrom: {{- range .Values.environmentSecrets }} From eea803cae44ab34a90075042f468b09512fe1014 Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Sun, 10 Mar 2024 03:06:17 +0530 Subject: [PATCH 271/304] chore: better handling redis deployment architecture and connection --- deploy/charts/litellm/templates/_helpers.tpl | 16 +++++++++++++++- deploy/charts/litellm/templates/deployment.yaml | 4 ++-- deploy/charts/litellm/values.yaml | 3 +++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/deploy/charts/litellm/templates/_helpers.tpl b/deploy/charts/litellm/templates/_helpers.tpl index fa563fadc..a1eda28c6 100644 --- a/deploy/charts/litellm/templates/_helpers.tpl +++ b/deploy/charts/litellm/templates/_helpers.tpl @@ -65,6 +65,20 @@ Create the name of the service account to use Get redis service name */}} {{- define "litellm.redis.serviceName" -}} -{{- printf "%s-headless" (default "redis" .Values.redis.nameOverride | trunc 63 | trimSuffix "-") -}} +{{- if and (eq .Values.redis.architecture "standalone") .Values.redis.sentinel.enabled -}} +{{- printf "%s-%s" .Release.Name (default "redis" .Values.redis.nameOverride | trunc 63 | trimSuffix "-") -}} +{{- else -}} +{{- printf "%s-%s-master" .Release.Name (default "redis" .Values.redis.nameOverride | trunc 63 | trimSuffix "-") -}} +{{- end -}} {{- end -}} +{{/* +Get redis service port +*/}} +{{- define "litellm.redis.port" -}} +{{- if .Values.redis.sentinel.enabled -}} +{{ .Values.redis.sentinel.service.ports.sentinel }} +{{- else -}} +{{ .Values.redis.master.service.ports.redis }} +{{- end -}} +{{- end -}} diff --git a/deploy/charts/litellm/templates/deployment.yaml b/deploy/charts/litellm/templates/deployment.yaml index 42cf84935..736f35680 100644 --- a/deploy/charts/litellm/templates/deployment.yaml +++ b/deploy/charts/litellm/templates/deployment.yaml @@ -144,9 +144,9 @@ spec: key: masterkey {{- if .Values.redis.enabled }} - name: REDIS_HOST - value: {{ template "litellm.redis.serviceName" . }} + value: {{ include "litellm.redis.serviceName" . }} - name: REDIS_PORT - value: {{ if .Values.redis.sentinel.enabled }}{{ .Values.redis.sentinel.service.ports.sentinel }}{{ else }}{{ .Values.redis.master.service.ports.redis}}{{ end }} + value: {{ include "litellm.redis.port" . | quote }} - name: REDIS_PASSWORD valueFrom: secretKeyRef: diff --git a/deploy/charts/litellm/values.yaml b/deploy/charts/litellm/values.yaml index 9b697b013..1d8f9ba3e 100644 --- a/deploy/charts/litellm/values.yaml +++ b/deploy/charts/litellm/values.yaml @@ -87,6 +87,8 @@ proxy_config: api_key: eXaMpLeOnLy general_settings: master_key: os.environ/PROXY_MASTER_KEY +# litellm_settings: +# cache: true resources: {} # We usually recommend not to specify default resources and to leave this as a conscious @@ -172,3 +174,4 @@ postgresql: # with cache: true to use existing redis instance redis: enabled: false + architecture: replication From 5777aeb36e679c26b6c3dca39405601a321468e9 Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Sun, 10 Mar 2024 03:09:00 +0530 Subject: [PATCH 272/304] chore: set simpler redis architecture as default --- deploy/charts/litellm/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/charts/litellm/values.yaml b/deploy/charts/litellm/values.yaml index 1d8f9ba3e..3ae089636 100644 --- a/deploy/charts/litellm/values.yaml +++ b/deploy/charts/litellm/values.yaml @@ -174,4 +174,4 @@ postgresql: # with cache: true to use existing redis instance redis: enabled: false - architecture: replication + architecture: standalone From ba271e3e87abc98ca6c99d3cea6bbc8c34af8d59 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 13:41:20 -0800 Subject: [PATCH 273/304] (docs) deploying litell --- docs/my-website/docs/proxy/deploy.md | 62 ++++++++++++++++++++++++---- docs/my-website/sidebars.js | 8 ++-- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 496bde05f..655d93b6b 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -28,7 +28,7 @@ docker run ghcr.io/berriai/litellm:main-latest -### Run with LiteLLM CLI args +#### Run with LiteLLM CLI args See all supported CLI args [here](https://docs.litellm.ai/docs/proxy/cli): @@ -129,13 +129,25 @@ spec: name: litellm-config-file ``` -> [!TIP] -> To avoid issues with predictability, difficulties in rollback, and inconsistent environments, use versioning or SHA digests (for example, `litellm:main-v1.30.3` or `litellm@sha256:12345abcdef...`) instead of `litellm:main-latest`. +:::info +To avoid issues with predictability, difficulties in rollback, and inconsistent environments, use versioning or SHA digests (for example, `litellm:main-v1.30.3` or `litellm@sha256:12345abcdef...`) instead of `litellm:main-latest`. +::: +**That's it ! That's the quick start to deploy litellm** + +## Options to deploy LiteLLM + +| Method | When to Use | Docs | +| --- | --- | --- | +| LiteLLM - Quick Start | call 100+ LLMs + Load Balancing | [Quick Start](#quick-start) | +| LiteLLM Database container + PostgresDB | + use Virtual Keys + Track Spend | [Deploy with Database](#deploy-with-database) | +| LiteLLM container + Redis | + load balance across multiple litellm containers | [LiteLLM container + Redis](#litellm-container--redis) | +| LiteLLM Database container + PostgresDB + Redis | + use Virtual Keys + Track Spend + load balance across multiple litellm containers | [LiteLLM container + Redis](#litellm-container--redis) | + ## Deploy with Database We maintain a [seperate Dockerfile](https://github.com/BerriAI/litellm/pkgs/container/litellm-database) for reducing build time when running LiteLLM proxy with a connected Postgres Database @@ -159,7 +171,7 @@ Your OpenAI proxy server is now running on `http://0.0.0.0:4000`. -### Step 1. Create deployment.yaml +#### Step 1. Create deployment.yaml ```yaml apiVersion: apps/v1 @@ -188,7 +200,7 @@ Your OpenAI proxy server is now running on `http://0.0.0.0:4000`. kubectl apply -f /path/to/deployment.yaml ``` -### Step 2. Create service.yaml +#### Step 2. Create service.yaml ```yaml apiVersion: v1 @@ -209,7 +221,7 @@ spec: kubectl apply -f /path/to/service.yaml ``` -### Step 3. Start server +#### Step 3. Start server ``` kubectl port-forward service/litellm-service 4000:4000 @@ -220,13 +232,13 @@ Your OpenAI proxy server is now running on `http://0.0.0.0:4000`. -### Step 1. Clone the repository +#### Step 1. Clone the repository ```bash git clone https://github.com/BerriAI/litellm.git ``` -### Step 2. Deploy with Helm +#### Step 2. Deploy with Helm ```bash helm install \ @@ -235,7 +247,7 @@ helm install \ deploy/charts/litellm ``` -### Step 3. Expose the service to localhost +#### Step 3. Expose the service to localhost ```bash kubectl \ @@ -249,6 +261,38 @@ Your OpenAI proxy server is now running on `http://127.0.0.1:8000`. +## LiteLLM container + Redis +Use Redis when you need litellm to load balance across multiple litellm containers + +The only change required is setting Redis on your `config.yaml` +LiteLLM Proxy supports sharing rpm/tpm shared across multiple litellm instances, pass `redis_host`, `redis_password` and `redis_port` to enable this. (LiteLLM will use Redis to track rpm/tpm usage ) + +```yaml +model_list: + - model_name: gpt-3.5-turbo + litellm_params: + model: azure/ + api_base: + api_key: + rpm: 6 # Rate limit for this deployment: in requests per minute (rpm) + - model_name: gpt-3.5-turbo + litellm_params: + model: azure/gpt-turbo-small-ca + api_base: https://my-endpoint-canada-berri992.openai.azure.com/ + api_key: + rpm: 6 +router_settings: + redis_host: + redis_password: + redis_port: 1992 +``` + +Start docker container with config + +```shell +docker run ghcr.io/berriai/litellm:main-latest --config your_config.yaml +``` + ## Best Practices for Deploying to Production ### 1. Switch of debug logs in production don't use [`--detailed-debug`, `--debug`](https://docs.litellm.ai/docs/proxy/debugging#detailed-debug) or `litellm.set_verbose=True`. We found using debug logs can add 5-10% latency per LLM API call diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 33720b43e..62a2d3842 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -42,10 +42,6 @@ const sidebars = { "proxy/team_based_routing", "proxy/ui", "proxy/budget_alerts", - "proxy/model_management", - "proxy/health", - "proxy/debugging", - "proxy/pii_masking", { "type": "category", "label": "🔥 Load Balancing", @@ -54,6 +50,10 @@ const sidebars = { "proxy/reliability", ] }, + "proxy/model_management", + "proxy/health", + "proxy/debugging", + "proxy/pii_masking", "proxy/caching", { "type": "category", From a0042401094b760dadda53bbf083f508e21f7a4e Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 13:45:07 -0800 Subject: [PATCH 274/304] (docs) deploy litellm --- docs/my-website/docs/proxy/deploy.md | 48 ++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 655d93b6b..7c336e66f 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -141,12 +141,13 @@ To avoid issues with predictability, difficulties in rollback, and inconsistent ## Options to deploy LiteLLM -| Method | When to Use | Docs | -| --- | --- | --- | -| LiteLLM - Quick Start | call 100+ LLMs + Load Balancing | [Quick Start](#quick-start) | -| LiteLLM Database container + PostgresDB | + use Virtual Keys + Track Spend | [Deploy with Database](#deploy-with-database) | -| LiteLLM container + Redis | + load balance across multiple litellm containers | [LiteLLM container + Redis](#litellm-container--redis) | -| LiteLLM Database container + PostgresDB + Redis | + use Virtual Keys + Track Spend + load balance across multiple litellm containers | [LiteLLM container + Redis](#litellm-container--redis) | +| Docs | When to Use | +| --- | --- | +| [Quick Start](#quick-start) | call 100+ LLMs + Load Balancing | +| [Deploy with Database](#deploy-with-database) | + use Virtual Keys + Track Spend | +| [LiteLLM container + Redis](#litellm-container--redis) | + load balance across multiple litellm containers | +| [LiteLLM Database container + PostgresDB + Redis](#litellm-database-container--postgresdb--redis) | + use Virtual Keys + Track Spend + load balance across multiple litellm containers | + ## Deploy with Database @@ -293,6 +294,41 @@ Start docker container with config docker run ghcr.io/berriai/litellm:main-latest --config your_config.yaml ``` +## LiteLLM Database container + PostgresDB + Redis + +The only change required is setting Redis on your `config.yaml` +LiteLLM Proxy supports sharing rpm/tpm shared across multiple litellm instances, pass `redis_host`, `redis_password` and `redis_port` to enable this. (LiteLLM will use Redis to track rpm/tpm usage ) + + +```yaml +model_list: + - model_name: gpt-3.5-turbo + litellm_params: + model: azure/ + api_base: + api_key: + rpm: 6 # Rate limit for this deployment: in requests per minute (rpm) + - model_name: gpt-3.5-turbo + litellm_params: + model: azure/gpt-turbo-small-ca + api_base: https://my-endpoint-canada-berri992.openai.azure.com/ + api_key: + rpm: 6 +router_settings: + redis_host: + redis_password: + redis_port: 1992 +``` + +Start `litellm-database`docker container with config + +```shell +docker run --name litellm-proxy \ +-e DATABASE_URL=postgresql://:@:/ \ +-p 4000:4000 \ +ghcr.io/berriai/litellm-database:main-latest --config your_config.yaml +``` + ## Best Practices for Deploying to Production ### 1. Switch of debug logs in production don't use [`--detailed-debug`, `--debug`](https://docs.litellm.ai/docs/proxy/debugging#detailed-debug) or `litellm.set_verbose=True`. We found using debug logs can add 5-10% latency per LLM API call From 8b24ddcbbdc7094df8c20a9e6340934391542120 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 14:02:27 -0800 Subject: [PATCH 275/304] fix(bedrock.py): enable claude-3 streaming --- litellm/llms/bedrock.py | 2 ++ litellm/tests/test_streaming.py | 25 +++++++++++++++++++++++++ litellm/utils.py | 11 +++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/litellm/llms/bedrock.py b/litellm/llms/bedrock.py index 89d1bf16f..4aa27b3c9 100644 --- a/litellm/llms/bedrock.py +++ b/litellm/llms/bedrock.py @@ -126,6 +126,8 @@ class AmazonAnthropicClaude3Config: optional_params["max_tokens"] = value if param == "tools": optional_params["tools"] = value + if param == "stream": + optional_params["stream"] = value return optional_params diff --git a/litellm/tests/test_streaming.py b/litellm/tests/test_streaming.py index 2896b4a71..6f8d73c31 100644 --- a/litellm/tests/test_streaming.py +++ b/litellm/tests/test_streaming.py @@ -727,6 +727,31 @@ def test_completion_claude_stream_bad_key(): # pytest.fail(f"Error occurred: {e}") +def test_bedrock_claude_3_streaming(): + try: + litellm.set_verbose = True + response: ModelResponse = completion( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + messages=messages, + max_tokens=10, + stream=True, + ) + complete_response = "" + # Add any assertions here to check the response + for idx, chunk in enumerate(response): + chunk, finished = streaming_format_tests(idx, chunk) + if finished: + break + complete_response += chunk + if complete_response.strip() == "": + raise Exception("Empty response received") + print(f"completion_response: {complete_response}") + except RateLimitError: + pass + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + @pytest.mark.skip(reason="Replicate changed exceptions") def test_completion_replicate_stream_bad_key(): try: diff --git a/litellm/utils.py b/litellm/utils.py index 7466bd5c6..6d42ec2d3 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -8778,13 +8778,20 @@ class CustomStreamWrapper: text = chunk_data.get("completions")[0].get("data").get("text") is_finished = True finish_reason = "stop" - # anthropic mapping - elif "completion" in chunk_data: + ######## bedrock.anthropic mappings ############### + elif "completion" in chunk_data: # not claude-3 text = chunk_data["completion"] # bedrock.anthropic stop_reason = chunk_data.get("stop_reason", None) if stop_reason != None: is_finished = True finish_reason = stop_reason + elif "delta" in chunk_data: + if chunk_data["delta"].get("text", None) is not None: + text = chunk_data["delta"]["text"] + stop_reason = chunk_data["delta"].get("stop_reason", None) + if stop_reason != None: + is_finished = True + finish_reason = stop_reason ######## bedrock.cohere mappings ############### # meta mapping elif "generation" in chunk_data: From fa45c569fd632ca9c25e9be1d9541a53430a2cd8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 15:43:38 -0800 Subject: [PATCH 276/304] feat: add cost tracking + caching for transcription calls --- litellm/caching.py | 86 ++++++++++++++++++++++--- litellm/llms/azure.py | 6 +- litellm/llms/openai.py | 6 +- litellm/proxy/proxy_server.py | 3 +- litellm/proxy/utils.py | 6 +- litellm/tests/test_completion_cost.py | 61 +++++++++++++++++- litellm/utils.py | 90 +++++++++++++++++++++------ tests/test_whisper.py | 4 +- 8 files changed, 225 insertions(+), 37 deletions(-) diff --git a/litellm/caching.py b/litellm/caching.py index bf11f4c39..623b483e8 100644 --- a/litellm/caching.py +++ b/litellm/caching.py @@ -10,7 +10,7 @@ import litellm import time, logging, asyncio import json, traceback, ast, hashlib -from typing import Optional, Literal, List, Union, Any +from typing import Optional, Literal, List, Union, Any, BinaryIO from openai._models import BaseModel as OpenAIObject from litellm._logging import verbose_logger @@ -764,8 +764,24 @@ class Cache: password: Optional[str] = None, similarity_threshold: Optional[float] = None, supported_call_types: Optional[ - List[Literal["completion", "acompletion", "embedding", "aembedding"]] - ] = ["completion", "acompletion", "embedding", "aembedding"], + List[ + Literal[ + "completion", + "acompletion", + "embedding", + "aembedding", + "atranscription", + "transcription", + ] + ] + ] = [ + "completion", + "acompletion", + "embedding", + "aembedding", + "atranscription", + "transcription", + ], # s3 Bucket, boto3 configuration s3_bucket_name: Optional[str] = None, s3_region_name: Optional[str] = None, @@ -880,9 +896,18 @@ class Cache: "input", "encoding_format", ] # embedding kwargs = model, input, user, encoding_format. Model, user are checked in completion_kwargs - + transcription_only_kwargs = [ + "model", + "file", + "language", + "prompt", + "response_format", + "temperature", + ] # combined_kwargs - NEEDS to be ordered across get_cache_key(). Do not use a set() - combined_kwargs = completion_kwargs + embedding_only_kwargs + combined_kwargs = ( + completion_kwargs + embedding_only_kwargs + transcription_only_kwargs + ) for param in combined_kwargs: # ignore litellm params here if param in kwargs: @@ -914,6 +939,17 @@ class Cache: param_value = ( caching_group or model_group or kwargs[param] ) # use caching_group, if set then model_group if it exists, else use kwargs["model"] + elif param == "file": + metadata_file_name = kwargs.get("metadata", {}).get( + "file_name", None + ) + litellm_params_file_name = kwargs.get("litellm_params", {}).get( + "file_name", None + ) + if metadata_file_name is not None: + param_value = metadata_file_name + elif litellm_params_file_name is not None: + param_value = litellm_params_file_name else: if kwargs[param] is None: continue # ignore None params @@ -1143,8 +1179,24 @@ def enable_cache( port: Optional[str] = None, password: Optional[str] = None, supported_call_types: Optional[ - List[Literal["completion", "acompletion", "embedding", "aembedding"]] - ] = ["completion", "acompletion", "embedding", "aembedding"], + List[ + Literal[ + "completion", + "acompletion", + "embedding", + "aembedding", + "atranscription", + "transcription", + ] + ] + ] = [ + "completion", + "acompletion", + "embedding", + "aembedding", + "atranscription", + "transcription", + ], **kwargs, ): """ @@ -1192,8 +1244,24 @@ def update_cache( port: Optional[str] = None, password: Optional[str] = None, supported_call_types: Optional[ - List[Literal["completion", "acompletion", "embedding", "aembedding"]] - ] = ["completion", "acompletion", "embedding", "aembedding"], + List[ + Literal[ + "completion", + "acompletion", + "embedding", + "aembedding", + "atranscription", + "transcription", + ] + ] + ] = [ + "completion", + "acompletion", + "embedding", + "aembedding", + "atranscription", + "transcription", + ], **kwargs, ): """ diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 5fc0939bb..0c8c7f184 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -861,7 +861,8 @@ class AzureChatCompletion(BaseLLM): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - final_response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + hidden_params = {"model": "whisper-1", "custom_llm_provider": "azure"} + final_response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore return final_response async def async_audio_transcriptions( @@ -921,7 +922,8 @@ class AzureChatCompletion(BaseLLM): }, original_response=stringified_response, ) - response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + hidden_params = {"model": "whisper-1", "custom_llm_provider": "azure"} + response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore return response except Exception as e: ## LOGGING diff --git a/litellm/llms/openai.py b/litellm/llms/openai.py index 9850cd61e..3f4b59d45 100644 --- a/litellm/llms/openai.py +++ b/litellm/llms/openai.py @@ -824,7 +824,8 @@ class OpenAIChatCompletion(BaseLLM): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - final_response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + hidden_params = {"model": "whisper-1", "custom_llm_provider": "openai"} + final_response = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore return final_response async def async_audio_transcriptions( @@ -862,7 +863,8 @@ class OpenAIChatCompletion(BaseLLM): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, response_type="audio_transcription") # type: ignore + hidden_params = {"model": "whisper-1", "custom_llm_provider": "openai"} + return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore except Exception as e: ## LOGGING logging_obj.post_call( diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 8b1db959c..720de8745 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3282,6 +3282,7 @@ async def audio_transcriptions( user_api_key_dict, "team_id", None ) data["metadata"]["endpoint"] = str(request.url) + data["metadata"]["file_name"] = file.filename ### TEAM-SPECIFIC PARAMS ### if user_api_key_dict.team_id is not None: @@ -3316,7 +3317,7 @@ async def audio_transcriptions( data = await proxy_logging_obj.pre_call_hook( user_api_key_dict=user_api_key_dict, data=data, - call_type="moderation", + call_type="audio_transcription", ) ## ROUTE TO CORRECT ENDPOINT ## diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 89976ff0d..270b53647 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -96,7 +96,11 @@ class ProxyLogging: user_api_key_dict: UserAPIKeyAuth, data: dict, call_type: Literal[ - "completion", "embeddings", "image_generation", "moderation" + "completion", + "embeddings", + "image_generation", + "moderation", + "audio_transcription", ], ): """ diff --git a/litellm/tests/test_completion_cost.py b/litellm/tests/test_completion_cost.py index 947da7166..16ec0602d 100644 --- a/litellm/tests/test_completion_cost.py +++ b/litellm/tests/test_completion_cost.py @@ -6,7 +6,12 @@ sys.path.insert( ) # Adds the parent directory to the system path import time import litellm -from litellm import get_max_tokens, model_cost, open_ai_chat_completion_models +from litellm import ( + get_max_tokens, + model_cost, + open_ai_chat_completion_models, + TranscriptionResponse, +) import pytest @@ -238,3 +243,57 @@ def test_cost_bedrock_pricing_actual_calls(): messages=[{"role": "user", "content": "Hey, how's it going?"}], ) assert cost > 0 + + +def test_whisper_openai(): + litellm.set_verbose = True + transcription = TranscriptionResponse( + text="Four score and seven years ago, our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure." + ) + transcription._hidden_params = { + "model": "whisper-1", + "custom_llm_provider": "openai", + "optional_params": {}, + "model_id": None, + } + _total_time_in_seconds = 3 + + transcription._response_ms = _total_time_in_seconds * 1000 + cost = litellm.completion_cost(model="whisper-1", completion_response=transcription) + + print(f"cost: {cost}") + print(f"whisper dict: {litellm.model_cost['whisper-1']}") + expected_cost = round( + litellm.model_cost["whisper-1"]["output_cost_per_second"] + * _total_time_in_seconds, + 5, + ) + assert cost == expected_cost + + +def test_whisper_azure(): + litellm.set_verbose = True + transcription = TranscriptionResponse( + text="Four score and seven years ago, our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure." + ) + transcription._hidden_params = { + "model": "whisper-1", + "custom_llm_provider": "azure", + "optional_params": {}, + "model_id": None, + } + _total_time_in_seconds = 3 + + transcription._response_ms = _total_time_in_seconds * 1000 + cost = litellm.completion_cost( + model="azure/azure-whisper", completion_response=transcription + ) + + print(f"cost: {cost}") + print(f"whisper dict: {litellm.model_cost['whisper-1']}") + expected_cost = round( + litellm.model_cost["whisper-1"]["output_cost_per_second"] + * _total_time_in_seconds, + 5, + ) + assert cost == expected_cost diff --git a/litellm/utils.py b/litellm/utils.py index 7466bd5c6..9568bf3f9 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1168,6 +1168,7 @@ class Logging: isinstance(result, ModelResponse) or isinstance(result, EmbeddingResponse) or isinstance(result, ImageResponse) + or isinstance(result, TranscriptionResponse) ) and self.stream != True ): # handle streaming separately @@ -1203,9 +1204,6 @@ class Logging: model=base_model, ) ) - verbose_logger.debug( - f"Model={self.model}; cost={self.model_call_details['response_cost']}" - ) except litellm.NotFoundError as e: verbose_logger.debug( f"Model={self.model} not found in completion cost map." @@ -1236,7 +1234,7 @@ class Logging: def success_handler( self, result=None, start_time=None, end_time=None, cache_hit=None, **kwargs ): - verbose_logger.debug(f"Logging Details LiteLLM-Success Call: {cache_hit}") + print_verbose(f"Logging Details LiteLLM-Success Call: {cache_hit}") start_time, end_time, result = self._success_handler_helper_fn( start_time=start_time, end_time=end_time, @@ -1681,6 +1679,7 @@ class Logging: """ Implementing async callbacks, to handle asyncio event loop issues when custom integrations need to use async functions. """ + print_verbose(f"Logging Details LiteLLM-Async Success Call: {cache_hit}") start_time, end_time, result = self._success_handler_helper_fn( start_time=start_time, end_time=end_time, result=result, cache_hit=cache_hit ) @@ -2473,6 +2472,7 @@ def client(original_function): and kwargs.get("aembedding", False) != True and kwargs.get("acompletion", False) != True and kwargs.get("aimg_generation", False) != True + and kwargs.get("atranscription", False) != True ): # allow users to control returning cached responses from the completion function # checking cache print_verbose(f"INSIDE CHECKING CACHE") @@ -2875,6 +2875,19 @@ def client(original_function): model_response_object=EmbeddingResponse(), response_type="embedding", ) + elif call_type == CallTypes.atranscription.value and isinstance( + cached_result, dict + ): + hidden_params = { + "model": "whisper-1", + "custom_llm_provider": custom_llm_provider, + } + cached_result = convert_to_model_response_object( + response_object=cached_result, + model_response_object=TranscriptionResponse(), + response_type="audio_transcription", + hidden_params=hidden_params, + ) if kwargs.get("stream", False) == False: # LOG SUCCESS asyncio.create_task( @@ -3001,6 +3014,20 @@ def client(original_function): else: return result + # ADD HIDDEN PARAMS - additional call metadata + if hasattr(result, "_hidden_params"): + result._hidden_params["model_id"] = kwargs.get("model_info", {}).get( + "id", None + ) + if ( + isinstance(result, ModelResponse) + or isinstance(result, EmbeddingResponse) + or isinstance(result, TranscriptionResponse) + ): + result._response_ms = ( + end_time - start_time + ).total_seconds() * 1000 # return response latency in ms like openai + ### POST-CALL RULES ### post_call_processing(original_response=result, model=model) @@ -3013,8 +3040,10 @@ def client(original_function): ) and (kwargs.get("cache", {}).get("no-store", False) != True) ): - if isinstance(result, litellm.ModelResponse) or isinstance( - result, litellm.EmbeddingResponse + if ( + isinstance(result, litellm.ModelResponse) + or isinstance(result, litellm.EmbeddingResponse) + or isinstance(result, TranscriptionResponse) ): if ( isinstance(result, EmbeddingResponse) @@ -3058,18 +3087,7 @@ def client(original_function): args=(result, start_time, end_time), ).start() - # RETURN RESULT - if hasattr(result, "_hidden_params"): - result._hidden_params["model_id"] = kwargs.get("model_info", {}).get( - "id", None - ) - if isinstance(result, ModelResponse) or isinstance( - result, EmbeddingResponse - ): - result._response_ms = ( - end_time - start_time - ).total_seconds() * 1000 # return response latency in ms like openai - + # REBUILD EMBEDDING CACHING if ( isinstance(result, EmbeddingResponse) and final_embedding_cached_response is not None @@ -3575,6 +3593,20 @@ def cost_per_token( completion_tokens_cost_usd_dollar = ( model_cost_ref[model]["output_cost_per_token"] * completion_tokens ) + elif ( + model_cost_ref[model].get("output_cost_per_second", None) is not None + and response_time_ms is not None + ): + print_verbose( + f"For model={model} - output_cost_per_second: {model_cost_ref[model].get('output_cost_per_second')}; response time: {response_time_ms}" + ) + ## COST PER SECOND ## + prompt_tokens_cost_usd_dollar = 0 + completion_tokens_cost_usd_dollar = ( + model_cost_ref[model]["output_cost_per_second"] + * response_time_ms + / 1000 + ) elif ( model_cost_ref[model].get("input_cost_per_second", None) is not None and response_time_ms is not None @@ -3659,6 +3691,8 @@ def completion_cost( "text_completion", "image_generation", "aimage_generation", + "transcription", + "atranscription", ] = "completion", ### REGION ### custom_llm_provider=None, @@ -3703,6 +3737,7 @@ def completion_cost( and custom_llm_provider == "azure" ): model = "dall-e-2" # for dall-e-2, azure expects an empty model name + # Handle Inputs to completion_cost prompt_tokens = 0 completion_tokens = 0 @@ -3717,10 +3752,11 @@ def completion_cost( verbose_logger.debug( f"completion_response response ms: {completion_response.get('_response_ms')} " ) - model = ( - model or completion_response["model"] + model = model or completion_response.get( + "model", None ) # check if user passed an override for model, if it's none check completion_response['model'] if hasattr(completion_response, "_hidden_params"): + model = completion_response._hidden_params.get("model", model) custom_llm_provider = completion_response._hidden_params.get( "custom_llm_provider", "" ) @@ -3801,6 +3837,7 @@ def completion_cost( # see https://replicate.com/pricing elif model in litellm.replicate_models or "replicate" in model: return get_replicate_completion_pricing(completion_response, total_time) + ( prompt_tokens_cost_usd_dollar, completion_tokens_cost_usd_dollar, @@ -6314,6 +6351,7 @@ def convert_to_model_response_object( stream=False, start_time=None, end_time=None, + hidden_params: Optional[dict] = None, ): try: if response_type == "completion" and ( @@ -6373,6 +6411,9 @@ def convert_to_model_response_object( end_time - start_time ).total_seconds() * 1000 + if hidden_params is not None: + model_response_object._hidden_params = hidden_params + return model_response_object elif response_type == "embedding" and ( model_response_object is None @@ -6402,6 +6443,9 @@ def convert_to_model_response_object( end_time - start_time ).total_seconds() * 1000 # return response latency in ms like openai + if hidden_params is not None: + model_response_object._hidden_params = hidden_params + return model_response_object elif response_type == "image_generation" and ( model_response_object is None @@ -6419,6 +6463,9 @@ def convert_to_model_response_object( if "data" in response_object: model_response_object.data = response_object["data"] + if hidden_params is not None: + model_response_object._hidden_params = hidden_params + return model_response_object elif response_type == "audio_transcription" and ( model_response_object is None @@ -6432,6 +6479,9 @@ def convert_to_model_response_object( if "text" in response_object: model_response_object.text = response_object["text"] + + if hidden_params is not None: + model_response_object._hidden_params = hidden_params return model_response_object except Exception as e: raise Exception(f"Invalid response object {traceback.format_exc()}") diff --git a/tests/test_whisper.py b/tests/test_whisper.py index 54ecfbf50..1debbbc1d 100644 --- a/tests/test_whisper.py +++ b/tests/test_whisper.py @@ -31,7 +31,8 @@ def test_transcription(): model="whisper-1", file=audio_file, ) - print(f"transcript: {transcript}") + print(f"transcript: {transcript.model_dump()}") + print(f"transcript: {transcript._hidden_params}") # test_transcription() @@ -47,6 +48,7 @@ def test_transcription_azure(): api_version="2024-02-15-preview", ) + print(f"transcript: {transcript}") assert transcript.text is not None assert isinstance(transcript.text, str) From d58546f02fd4a28ea865a7fc8a965d9518f28c9a Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Sat, 9 Mar 2024 16:03:39 -0800 Subject: [PATCH 277/304] Updated config.yml --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index daa4d59ec..b3703df70 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,6 +45,7 @@ jobs: pip install "asyncio==3.4.3" pip install "apscheduler==3.10.4" pip install "PyGithub==1.59.1" + pip install argon2-cffi - save_cache: paths: - ./venv From 9b7c8880c09edde866372c5e0910bdba2c0afef7 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 16:09:12 -0800 Subject: [PATCH 278/304] fix(caching.py): only add unique kwargs for transcription_only_kwargs in caching --- litellm/caching.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/litellm/caching.py b/litellm/caching.py index 623b483e8..d1add41fc 100644 --- a/litellm/caching.py +++ b/litellm/caching.py @@ -897,12 +897,8 @@ class Cache: "encoding_format", ] # embedding kwargs = model, input, user, encoding_format. Model, user are checked in completion_kwargs transcription_only_kwargs = [ - "model", "file", "language", - "prompt", - "response_format", - "temperature", ] # combined_kwargs - NEEDS to be ordered across get_cache_key(). Do not use a set() combined_kwargs = ( From 4b717810ec9643c83c73739da7eb9bb01c92af52 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 16:10:04 -0800 Subject: [PATCH 279/304] (feat) endpoint router --- .../memory_usage/router_endpoint.py | 70 ++++++++++++++ .../memory_usage/router_memory_usage copy.py | 92 +++++++++++++++++++ .../memory_usage/router_memory_usage.py | 92 +++++++++++++++++++ .../memory_usage/send_request.py | 28 ++++++ 4 files changed, 282 insertions(+) create mode 100644 cookbook/litellm_router_load_test/memory_usage/router_endpoint.py create mode 100644 cookbook/litellm_router_load_test/memory_usage/router_memory_usage copy.py create mode 100644 cookbook/litellm_router_load_test/memory_usage/router_memory_usage.py create mode 100644 cookbook/litellm_router_load_test/memory_usage/send_request.py diff --git a/cookbook/litellm_router_load_test/memory_usage/router_endpoint.py b/cookbook/litellm_router_load_test/memory_usage/router_endpoint.py new file mode 100644 index 000000000..78704e3a7 --- /dev/null +++ b/cookbook/litellm_router_load_test/memory_usage/router_endpoint.py @@ -0,0 +1,70 @@ +from fastapi import FastAPI +import uvicorn +from memory_profiler import profile, memory_usage +import os +import traceback +import asyncio +import pytest +import litellm +from litellm import Router +from concurrent.futures import ThreadPoolExecutor +from collections import defaultdict +from dotenv import load_dotenv +import uuid + +load_dotenv() + +model_list = [ + { + "model_name": "gpt-3.5-turbo", + "litellm_params": { + "model": "azure/chatgpt-v-2", + "api_key": os.getenv("AZURE_API_KEY"), + "api_version": os.getenv("AZURE_API_VERSION"), + "api_base": os.getenv("AZURE_API_BASE"), + }, + "tpm": 240000, + "rpm": 1800, + }, + { + "model_name": "text-embedding-ada-002", + "litellm_params": { + "model": "azure/azure-embedding-model", + "api_key": os.getenv("AZURE_API_KEY"), + "api_base": os.getenv("AZURE_API_BASE"), + }, + "tpm": 100000, + "rpm": 10000, + }, +] + +litellm.set_verbose = True +litellm.cache = litellm.Cache( + type="s3", s3_bucket_name="litellm-my-test-bucket-2", s3_region_name="us-east-1" +) +router = Router(model_list=model_list, set_verbose=True) + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"message": "Welcome to the FastAPI endpoint!"} + + +@profile +@app.post("/router_acompletion") +async def router_acompletion(): + question = f"This is a test: {uuid.uuid4()}" * 100 + resp = await router.aembedding(model="text-embedding-ada-002", input=question) + print("embedding-resp", resp) + + response = await router.acompletion( + model="gpt-3.5-turbo", messages=[{"role": "user", "content": question}] + ) + print("completion-resp", response) + return response + + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/cookbook/litellm_router_load_test/memory_usage/router_memory_usage copy.py b/cookbook/litellm_router_load_test/memory_usage/router_memory_usage copy.py new file mode 100644 index 000000000..f6d549e72 --- /dev/null +++ b/cookbook/litellm_router_load_test/memory_usage/router_memory_usage copy.py @@ -0,0 +1,92 @@ +#### What this tests #### + +from memory_profiler import profile, memory_usage +import sys, os, time +import traceback, asyncio +import pytest + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +import litellm +from litellm import Router +from concurrent.futures import ThreadPoolExecutor +from collections import defaultdict +from dotenv import load_dotenv +import uuid + +load_dotenv() + + +model_list = [ + { + "model_name": "gpt-3.5-turbo", # openai model name + "litellm_params": { # params for litellm completion/embedding call + "model": "azure/chatgpt-v-2", + "api_key": os.getenv("AZURE_API_KEY"), + "api_version": os.getenv("AZURE_API_VERSION"), + "api_base": os.getenv("AZURE_API_BASE"), + }, + "tpm": 240000, + "rpm": 1800, + }, + { + "model_name": "text-embedding-ada-002", + "litellm_params": { + "model": "azure/azure-embedding-model", + "api_key": os.environ["AZURE_API_KEY"], + "api_base": os.environ["AZURE_API_BASE"], + }, + "tpm": 100000, + "rpm": 10000, + }, +] +litellm.set_verbose = True +litellm.cache = litellm.Cache( + type="s3", s3_bucket_name="litellm-my-test-bucket-2", s3_region_name="us-east-1" +) +router = Router( + model_list=model_list, + set_verbose=True, +) # type: ignore + + +@profile +async def router_acompletion(): + # embedding call + question = f"This is a test: {uuid.uuid4()}" * 100 + resp = await router.aembedding(model="text-embedding-ada-002", input=question) + print("embedding-resp", resp) + + response = await router.acompletion( + model="gpt-3.5-turbo", messages=[{"role": "user", "content": question}] + ) + print("completion-resp", response) + return response + + +async def main(): + for i in range(1): + start = time.time() + n = 50 # Number of concurrent tasks + tasks = [router_acompletion() for _ in range(n)] + + chat_completions = await asyncio.gather(*tasks) + + successful_completions = [c for c in chat_completions if c is not None] + + # Write errors to error_log.txt + with open("error_log.txt", "a") as error_log: + for completion in chat_completions: + if isinstance(completion, str): + error_log.write(completion + "\n") + + print(n, time.time() - start, len(successful_completions)) + time.sleep(10) + + +if __name__ == "__main__": + # Blank out contents of error_log.txt + open("error_log.txt", "w").close() + + asyncio.run(main()) diff --git a/cookbook/litellm_router_load_test/memory_usage/router_memory_usage.py b/cookbook/litellm_router_load_test/memory_usage/router_memory_usage.py new file mode 100644 index 000000000..f6d549e72 --- /dev/null +++ b/cookbook/litellm_router_load_test/memory_usage/router_memory_usage.py @@ -0,0 +1,92 @@ +#### What this tests #### + +from memory_profiler import profile, memory_usage +import sys, os, time +import traceback, asyncio +import pytest + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +import litellm +from litellm import Router +from concurrent.futures import ThreadPoolExecutor +from collections import defaultdict +from dotenv import load_dotenv +import uuid + +load_dotenv() + + +model_list = [ + { + "model_name": "gpt-3.5-turbo", # openai model name + "litellm_params": { # params for litellm completion/embedding call + "model": "azure/chatgpt-v-2", + "api_key": os.getenv("AZURE_API_KEY"), + "api_version": os.getenv("AZURE_API_VERSION"), + "api_base": os.getenv("AZURE_API_BASE"), + }, + "tpm": 240000, + "rpm": 1800, + }, + { + "model_name": "text-embedding-ada-002", + "litellm_params": { + "model": "azure/azure-embedding-model", + "api_key": os.environ["AZURE_API_KEY"], + "api_base": os.environ["AZURE_API_BASE"], + }, + "tpm": 100000, + "rpm": 10000, + }, +] +litellm.set_verbose = True +litellm.cache = litellm.Cache( + type="s3", s3_bucket_name="litellm-my-test-bucket-2", s3_region_name="us-east-1" +) +router = Router( + model_list=model_list, + set_verbose=True, +) # type: ignore + + +@profile +async def router_acompletion(): + # embedding call + question = f"This is a test: {uuid.uuid4()}" * 100 + resp = await router.aembedding(model="text-embedding-ada-002", input=question) + print("embedding-resp", resp) + + response = await router.acompletion( + model="gpt-3.5-turbo", messages=[{"role": "user", "content": question}] + ) + print("completion-resp", response) + return response + + +async def main(): + for i in range(1): + start = time.time() + n = 50 # Number of concurrent tasks + tasks = [router_acompletion() for _ in range(n)] + + chat_completions = await asyncio.gather(*tasks) + + successful_completions = [c for c in chat_completions if c is not None] + + # Write errors to error_log.txt + with open("error_log.txt", "a") as error_log: + for completion in chat_completions: + if isinstance(completion, str): + error_log.write(completion + "\n") + + print(n, time.time() - start, len(successful_completions)) + time.sleep(10) + + +if __name__ == "__main__": + # Blank out contents of error_log.txt + open("error_log.txt", "w").close() + + asyncio.run(main()) diff --git a/cookbook/litellm_router_load_test/memory_usage/send_request.py b/cookbook/litellm_router_load_test/memory_usage/send_request.py new file mode 100644 index 000000000..6a3473e23 --- /dev/null +++ b/cookbook/litellm_router_load_test/memory_usage/send_request.py @@ -0,0 +1,28 @@ +import requests +from concurrent.futures import ThreadPoolExecutor + +# Replace the URL with your actual endpoint +url = "http://localhost:8000/router_acompletion" + + +def make_request(session): + headers = {"Content-Type": "application/json"} + data = {} # Replace with your JSON payload if needed + + response = session.post(url, headers=headers, json=data) + print(f"Status code: {response.status_code}") + + +# Number of concurrent requests +num_requests = 20 + +# Create a session to reuse the underlying TCP connection +with requests.Session() as session: + # Use ThreadPoolExecutor for concurrent requests + with ThreadPoolExecutor(max_workers=num_requests) as executor: + # Use list comprehension to submit tasks + futures = [executor.submit(make_request, session) for _ in range(num_requests)] + + # Wait for all futures to complete + for future in futures: + future.result() From 03f0c968f97f947966eda7da243b0d47d8a57118 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 16:16:00 -0800 Subject: [PATCH 280/304] fix(proxy_server.py): fix argon exceptions --- litellm/proxy/proxy_server.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 51fefef50..079b52944 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -317,18 +317,6 @@ async def user_api_key_auth( else: return UserAPIKeyAuth() - ### CHECK IF ADMIN ### - # note: never string compare api keys, this is vulenerable to a time attack. Use secrets.compare_digest instead - - is_master_key_valid = ph.verify(litellm_master_key_hash, api_key) - - if is_master_key_valid: - return UserAPIKeyAuth( - api_key=master_key, - user_role="proxy_admin", - user_id=litellm_proxy_admin_name, - ) - route: str = request.url.path if route == "/user/auth": if general_settings.get("allow_user_auth", False) == True: @@ -362,6 +350,20 @@ async def user_api_key_auth( f"Malformed API Key passed in. Ensure Key has `Bearer ` prefix. Passed in: {passed_in_key}" ) + ### CHECK IF ADMIN ### + # note: never string compare api keys, this is vulenerable to a time attack. Use secrets.compare_digest instead + try: + is_master_key_valid = ph.verify(litellm_master_key_hash, api_key) + except Exception as e: + is_master_key_valid = False + + if is_master_key_valid: + return UserAPIKeyAuth( + api_key=master_key, + user_role="proxy_admin", + user_id=litellm_proxy_admin_name, + ) + if isinstance( api_key, str ): # if generated token, make sure it starts with sk-. From c333216f6ec6f75101f817373bdb0c553487d96c Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 16:20:14 -0800 Subject: [PATCH 281/304] test(test_custom_logger.py): make test more verbose --- litellm/tests/test_custom_logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_custom_logger.py b/litellm/tests/test_custom_logger.py index fe1307689..0a8f7b941 100644 --- a/litellm/tests/test_custom_logger.py +++ b/litellm/tests/test_custom_logger.py @@ -100,7 +100,7 @@ class TmpFunction: def test_async_chat_openai_stream(): try: tmp_function = TmpFunction() - # litellm.set_verbose = True + litellm.set_verbose = True litellm.success_callback = [tmp_function.async_test_logging_fn] complete_streaming_response = "" From 1917ee7fcfd507a8c0e58df7d28255984a7aa48a Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 16:24:04 -0800 Subject: [PATCH 282/304] (feat) debug when in meory cache is used --- litellm/caching.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/caching.py b/litellm/caching.py index bf11f4c39..2b043f88b 100644 --- a/litellm/caching.py +++ b/litellm/caching.py @@ -48,6 +48,7 @@ class InMemoryCache(BaseCache): self.ttl_dict = {} def set_cache(self, key, value, **kwargs): + print_verbose("InMemoryCache: set_cache") self.cache_dict[key] = value if "ttl" in kwargs: self.ttl_dict[key] = time.time() + kwargs["ttl"] From 7a29fe9525b3032a1c48a31f613ab524e58b85db Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 16:51:11 -0800 Subject: [PATCH 283/304] fix(proxy_server.py): check if master key is str before hashing --- litellm/proxy/proxy_server.py | 4 +++- litellm/tests/test_proxy_custom_auth.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 079b52944..5a1b3c6e7 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1766,7 +1766,9 @@ class ProxyConfig: ) if master_key and master_key.startswith("os.environ/"): master_key = litellm.get_secret(master_key) - litellm_master_key_hash = ph.hash(master_key) + + if master_key is not None and isinstance(master_key, str): + litellm_master_key_hash = ph.hash(master_key) ### CUSTOM API KEY AUTH ### ## pass filepath custom_auth = general_settings.get("custom_auth", None) diff --git a/litellm/tests/test_proxy_custom_auth.py b/litellm/tests/test_proxy_custom_auth.py index 55ab45624..d4c39e3d5 100644 --- a/litellm/tests/test_proxy_custom_auth.py +++ b/litellm/tests/test_proxy_custom_auth.py @@ -55,7 +55,7 @@ def test_custom_auth(client): } # Your bearer token token = os.getenv("PROXY_MASTER_KEY") - + print(f"token: {token}") headers = {"Authorization": f"Bearer {token}"} response = client.post("/chat/completions", json=test_data, headers=headers) pytest.fail("LiteLLM Proxy test failed. This request should have been rejected") From 045a8cfdcbbb596ef05d6835ae6b30b602b37cd0 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 16:52:59 -0800 Subject: [PATCH 284/304] (fix) use python 3.8 on ci/cd --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ff6e6e1b2..6375f9ad0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2.1 jobs: local_testing: docker: - - image: circleci/python:3.9 + - image: circleci/python:3.8.18 working_directory: ~/project steps: From 38f9413dfc614537de065be338901379b2fad214 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 16:55:05 -0800 Subject: [PATCH 285/304] (fix) python 3.8 bug --- litellm/llms/prompt_templates/factory.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litellm/llms/prompt_templates/factory.py b/litellm/llms/prompt_templates/factory.py index a13130c62..dc4207a05 100644 --- a/litellm/llms/prompt_templates/factory.py +++ b/litellm/llms/prompt_templates/factory.py @@ -4,6 +4,7 @@ import json, re, xml.etree.ElementTree as ET from jinja2 import Template, exceptions, Environment, meta from typing import Optional, Any import imghdr, base64 +from typing import List def default_pt(messages): @@ -633,7 +634,7 @@ def anthropic_messages_pt(messages: list): return new_messages -def extract_between_tags(tag: str, string: str, strip: bool = False) -> list[str]: +def extract_between_tags(tag: str, string: str, strip: bool = False) -> List[str]: ext_list = re.findall(f"<{tag}>(.+?)", string, re.DOTALL) if strip: ext_list = [e.strip() for e in ext_list] From bd340562b8abfd856623716c574d6dcdf47f9ab6 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 16:56:46 -0800 Subject: [PATCH 286/304] (fix) use python 3.8 for testing --- .circleci/config.yml | 2 +- litellm/tests/test_completion.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6375f9ad0..3e1fd7f34 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2.1 jobs: local_testing: docker: - - image: circleci/python:3.8.18 + - image: circleci/python:3.8 working_directory: ~/project steps: diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index e54617bd9..729bf7bd9 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -69,7 +69,7 @@ def test_completion_claude(): response = completion( model="claude-instant-1", messages=messages, request_timeout=10 ) - # Add any assertions, here to check response args + # Add any assertions here to check response args print(response) print(response.usage) print(response.usage.completion_tokens) From abe0ec601c21303964f1c9cc8fdd61cf5298c346 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:11:11 -0800 Subject: [PATCH 287/304] (test) installing litellm --- .circleci/config.yml | 73 +++------------------------------ litellm/tests/test_python_38.py | 16 ++++++++ 2 files changed, 22 insertions(+), 67 deletions(-) create mode 100644 litellm/tests/test_python_38.py diff --git a/.circleci/config.yml b/.circleci/config.yml index 3e1fd7f34..8834eea26 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,7 @@ version: 2.1 jobs: - local_testing: + installing_litellm_on_python: + local_testing: docker: - image: circleci/python:3.8 working_directory: ~/project @@ -8,87 +9,25 @@ jobs: steps: - checkout - - run: - name: Check if litellm dir was updated or if pyproject.toml was modified - command: | - if [ -n "$(git diff --name-only $CIRCLE_SHA1^..$CIRCLE_SHA1 | grep -E 'pyproject\.toml|litellm/')" ]; then - echo "litellm updated" - else - echo "No changes to litellm or pyproject.toml. Skipping tests." - circleci step halt - fi - - restore_cache: - keys: - - v1-dependencies-{{ checksum ".circleci/requirements.txt" }} - - run: + - run: name: Install Dependencies command: | python -m pip install --upgrade pip python -m pip install -r .circleci/requirements.txt - pip install "pytest==7.3.1" - pip install "pytest-asyncio==0.21.1" - pip install mypy - pip install "google-generativeai>=0.3.2" - pip install "google-cloud-aiplatform>=1.38.0" - pip install "boto3>=1.28.57" - pip install "aioboto3>=12.3.0" - pip install langchain - pip install "langfuse>=2.0.0" - pip install numpydoc - pip install traceloop-sdk==0.0.69 pip install openai pip install prisma pip install "httpx==0.24.1" - pip install "gunicorn==21.2.0" - pip install "anyio==3.7.1" - pip install "aiodynamo==23.10.1" - pip install "asyncio==3.4.3" - pip install "apscheduler==3.10.4" - pip install "PyGithub==1.59.1" - pip install python-multipart - - save_cache: - paths: - - ./venv - key: v1-dependencies-{{ checksum ".circleci/requirements.txt" }} - - run: - name: Run prisma ./entrypoint.sh - command: | - set +e - chmod +x entrypoint.sh - ./entrypoint.sh - set -e - - run: - name: Black Formatting - command: | - cd litellm - python -m pip install black - python -m black . - cd .. - - run: - name: Linting Testing - command: | - cd litellm - python -m pip install types-requests types-setuptools types-redis - if ! python -m mypy . --ignore-missing-imports; then - echo "mypy detected errors" - exit 1 - fi - cd .. - - # Run pytest and generate JUnit XML report + - run: + name: Check if litellm dir was updated or if pyproject.toml was modified - run: name: Run tests command: | pwd ls - python -m pytest -vv litellm/tests/ -x --junitxml=test-results/junit.xml --durations=5 + python -m pytest -vv litellm/tests/test_python_38.py no_output_timeout: 120m - # Store test results - - store_test_results: - path: test-results - build_and_test: machine: image: ubuntu-2204:2023.10.1 diff --git a/litellm/tests/test_python_38.py b/litellm/tests/test_python_38.py new file mode 100644 index 000000000..0712dcaf3 --- /dev/null +++ b/litellm/tests/test_python_38.py @@ -0,0 +1,16 @@ +import sys, os, time +import traceback, asyncio +import pytest + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path + + +def test_using_litellm(): + try: + import litellm + except Exception as e: + pytest.fail( + f"Error occurred: {e}. Installing litellm on python3.8 failed please retry" + ) From ada6cdab3d0df461bd2675c5487ab587341208e8 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:18:18 -0800 Subject: [PATCH 288/304] (fix) testing import litellm on python 3.8 --- .circleci/config.yml | 13 ++++++++----- litellm/tests/test_python_38.py | 2 ++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8834eea26..4b0ae434f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,11 +13,14 @@ jobs: name: Install Dependencies command: | python -m pip install --upgrade pip - python -m pip install -r .circleci/requirements.txt - pip install openai - pip install prisma - pip install "httpx==0.24.1" - + pip install python-dotenv + pip install pytest + pip install tiktoken + pip install aiohttp + pip install click + pip install jinja2 + pip install tokenizers + pip install openai - run: name: Check if litellm dir was updated or if pyproject.toml was modified - run: diff --git a/litellm/tests/test_python_38.py b/litellm/tests/test_python_38.py index 0712dcaf3..077e65a3a 100644 --- a/litellm/tests/test_python_38.py +++ b/litellm/tests/test_python_38.py @@ -10,6 +10,8 @@ sys.path.insert( def test_using_litellm(): try: import litellm + + print("litellm imported successfully") except Exception as e: pytest.fail( f"Error occurred: {e}. Installing litellm on python3.8 failed please retry" From 8d2d51b625cd71f9d44c8ea50ee89ca3a1292176 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 18:22:26 -0800 Subject: [PATCH 289/304] fix(utils.py): fix model name checking --- litellm/llms/openai.py | 1 + litellm/tests/test_custom_callback_input.py | 1 + litellm/utils.py | 24 ++++++++++++++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/litellm/llms/openai.py b/litellm/llms/openai.py index 3f4b59d45..f65d96b11 100644 --- a/litellm/llms/openai.py +++ b/litellm/llms/openai.py @@ -753,6 +753,7 @@ class OpenAIChatCompletion(BaseLLM): # return response return convert_to_model_response_object(response_object=response, model_response_object=model_response, response_type="image_generation") # type: ignore except OpenAIError as e: + exception_mapping_worked = True ## LOGGING logging_obj.post_call( diff --git a/litellm/tests/test_custom_callback_input.py b/litellm/tests/test_custom_callback_input.py index 924933319..5c52867f9 100644 --- a/litellm/tests/test_custom_callback_input.py +++ b/litellm/tests/test_custom_callback_input.py @@ -973,6 +973,7 @@ def test_image_generation_openai(): print(f"customHandler_success.errors: {customHandler_success.errors}") print(f"customHandler_success.states: {customHandler_success.states}") + time.sleep(2) assert len(customHandler_success.errors) == 0 assert len(customHandler_success.states) == 3 # pre, post, success # test failure callback diff --git a/litellm/utils.py b/litellm/utils.py index 9568bf3f9..ffd82d53d 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1243,7 +1243,7 @@ class Logging: ) # print(f"original response in success handler: {self.model_call_details['original_response']}") try: - verbose_logger.debug(f"success callbacks: {litellm.success_callback}") + print_verbose(f"success callbacks: {litellm.success_callback}") ## BUILD COMPLETE STREAMED RESPONSE complete_streaming_response = None if self.stream and isinstance(result, ModelResponse): @@ -1266,7 +1266,7 @@ class Logging: self.sync_streaming_chunks.append(result) if complete_streaming_response is not None: - verbose_logger.debug( + print_verbose( f"Logging Details LiteLLM-Success Call streaming complete" ) self.model_call_details["complete_streaming_response"] = ( @@ -1613,6 +1613,14 @@ class Logging: "aembedding", False ) == False + and self.model_call_details.get("litellm_params", {}).get( + "aimage_generation", False + ) + == False + and self.model_call_details.get("litellm_params", {}).get( + "atranscription", False + ) + == False ): # custom logger class if self.stream and complete_streaming_response is None: callback.log_stream_event( @@ -1645,6 +1653,14 @@ class Logging: "aembedding", False ) == False + and self.model_call_details.get("litellm_params", {}).get( + "aimage_generation", False + ) + == False + and self.model_call_details.get("litellm_params", {}).get( + "atranscription", False + ) + == False ): # custom logger functions print_verbose( f"success callbacks: Running Custom Callback Function" @@ -3728,7 +3744,6 @@ def completion_cost( - If an error occurs during execution, the function returns 0.0 without blocking the user's execution path. """ try: - if ( (call_type == "aimage_generation" or call_type == "image_generation") and model is not None @@ -3737,7 +3752,6 @@ def completion_cost( and custom_llm_provider == "azure" ): model = "dall-e-2" # for dall-e-2, azure expects an empty model name - # Handle Inputs to completion_cost prompt_tokens = 0 completion_tokens = 0 @@ -3756,7 +3770,7 @@ def completion_cost( "model", None ) # check if user passed an override for model, if it's none check completion_response['model'] if hasattr(completion_response, "_hidden_params"): - model = completion_response._hidden_params.get("model", model) + model = model or completion_response._hidden_params.get("model", None) custom_llm_provider = completion_response._hidden_params.get( "custom_llm_provider", "" ) From ce19c2aeef7cc6921a6e5803f6117594347a1832 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:23:57 -0800 Subject: [PATCH 290/304] (fix) config.yml --- .circleci/config.yml | 6 ++---- litellm/tests/test_completion.py | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4b0ae434f..e44394280 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,15 +1,13 @@ version: 2.1 jobs: installing_litellm_on_python: - local_testing: docker: - image: circleci/python:3.8 working_directory: ~/project steps: - checkout - - - run: + - run: name: Install Dependencies command: | python -m pip install --upgrade pip @@ -20,7 +18,7 @@ jobs: pip install click pip install jinja2 pip install tokenizers - pip install openai + pip install openai - run: name: Check if litellm dir was updated or if pyproject.toml was modified - run: diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index 729bf7bd9..e54617bd9 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -69,7 +69,7 @@ def test_completion_claude(): response = completion( model="claude-instant-1", messages=messages, request_timeout=10 ) - # Add any assertions here to check response args + # Add any assertions, here to check response args print(response) print(response.usage) print(response.usage.completion_tokens) From 578d1ef3c6bf6079f5d1e055b23f20d7e0c45b36 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:29:44 -0800 Subject: [PATCH 291/304] (fix) ci/cd test --- .circleci/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index e44394280..502f3a1b8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -217,6 +217,12 @@ workflows: only: - main - /litellm_.*/ + - installing_litellm_on_python: + filters: + branches: + only: + - main + - /litellm_.*/ - publish_to_pypi: requires: - local_testing From d648cd6c0f9256aa6e9b451b9e76b4dab39c03c5 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:37:56 -0800 Subject: [PATCH 292/304] (fix) config.yml --- .circleci/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 502f3a1b8..df4fbca78 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,15 +19,12 @@ jobs: pip install jinja2 pip install tokenizers pip install openai - - run: - name: Check if litellm dir was updated or if pyproject.toml was modified - run: name: Run tests command: | pwd ls python -m pytest -vv litellm/tests/test_python_38.py - no_output_timeout: 120m build_and_test: machine: From 4f5222a90235c6d3a9fe58fc8c22b882f7e570e2 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:40:47 -0800 Subject: [PATCH 293/304] (fix) ci/cd --- .circleci/config.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index df4fbca78..2790b5539 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -202,12 +202,6 @@ workflows: version: 2 build_and_test: jobs: - - local_testing: - filters: - branches: - only: - - main - - /litellm_.*/ - build_and_test: filters: branches: @@ -222,7 +216,6 @@ workflows: - /litellm_.*/ - publish_to_pypi: requires: - - local_testing - build_and_test filters: branches: From 86fe7a9af175ad7d9e51b1cf26d714cec3f623b0 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 18:42:01 -0800 Subject: [PATCH 294/304] fix(anthropic.py): deep copy messages before popping system prompt --- litellm/llms/anthropic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index 5e0887901..becbcc328 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -1,7 +1,7 @@ import os, types import json from enum import Enum -import requests +import requests, copy import time, uuid from typing import Callable, Optional from litellm.utils import ModelResponse, Usage, map_finish_reason @@ -117,6 +117,7 @@ def completion( ): headers = validate_environment(api_key, headers) _is_function_call = False + messages = copy.deepcopy(messages) if model in custom_prompt_dict: # check if the model has a registered custom prompt model_prompt_details = custom_prompt_dict[model] From d3b29b63fe6102c545bd2c7db3ae2aaab0e77ba0 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:44:06 -0800 Subject: [PATCH 295/304] (fix) ci/cd local testing --- .circleci/config.yml | 95 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2790b5539..38b844256 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,94 @@ version: 2.1 jobs: + local_testing: + docker: + - image: circleci/python:3.9 + working_directory: ~/project + + steps: + - checkout + + - run: + name: Check if litellm dir was updated or if pyproject.toml was modified + command: | + if [ -n "$(git diff --name-only $CIRCLE_SHA1^..$CIRCLE_SHA1 | grep -E 'pyproject\.toml|litellm/')" ]; then + echo "litellm updated" + else + echo "No changes to litellm or pyproject.toml. Skipping tests." + circleci step halt + fi + - restore_cache: + keys: + - v1-dependencies-{{ checksum ".circleci/requirements.txt" }} + - run: + name: Install Dependencies + command: | + python -m pip install --upgrade pip + python -m pip install -r .circleci/requirements.txt + pip install "pytest==7.3.1" + pip install "pytest-asyncio==0.21.1" + pip install mypy + pip install "google-generativeai>=0.3.2" + pip install "google-cloud-aiplatform>=1.38.0" + pip install "boto3>=1.28.57" + pip install "aioboto3>=12.3.0" + pip install langchain + pip install "langfuse>=2.0.0" + pip install numpydoc + pip install traceloop-sdk==0.0.69 + pip install openai + pip install prisma + pip install "httpx==0.24.1" + pip install "gunicorn==21.2.0" + pip install "anyio==3.7.1" + pip install "aiodynamo==23.10.1" + pip install "asyncio==3.4.3" + pip install "apscheduler==3.10.4" + pip install "PyGithub==1.59.1" + pip install python-multipart + - save_cache: + paths: + - ./venv + key: v1-dependencies-{{ checksum ".circleci/requirements.txt" }} + - run: + name: Run prisma ./entrypoint.sh + command: | + set +e + chmod +x entrypoint.sh + ./entrypoint.sh + set -e + - run: + name: Black Formatting + command: | + cd litellm + python -m pip install black + python -m black . + cd .. + - run: + name: Linting Testing + command: | + cd litellm + python -m pip install types-requests types-setuptools types-redis + if ! python -m mypy . --ignore-missing-imports; then + echo "mypy detected errors" + exit 1 + fi + cd .. + + + # Run pytest and generate JUnit XML report + - run: + name: Run tests + command: | + pwd + ls + python -m pytest -vv litellm/tests/ -x --junitxml=test-results/junit.xml --durations=5 + no_output_timeout: 120m + + # Store test results + - store_test_results: + path: test-results + installing_litellm_on_python: docker: - image: circleci/python:3.8 @@ -202,6 +291,12 @@ workflows: version: 2 build_and_test: jobs: + - local_testing: + filters: + branches: + only: + - main + - /litellm_.*/ - build_and_test: filters: branches: From c51d25b063ba6dc242926c0b1007e575f730e4ba Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 18:45:27 -0800 Subject: [PATCH 296/304] (ci/cd) test --- .circleci/config.yml | 1 + litellm/tests/test_completion.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 38b844256..bbce7ce6d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -311,6 +311,7 @@ workflows: - /litellm_.*/ - publish_to_pypi: requires: + - local_testing - build_and_test filters: branches: diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index e54617bd9..729bf7bd9 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -69,7 +69,7 @@ def test_completion_claude(): response = completion( model="claude-instant-1", messages=messages, request_timeout=10 ) - # Add any assertions, here to check response args + # Add any assertions here to check response args print(response) print(response.usage) print(response.usage.completion_tokens) From 61d16cb67202efe88fdbdd410ecce66a60f3cae3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 18:47:20 -0800 Subject: [PATCH 297/304] fix(test_proxy_server.py): fix test --- litellm/tests/test_proxy_server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/litellm/tests/test_proxy_server.py b/litellm/tests/test_proxy_server.py index d5e8f09c6..3d839b26c 100644 --- a/litellm/tests/test_proxy_server.py +++ b/litellm/tests/test_proxy_server.py @@ -336,6 +336,8 @@ def test_load_router_config(): "acompletion", "embedding", "aembedding", + "atranscription", + "transcription", ] # init with all call types litellm.disable_cache() From faad44fc671667182d5dab6b0a219d85ec99bbf8 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 18:50:58 -0800 Subject: [PATCH 298/304] =?UTF-8?q?bump:=20version=201.30.6=20=E2=86=92=20?= =?UTF-8?q?1.30.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1d7d4a21c..127da6492 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.6" +version = "1.30.7" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -75,7 +75,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.6" +version = "1.30.7" version_files = [ "pyproject.toml:^version" ] From 1d15dde6de2c9a12a0e94911a575f3763212a025 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 19:11:37 -0800 Subject: [PATCH 299/304] fix(utils.py): fix model setting in completion cost --- litellm/utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/litellm/utils.py b/litellm/utils.py index ffd82d53d..b19bf62fa 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3770,7 +3770,11 @@ def completion_cost( "model", None ) # check if user passed an override for model, if it's none check completion_response['model'] if hasattr(completion_response, "_hidden_params"): - model = model or completion_response._hidden_params.get("model", None) + if ( + completion_response._hidden_params.get("model", None) is not None + and len(completion_response._hidden_params["model"]) > 0 + ): + model = completion_response._hidden_params.get("model", model) custom_llm_provider = completion_response._hidden_params.get( "custom_llm_provider", "" ) From 24d51e49aeeef1298b8be95888cef7c83661edb2 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 9 Mar 2024 19:13:25 -0800 Subject: [PATCH 300/304] =?UTF-8?q?bump:=20version=201.30.7=20=E2=86=92=20?= =?UTF-8?q?1.31.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 127da6492..b0fcf717a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm" -version = "1.30.7" +version = "1.31.0" description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -75,7 +75,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "1.30.7" +version = "1.31.0" version_files = [ "pyproject.toml:^version" ] From b01f428f9e65c0e4d4743bd8babe51a3f4235a69 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 19:05:17 -0800 Subject: [PATCH 301/304] (fix) add comments on req.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e13fa6ab8..a14e15cd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,5 +33,5 @@ jinja2==3.1.3 # for prompt templates certifi>=2023.7.22 # [TODO] clean up aiohttp==3.9.0 # for network calls aioboto3==12.3.0 # for async sagemaker calls -argon2-cffi==23.1.0 +argon2-cffi==23.1.0 # for checking secrets #### \ No newline at end of file From f6ba18cb52d4914fca318707fa0e5b7938f22666 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Sat, 9 Mar 2024 19:35:43 -0800 Subject: [PATCH 302/304] =?UTF-8?q?bump:=20version=201.30.7=20=E2=86=92=20?= =?UTF-8?q?1.30.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b0fcf717a..693cb3f7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,10 @@ [tool.poetry] name = "litellm" +<<<<<<< HEAD version = "1.31.0" +======= +version = "1.30.8" +>>>>>>> 5a3df3fa (bump: version 1.30.7 → 1.30.8) description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -75,7 +79,11 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] +<<<<<<< HEAD version = "1.31.0" +======= +version = "1.30.8" +>>>>>>> 5a3df3fa (bump: version 1.30.7 → 1.30.8) version_files = [ "pyproject.toml:^version" ] From 4ea24ac7181fdd34d2736ea2509c6c51d6ab9476 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sun, 10 Mar 2024 09:39:52 -0700 Subject: [PATCH 303/304] fix(pyproject.toml): fix merge conflict --- pyproject.toml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 693cb3f7f..b0fcf717a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,6 @@ [tool.poetry] name = "litellm" -<<<<<<< HEAD version = "1.31.0" -======= -version = "1.30.8" ->>>>>>> 5a3df3fa (bump: version 1.30.7 → 1.30.8) description = "Library to easily interface with LLM API providers" authors = ["BerriAI"] license = "MIT" @@ -79,11 +75,7 @@ requires = ["poetry-core", "wheel"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -<<<<<<< HEAD version = "1.31.0" -======= -version = "1.30.8" ->>>>>>> 5a3df3fa (bump: version 1.30.7 → 1.30.8) version_files = [ "pyproject.toml:^version" ] From 942b5e4145fded85e3795a92c3b934706614ef7f Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sun, 10 Mar 2024 09:48:06 -0700 Subject: [PATCH 304/304] fix(main.py): trigger new build --- litellm/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/litellm/main.py b/litellm/main.py index 114b46948..41848028e 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -12,6 +12,7 @@ from typing import Any, Literal, Union, BinaryIO from functools import partial import dotenv, traceback, random, asyncio, time, contextvars from copy import deepcopy + import httpx import litellm from ._logging import verbose_logger