From 3560d8e5e51b4222f7309cf2217d923c00c8ce48 Mon Sep 17 00:00:00 2001 From: Xuchen Pan <32844285+pan-x-c@users.noreply.github.com> Date: Sun, 9 Jun 2024 16:09:22 +0800 Subject: [PATCH] Refactor the AgentScope Studio and open source AgentScope Workstation (#238) --------- Co-authored-by: DavdGao Co-authored-by: rayrayraykk <18007356109@163.com> Co-authored-by: qbc Co-authored-by: zhijianma --- .../distributed_debate/distributed_debate.py | 4 +- examples/distributed_search/searcher_agent.py | 9 +- setup.py | 8 +- src/agentscope/_init.py | 30 +- src/agentscope/_runtime.py | 22 +- src/agentscope/agents/agent.py | 30 +- src/agentscope/agents/rpc_agent.py | 5 + src/agentscope/agents/user_agent.py | 88 +- src/agentscope/exception.py | 15 + src/agentscope/file_manager.py | 7 +- .../{utils/logging_utils.py => logging.py} | 24 +- src/agentscope/message.py | 7 +- src/agentscope/server/launcher.py | 77 +- src/agentscope/server/servicer.py | 39 + src/agentscope/studio/__init__.py | 5 + src/agentscope/studio/_app.py | 700 ++ src/agentscope/studio/_client.py | 213 + src/agentscope/studio/static/css/base.css | 44 + .../static/css/dashboard-detail-code.css | 101 + .../static/css/dashboard-detail-dialogue.css | 484 + .../css/dashboard-detail-invocation.css | 44 + .../studio/static/css/dashboard-detail.css | 82 + .../studio/static/css/dashboard-runs.css | 124 + .../studio/static/css/dashboard.css | 37 + .../fonts.css => studio/static/css/font.css} | 4 +- src/agentscope/studio/static/css/index.css | 222 + .../css/workstation-drag-components.css | 153 + .../studio/static/css/workstation.css | 842 ++ .../static/css_third_party/clusterize.css | 38 + .../static/css_third_party/drawflow.min.css | 147 + .../static/css_third_party/highlight.min.css | 1 + .../static/css_third_party/katex.min.css | 1 + .../prism-line-numbers.min.css | 1 + .../static/css_third_party/prism.min.css | 1 + .../static/css_third_party/tabulator.min.css | 2 + .../{web => studio}/static/fonts/KRYPTON.ttf | Bin .../static/fonts/SourceSans3-Regular.ttf | Bin 0 -> 380932 bytes .../agent-dialogagent.html | 33 + .../agent-dictdialogagent.html | 46 + .../agent-reactagent.html | 57 + .../agent-texttoimageagent.html | 28 + .../html-drag-components/agent-useragent.html | 24 + .../html-drag-components/message-msg.html | 27 + .../model-dashscope-chat.html | 44 + .../model-openai-chat.html | 55 + .../model-post-api-chat.html | 50 + .../model-post-api-dall-e.html | 45 + .../pipeline-forlooppipeline.html | 25 + .../pipeline-ifelsepipeline.html | 23 + .../html-drag-components/pipeline-msghub.html | 26 + .../pipeline-placeholder.html | 13 + .../pipeline-sequentialpipeline.html | 17 + .../pipeline-switchpipeline.html | 27 + .../pipeline-whilelooppipeline.html | 21 + .../service-bing-search.html | 23 + .../service-execute-python.html | 16 + .../service-google-search.html | 27 + .../service-read-text.html | 16 + .../service-write-text.html | 16 + .../static/html-drag-components/welcome.html | 38 + .../static/html/dashboard-detail-code.html | 10 + .../html/dashboard-detail-dialogue.html | 71 + .../html/dashboard-detail-invocation.html | 4 + .../studio/static/html/dashboard-detail.html | 40 + .../studio/static/html/dashboard-runs.html | 6 + .../studio/static/html/dashboard.html | 10 + .../studio/static/html/index-guide.html | 34 + src/agentscope/studio/static/html/market.html | 1 + src/agentscope/studio/static/html/server.html | 1 + .../studio/static/html/template.html | 47 + .../static/html/workstation_iframe.html | 1 + .../studio/static/js/dashboard-detail-code.js | 77 + .../static/js/dashboard-detail-dialogue.js | 621 ++ .../static/js/dashboard-detail-invocation.js | 75 + .../studio/static/js/dashboard-detail.js | 92 + .../studio/static/js/dashboard-runs.js | 115 + src/agentscope/studio/static/js/dashboard.js | 117 + src/agentscope/studio/static/js/index.js | 137 + .../studio/static/js/workstation.js | 2036 +++++ .../studio/static/js/workstation_iframe.js | 3 + .../static/js_third_party/clusterize.min.js | 17 + .../static/js_third_party/drawflow.min.js | 942 ++ .../static/js_third_party/highlight.min.js | 1213 +++ .../static/js_third_party/jquery.min.js | 2 + .../studio/static/js_third_party/katex.min.js | 1 + .../marked-katex-extension.umd.js | 84 + .../static/js_third_party/marked.min.js | 6 + .../static/js_third_party/micromodal.min.js | 1 + .../js_third_party/monaco-editor.loader.js | 11 + .../js_third_party/prism-line-numbers.min.js | 1 + .../static/js_third_party/prism-python.min.js | 1 + .../studio/static/js_third_party/prism.min.js | 1 + .../studio/static/js_third_party/socket.io.js | 7919 +++++++++++++++++ .../static/js_third_party/sweetalert2@9 | 2 + .../static/js_third_party/tabulator.min.js | 3 + .../static/workstation_templates/en1.json | 99 + .../static/workstation_templates/en2.json | 129 + .../static/workstation_templates/en3.json | 139 + .../static/workstation_templates/en4.json | 255 + .../static/workstation_templates/zh1.json | 102 + src/agentscope/studio/templates/index.html | 146 + .../studio/templates/workstation.html | 336 + src/agentscope/utils/__init__.py | 2 - src/agentscope/utils/monitor.py | 6 +- src/agentscope/utils/tools.py | 101 +- src/agentscope/web/__init__.py | 6 - src/agentscope/web/_app.py | 122 - .../web/{studio => gradio}/__init__.py | 0 .../web/{studio => gradio}/constants.py | 0 .../web/{studio => gradio}/studio.py | 4 +- .../web/{studio => gradio}/utils.py | 0 .../web/static/css/bootstrap.min.css | 7 - src/agentscope/web/static/css/colors.css | 30 - src/agentscope/web/static/css/components.css | 132 - src/agentscope/web/static/css/home.css | 188 - src/agentscope/web/static/css/run.css | 318 - src/agentscope/web/static/css/size.css | 32 - src/agentscope/web/static/fonts/OSWALD.ttf | Bin 169108 -> 0 bytes .../web/static/htmls/agent-chat-item.html | 8 - .../web/static/htmls/user-chat-item.html | 8 - .../web/static/js/bootstrap-table.min.js | 3471 -------- .../web/static/js/bootstrap.bundle.min.js | 2202 ----- src/agentscope/web/static/js/home.js | 187 - .../web/static/js/jquery-3.3.1.min.js | 2753 ------ src/agentscope/web/static/js/run.js | 202 - src/agentscope/web/static/js/socket.io.js | 5870 ------------ src/agentscope/web/templates/home.html | 132 - src/agentscope/web/templates/run.html | 120 - .../web/workstation/workflow_dag.py | 17 +- tests/logger_test.py | 2 +- 130 files changed, 19253 insertions(+), 15883 deletions(-) rename src/agentscope/{utils/logging_utils.py => logging.py} (93%) create mode 100644 src/agentscope/studio/__init__.py create mode 100644 src/agentscope/studio/_app.py create mode 100644 src/agentscope/studio/_client.py create mode 100644 src/agentscope/studio/static/css/base.css create mode 100644 src/agentscope/studio/static/css/dashboard-detail-code.css create mode 100644 src/agentscope/studio/static/css/dashboard-detail-dialogue.css create mode 100644 src/agentscope/studio/static/css/dashboard-detail-invocation.css create mode 100644 src/agentscope/studio/static/css/dashboard-detail.css create mode 100644 src/agentscope/studio/static/css/dashboard-runs.css create mode 100644 src/agentscope/studio/static/css/dashboard.css rename src/agentscope/{web/static/css/fonts.css => studio/static/css/font.css} (53%) create mode 100644 src/agentscope/studio/static/css/index.css create mode 100644 src/agentscope/studio/static/css/workstation-drag-components.css create mode 100644 src/agentscope/studio/static/css/workstation.css create mode 100644 src/agentscope/studio/static/css_third_party/clusterize.css create mode 100644 src/agentscope/studio/static/css_third_party/drawflow.min.css create mode 100644 src/agentscope/studio/static/css_third_party/highlight.min.css create mode 100644 src/agentscope/studio/static/css_third_party/katex.min.css create mode 100644 src/agentscope/studio/static/css_third_party/prism-line-numbers.min.css create mode 100644 src/agentscope/studio/static/css_third_party/prism.min.css create mode 100644 src/agentscope/studio/static/css_third_party/tabulator.min.css rename src/agentscope/{web => studio}/static/fonts/KRYPTON.ttf (100%) create mode 100644 src/agentscope/studio/static/fonts/SourceSans3-Regular.ttf create mode 100644 src/agentscope/studio/static/html-drag-components/agent-dialogagent.html create mode 100644 src/agentscope/studio/static/html-drag-components/agent-dictdialogagent.html create mode 100644 src/agentscope/studio/static/html-drag-components/agent-reactagent.html create mode 100644 src/agentscope/studio/static/html-drag-components/agent-texttoimageagent.html create mode 100644 src/agentscope/studio/static/html-drag-components/agent-useragent.html create mode 100644 src/agentscope/studio/static/html-drag-components/message-msg.html create mode 100644 src/agentscope/studio/static/html-drag-components/model-dashscope-chat.html create mode 100644 src/agentscope/studio/static/html-drag-components/model-openai-chat.html create mode 100644 src/agentscope/studio/static/html-drag-components/model-post-api-chat.html create mode 100644 src/agentscope/studio/static/html-drag-components/model-post-api-dall-e.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-forlooppipeline.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-ifelsepipeline.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-msghub.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-placeholder.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-sequentialpipeline.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-switchpipeline.html create mode 100644 src/agentscope/studio/static/html-drag-components/pipeline-whilelooppipeline.html create mode 100644 src/agentscope/studio/static/html-drag-components/service-bing-search.html create mode 100644 src/agentscope/studio/static/html-drag-components/service-execute-python.html create mode 100644 src/agentscope/studio/static/html-drag-components/service-google-search.html create mode 100644 src/agentscope/studio/static/html-drag-components/service-read-text.html create mode 100644 src/agentscope/studio/static/html-drag-components/service-write-text.html create mode 100644 src/agentscope/studio/static/html-drag-components/welcome.html create mode 100644 src/agentscope/studio/static/html/dashboard-detail-code.html create mode 100644 src/agentscope/studio/static/html/dashboard-detail-dialogue.html create mode 100644 src/agentscope/studio/static/html/dashboard-detail-invocation.html create mode 100644 src/agentscope/studio/static/html/dashboard-detail.html create mode 100644 src/agentscope/studio/static/html/dashboard-runs.html create mode 100644 src/agentscope/studio/static/html/dashboard.html create mode 100644 src/agentscope/studio/static/html/index-guide.html create mode 100644 src/agentscope/studio/static/html/market.html create mode 100644 src/agentscope/studio/static/html/server.html create mode 100644 src/agentscope/studio/static/html/template.html create mode 100644 src/agentscope/studio/static/html/workstation_iframe.html create mode 100644 src/agentscope/studio/static/js/dashboard-detail-code.js create mode 100644 src/agentscope/studio/static/js/dashboard-detail-dialogue.js create mode 100644 src/agentscope/studio/static/js/dashboard-detail-invocation.js create mode 100644 src/agentscope/studio/static/js/dashboard-detail.js create mode 100644 src/agentscope/studio/static/js/dashboard-runs.js create mode 100644 src/agentscope/studio/static/js/dashboard.js create mode 100644 src/agentscope/studio/static/js/index.js create mode 100644 src/agentscope/studio/static/js/workstation.js create mode 100644 src/agentscope/studio/static/js/workstation_iframe.js create mode 100644 src/agentscope/studio/static/js_third_party/clusterize.min.js create mode 100644 src/agentscope/studio/static/js_third_party/drawflow.min.js create mode 100644 src/agentscope/studio/static/js_third_party/highlight.min.js create mode 100644 src/agentscope/studio/static/js_third_party/jquery.min.js create mode 100644 src/agentscope/studio/static/js_third_party/katex.min.js create mode 100644 src/agentscope/studio/static/js_third_party/marked-katex-extension.umd.js create mode 100644 src/agentscope/studio/static/js_third_party/marked.min.js create mode 100644 src/agentscope/studio/static/js_third_party/micromodal.min.js create mode 100644 src/agentscope/studio/static/js_third_party/monaco-editor.loader.js create mode 100644 src/agentscope/studio/static/js_third_party/prism-line-numbers.min.js create mode 100644 src/agentscope/studio/static/js_third_party/prism-python.min.js create mode 100644 src/agentscope/studio/static/js_third_party/prism.min.js create mode 100644 src/agentscope/studio/static/js_third_party/socket.io.js create mode 100644 src/agentscope/studio/static/js_third_party/sweetalert2@9 create mode 100644 src/agentscope/studio/static/js_third_party/tabulator.min.js create mode 100644 src/agentscope/studio/static/workstation_templates/en1.json create mode 100644 src/agentscope/studio/static/workstation_templates/en2.json create mode 100644 src/agentscope/studio/static/workstation_templates/en3.json create mode 100644 src/agentscope/studio/static/workstation_templates/en4.json create mode 100644 src/agentscope/studio/static/workstation_templates/zh1.json create mode 100644 src/agentscope/studio/templates/index.html create mode 100644 src/agentscope/studio/templates/workstation.html delete mode 100644 src/agentscope/web/_app.py rename src/agentscope/web/{studio => gradio}/__init__.py (100%) rename src/agentscope/web/{studio => gradio}/constants.py (100%) rename src/agentscope/web/{studio => gradio}/studio.py (99%) rename src/agentscope/web/{studio => gradio}/utils.py (100%) delete mode 100644 src/agentscope/web/static/css/bootstrap.min.css delete mode 100644 src/agentscope/web/static/css/colors.css delete mode 100644 src/agentscope/web/static/css/components.css delete mode 100644 src/agentscope/web/static/css/home.css delete mode 100644 src/agentscope/web/static/css/run.css delete mode 100644 src/agentscope/web/static/css/size.css delete mode 100644 src/agentscope/web/static/fonts/OSWALD.ttf delete mode 100644 src/agentscope/web/static/htmls/agent-chat-item.html delete mode 100644 src/agentscope/web/static/htmls/user-chat-item.html delete mode 100644 src/agentscope/web/static/js/bootstrap-table.min.js delete mode 100644 src/agentscope/web/static/js/bootstrap.bundle.min.js delete mode 100644 src/agentscope/web/static/js/home.js delete mode 100644 src/agentscope/web/static/js/jquery-3.3.1.min.js delete mode 100644 src/agentscope/web/static/js/run.js delete mode 100644 src/agentscope/web/static/js/socket.io.js delete mode 100644 src/agentscope/web/templates/home.html delete mode 100644 src/agentscope/web/templates/run.html diff --git a/examples/distributed_debate/distributed_debate.py b/examples/distributed_debate/distributed_debate.py index a4e0a4287..e09397ef3 100644 --- a/examples/distributed_debate/distributed_debate.py +++ b/examples/distributed_debate/distributed_debate.py @@ -5,12 +5,14 @@ from user_proxy_agent import UserProxyAgent +from loguru import logger + import agentscope from agentscope.agents import DialogAgent from agentscope.msghub import msghub from agentscope.server import RpcAgentServerLauncher from agentscope.message import Msg -from agentscope.utils.logging_utils import logger + FIRST_ROUND = """ Welcome to the debate on whether Artificial General Intelligence (AGI) can be achieved using the GPT model framework. This debate will consist of three rounds. In each round, the affirmative side will present their argument first, followed by the negative side. After both sides have presented, the adjudicator will summarize the key points and analyze the strengths of the arguments. diff --git a/examples/distributed_search/searcher_agent.py b/examples/distributed_search/searcher_agent.py index 63aec9e11..9a1c9b435 100644 --- a/examples/distributed_search/searcher_agent.py +++ b/examples/distributed_search/searcher_agent.py @@ -68,7 +68,6 @@ def reply(self, x: dict = None) -> dict: ), ) query = self.model(prompt).text - self.speak(query) results = self.search( question=query, num_results=self.result_num, @@ -85,4 +84,12 @@ def reply(self, x: dict = None) -> dict: for result in results ], ) + self.speak( + Msg( + name=self.name, + role="assistant", + content="Search results:\n" + f"{[result['link'] for result in results]}", + ), + ) return msg diff --git a/setup.py b/setup.py index 677ac12ba..bef2b9619 100644 --- a/setup.py +++ b/setup.py @@ -51,6 +51,8 @@ "black", ] +studio_requires = [] + # released requires minimal_requires = [ "docstring_parser", @@ -66,6 +68,7 @@ "Flask==3.0.0", "Flask-Cors==4.0.0", "Flask-SocketIO==5.3.6", + "flask_sqlalchemy", "flake8", # TODO: move into other requires "dashscope==1.14.1", @@ -74,6 +77,7 @@ "google-generativeai>=0.4.0", "zhipuai", "litellm", + "psutil", ] distribute_requires = minimal_requires + rpc_requires @@ -87,6 +91,7 @@ + doc_requires + test_requires + gradio_requires + + studio_requires ) with open("README.md", "r", encoding="UTF-8") as fh: @@ -123,7 +128,8 @@ python_requires=">=3.9", entry_points={ "console_scripts": [ - "as_studio=agentscope.web.studio.studio:run_app", + "as_studio=agentscope.studio:init", + "as_gradio=agentscope.web.gradio.studio:run_app", "as_workflow=agentscope.web.workstation.workflow:main", "as_server=agentscope.server.launcher:as_server", ], diff --git a/src/agentscope/_init.py b/src/agentscope/_init.py index 34fa88c33..b0bf50e6d 100644 --- a/src/agentscope/_init.py +++ b/src/agentscope/_init.py @@ -8,11 +8,12 @@ from .agents import AgentBase from ._runtime import _runtime from .file_manager import file_manager -from .utils.logging_utils import LOG_LEVEL, setup_logger +from .logging import LOG_LEVEL, setup_logger from .utils.monitor import MonitorFactory from .models import read_model_configs from .constants import _DEFAULT_DIR from .constants import _DEFAULT_LOG_LEVEL +from .studio._client import _studio_client # init setting _INIT_SETTINGS = {} @@ -30,6 +31,7 @@ def init( logger_level: LOG_LEVEL = _DEFAULT_LOG_LEVEL, runtime_id: Optional[str] = None, agent_configs: Optional[Union[str, list, dict]] = None, + studio_url: Optional[str] = None, ) -> Sequence[AgentBase]: """A unified entry to initialize the package, including model configs, runtime names, saving directories and logging settings. @@ -65,6 +67,8 @@ def init( which can be loaded by json.loads(). One agent config should cover the required arguments to initialize a specific agent object, otherwise the default values will be used. + studio_url (`Optional[str]`, defaults to `None`): + The url of the agentscope studio. """ init_process( model_configs=model_configs, @@ -76,17 +80,19 @@ def init( save_log=save_log, use_monitor=use_monitor, logger_level=logger_level, + studio_url=studio_url, ) # save init settings for subprocess _INIT_SETTINGS["model_configs"] = model_configs - _INIT_SETTINGS["project"] = project - _INIT_SETTINGS["name"] = name + _INIT_SETTINGS["project"] = _runtime.project + _INIT_SETTINGS["name"] = _runtime.name _INIT_SETTINGS["runtime_id"] = _runtime.runtime_id _INIT_SETTINGS["save_dir"] = save_dir _INIT_SETTINGS["save_api_invoke"] = save_api_invoke _INIT_SETTINGS["save_log"] = save_log _INIT_SETTINGS["logger_level"] = logger_level + _INIT_SETTINGS["use_monitor"] = use_monitor # Save code if needed if save_code: @@ -128,6 +134,7 @@ def init_process( save_log: bool = False, use_monitor: bool = True, logger_level: LOG_LEVEL = _DEFAULT_LOG_LEVEL, + studio_url: Optional[str] = None, ) -> None: """An entry to initialize the package in a process. @@ -153,12 +160,16 @@ def init_process( Whether to activate the monitor. logger_level (`LOG_LEVEL`, defaults to `"INFO"`): The logging level of logger. + studio_url (`Optional[str]`, defaults to `None`): + The url of the agentscope studio. """ # Init the runtime if project is not None: _runtime.project = project + if name is not None: _runtime.name = name + if runtime_id is not None: _runtime.runtime_id = runtime_id @@ -178,3 +189,16 @@ def init_process( db_path=file_manager.path_db, impl_type="sqlite" if use_monitor else "dummy", ) + + # Init studio client, which will push messages to web ui and fetch user + # inputs from web ui + if studio_url is not None: + _studio_client.initialize(_runtime.runtime_id, studio_url) + # Register in AgentScope Studio + _studio_client.register_running_instance( + project=_runtime.project, + name=_runtime.name, + timestamp=_runtime.timestamp, + run_dir=file_manager.dir_root, + pid=os.getpid(), + ) diff --git a/src/agentscope/_runtime.py b/src/agentscope/_runtime.py index 178138873..5ffec057a 100644 --- a/src/agentscope/_runtime.py +++ b/src/agentscope/_runtime.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- """Manage the id for each runtime""" +import os from datetime import datetime from typing import Any from agentscope.utils.tools import _get_timestamp +from agentscope.utils.tools import _get_process_creation_time from agentscope.utils.tools import _generate_random_code _RUNTIME_ID_FORMAT = "run_%Y%m%d-%H%M%S_{}" @@ -14,17 +16,20 @@ class _Runtime: """A singleton class used to record the runtime information, which will be initialized when the package is imported.""" - project: str = None + project: str """The project name, which is used to identify the project.""" - name: str = None + name: str """The name for runtime, which is used to identify this runtime.""" - runtime_id: str = None + runtime_id: str """The id for runtime, which is used to identify the this runtime and name the saving directory.""" - _timestamp: datetime = datetime.now() + pid: int + """The process id of the runtime.""" + + _timestamp: datetime """The timestamp of when the runtime is initialized.""" _instance = None @@ -48,6 +53,9 @@ def __init__(self) -> None: self.project = _generate_random_code() self.name = _generate_random_code(uppercase=False) + self.pid = os.getpid() + self._timestamp = _get_process_creation_time() + # Obtain time from timestamp in string format, and then turn it into # runtime ID format self.runtime_id = _get_timestamp( @@ -55,6 +63,12 @@ def __init__(self) -> None: self._timestamp, ).format(self.name) + def generate_new_runtime_id(self) -> str: + """Generate a new random runtime id.""" + return _get_timestamp(_RUNTIME_ID_FORMAT).format( + _generate_random_code(uppercase=False), + ) + @property def timestamp(self) -> str: """Get the current timestamp in specific format.""" diff --git a/src/agentscope/agents/agent.py b/src/agentscope/agents/agent.py index 4341952d9..7ae48a5b7 100644 --- a/src/agentscope/agents/agent.py +++ b/src/agentscope/agents/agent.py @@ -12,6 +12,7 @@ from loguru import logger from agentscope.agents.operator import Operator +from agentscope.message import Msg from agentscope.models import load_model_by_config_name from agentscope.memory import TemporaryMemory @@ -301,10 +302,33 @@ def __call__(self, *args: Any, **kwargs: Any) -> dict: def speak( self, - content: Union[str, dict], + content: Union[str, Msg], ) -> None: - """Speak out the content generated by the agent.""" - logger.chat(content) + """ + Speak out the message generated by the agent. If a string is given, + a Msg object will be created with the string as the content. + + Args: + content (`Union[str, Msg]`): + The content of the message to be spoken out. If a string is + given, a Msg object will be created with the agent's name, role + as "assistant", and the given string as the content. + """ + if isinstance(content, str): + msg = Msg( + name=self.name, + content=content, + role="assistant", + ) + elif isinstance(content, Msg): + msg = content + else: + raise TypeError( + "From version 0.0.5, the speak method only accepts str or Msg " + f"object, got {type(content)} instead.", + ) + + logger.chat(msg) def observe(self, x: Union[dict, Sequence[dict]]) -> None: """Observe the input, store it in memory without response to it. diff --git a/src/agentscope/agents/rpc_agent.py b/src/agentscope/agents/rpc_agent.py index 306dfa900..ec6cc39ba 100644 --- a/src/agentscope/agents/rpc_agent.py +++ b/src/agentscope/agents/rpc_agent.py @@ -9,6 +9,7 @@ ) from agentscope.rpc import RpcAgentClient from agentscope.server.launcher import RpcAgentServerLauncher +from agentscope.studio._client import _studio_client class RpcAgent(AgentBase): @@ -70,6 +71,9 @@ def __init__( launch_server = port is None if launch_server: self.host = "localhost" + studio_url = None + if _studio_client.active: + studio_url = _studio_client.studio_url self.server_launcher = RpcAgentServerLauncher( host=self.host, port=port, @@ -77,6 +81,7 @@ def __init__( max_timeout_seconds=max_timeout_seconds, local_mode=local_mode, custom_agents=[agent_class], + studio_url=studio_url, ) if not lazy_launch: self._launch_server() diff --git a/src/agentscope/agents/user_agent.py b/src/agentscope/agents/user_agent.py index ee97a935f..c18889229 100644 --- a/src/agentscope/agents/user_agent.py +++ b/src/agentscope/agents/user_agent.py @@ -6,8 +6,9 @@ from loguru import logger from agentscope.agents import AgentBase +from agentscope.studio._client import _studio_client from agentscope.message import Msg -from agentscope.web.studio.utils import user_input +from agentscope.web.gradio.utils import user_input class UserAgent(AgentBase): @@ -65,25 +66,41 @@ def reply( if self.memory: self.memory.add(x) - # TODO: To avoid order confusion, because `input` print much quicker - # than logger.chat - time.sleep(0.5) - content = user_input(timeout=timeout) - - kwargs = {} - if required_keys is not None: - if isinstance(required_keys, str): - required_keys = [required_keys] - - for key in required_keys: - kwargs[key] = input(f"{key}: ") - - # Input url of file, image, video, audio or website - url = None - if self.require_url: - url = input("URL (or Enter to skip): ") - if url == "": - url = None + if _studio_client.active: + logger.info( + f"Waiting for input from:\n\n" + f" * {_studio_client.get_run_detail_page_url()}\n", + ) + raw_input = _studio_client.get_user_input( + agent_id=self.agent_id, + name=self.name, + require_url=self.require_url, + required_keys=required_keys, + ) + + print("Python: receive ", raw_input) + content = raw_input["content"] + url = raw_input["url"] + kwargs = {} + else: + # TODO: To avoid order confusion, because `input` print much + # quicker than logger.chat + time.sleep(0.5) + content = user_input(timeout=timeout) + kwargs = {} + if required_keys is not None: + if isinstance(required_keys, str): + required_keys = [required_keys] + + for key in required_keys: + kwargs[key] = input(f"{key}: ") + + # Input url of file, image, video, audio or website + url = None + if self.require_url: + url = input("URL (or Enter to skip): ") + if url == "": + url = None # Add additional keys msg = Msg( @@ -104,7 +121,32 @@ def reply( def speak( self, - content: Union[str, dict], + content: Union[str, Msg], ) -> None: - """Speak the content to the audience.""" - logger.chat(content, disable_studio=True) + """ + Speak out the message generated by the agent. If a string is given, + a Msg object will be created with the string as the content. + + Args: + content (`Union[str, Msg]`): + The content of the message to be spoken out. If a string is + given, a Msg object will be created with the agent's name, role + as "user", and the given string as the content. + + """ + if isinstance(content, str): + msg = Msg( + name=self.name, + content=content, + role="assistant", + ) + _studio_client.push_message(msg) + elif isinstance(content, Msg): + msg = content + else: + raise TypeError( + "From version 0.0.5, the speak method only accepts str or Msg " + f"object, got {type(content)} instead.", + ) + + logger.chat(msg) diff --git a/src/agentscope/exception.py b/src/agentscope/exception.py index d8f78f8df..6110fe36e 100644 --- a/src/agentscope/exception.py +++ b/src/agentscope/exception.py @@ -96,3 +96,18 @@ class ArgumentNotFoundError(FunctionCallError): class ArgumentTypeError(FunctionCallError): """The exception class for argument type error.""" + + +class StudioError(Exception): + """The base class for exception raising during interaction with agentscope + studio.""" + + def __init__(self, message: str) -> None: + self.message = message + + def __str__(self) -> str: + return f"{self.__class__.__name__}: {self.message}" + + +class StudioRegisterError(StudioError): + """The exception class for error when registering to agentscope studio.""" diff --git a/src/agentscope/file_manager.py b/src/agentscope/file_manager.py index b8474403a..1fcdde309 100644 --- a/src/agentscope/file_manager.py +++ b/src/agentscope/file_manager.py @@ -26,7 +26,7 @@ class _FileManager: _instance = None - dir: str = _DEFAULT_DIR + dir: str = os.path.abspath(_DEFAULT_DIR) """The directory for saving files, code and logs.""" save_api_invoke: bool = False @@ -86,7 +86,7 @@ def path_db(self) -> str: def init(self, save_dir: str, save_api_invoke: bool = False) -> None: """Set the directory for saving files.""" - self.dir = save_dir + self.dir = os.path.abspath(save_dir) runtime_dir = os.path.join(save_dir, _runtime.runtime_id) os.makedirs(runtime_dir, exist_ok=True) @@ -100,8 +100,9 @@ def _save_config(self) -> None: cfg = { "project": _runtime.project, "name": _runtime.name, - "id": _runtime.runtime_id, + "run_id": _runtime.runtime_id, "timestamp": _runtime.timestamp, + "pid": os.getpid(), } with open( os.path.join(self.dir_root, _DEFAULT_CFG_NAME), diff --git a/src/agentscope/utils/logging_utils.py b/src/agentscope/logging.py similarity index 93% rename from src/agentscope/utils/logging_utils.py rename to src/agentscope/logging.py index 9d7fcf711..61a89e43d 100644 --- a/src/agentscope/utils/logging_utils.py +++ b/src/agentscope/logging.py @@ -3,11 +3,12 @@ import json import os import sys -from typing import Optional, Literal, Union, Any +from typing import Optional, Literal, Any from loguru import logger -from agentscope.web.studio.utils import ( +from agentscope.studio._client import _studio_client +from agentscope.web.gradio.utils import ( generate_image_from_name, send_msg, get_reset_msg, @@ -70,20 +71,25 @@ def _get_speaker_color(speaker: str) -> tuple[str, str]: # add chat function for logger def _chat( - message: Union[str, dict], + message: dict, *args: Any, disable_studio: bool = False, **kwargs: Any, ) -> None: - """Log a chat message with the format of": ". + """ + Log a chat message with the format of": ". If the + running instance is registered in the studio, the message will be sent + and display in the studio. Args: - message (`Union[str, dict]`): - The message to be logged. If it is a string, it will be logged - directly. If it's a dict, it should have "name"(or "role") and - "content" keys, and the message will be logged as ": - ". + message (`dict`): + The message to be logged as ": ", which must + be an object of Msg class. """ + # Push message to studio if it is active + if _studio_client.active: + _studio_client.push_message(message) + # Save message into chat file, add default to ignore not serializable # objects logger.log( diff --git a/src/agentscope/message.py b/src/agentscope/message.py index 372d6e624..23d2dd7a0 100644 --- a/src/agentscope/message.py +++ b/src/agentscope/message.py @@ -57,10 +57,7 @@ def __init__( self.content = content self.role = role - if url: - self.url = url - else: - self.url = None + self.url = url self.update(kwargs) @@ -243,7 +240,7 @@ def serialize(self) -> str: return json.dumps({"__type": "Tht", **self}) -class PlaceholderMessage(MessageBase): +class PlaceholderMessage(Msg): """A placeholder for the return message of RpcAgent.""" PLACEHOLDER_ATTRS = { diff --git a/src/agentscope/server/launcher.py b/src/agentscope/server/launcher.py index ed5ed7f67..7a77e4971 100644 --- a/src/agentscope/server/launcher.py +++ b/src/agentscope/server/launcher.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- """ Server of distributed agent""" import os -from multiprocessing import Process, Event, Pipe -from multiprocessing.synchronize import Event as EventClass import asyncio import signal import argparse +import time +from multiprocessing import Process, Event, Pipe +from multiprocessing.synchronize import Event as EventClass from typing import Type from concurrent import futures from loguru import logger @@ -23,14 +24,10 @@ import_error, "distribute", ) - import agentscope from agentscope.server.servicer import AgentServerServicer from agentscope.agents.agent import AgentBase -from agentscope.utils.tools import ( - _get_timestamp, - check_port, -) +from agentscope.utils.tools import check_port, generate_id_from_seed def _setup_agent_server( @@ -44,6 +41,7 @@ def _setup_agent_server( local_mode: bool = True, max_pool_size: int = 8192, max_timeout_seconds: int = 1800, + studio_url: str = None, custom_agents: list = None, ) -> None: """Setup agent server. @@ -56,7 +54,7 @@ def _setup_agent_server( server_id (`str`): The id of the server. init_settings (`dict`, defaults to `None`): - Init settings for agentscope.init. + Init settings for _init_server. start_event (`EventClass`, defaults to `None`): An Event instance used to determine whether the child process has been started. @@ -71,6 +69,8 @@ def _setup_agent_server( Max number of agent replies that the server can accommodate. max_timeout_seconds (`int`, defaults to `1800`): Timeout for agent replies. + studio_url (`str`, defaults to `None`): + URL of the AgentScope Studio. custom_agents (`list`, defaults to `None`): A list of custom agent classes that are not in `agentscope.agents`. """ @@ -86,6 +86,7 @@ def _setup_agent_server( local_mode=local_mode, max_pool_size=max_pool_size, max_timeout_seconds=max_timeout_seconds, + studio_url=studio_url, custom_agents=custom_agents, ), ) @@ -102,6 +103,7 @@ async def _setup_agent_server_async( local_mode: bool = True, max_pool_size: int = 8192, max_timeout_seconds: int = 1800, + studio_url: str = None, custom_agents: list = None, ) -> None: """Setup agent server in an async way. @@ -114,7 +116,7 @@ async def _setup_agent_server_async( server_id (`str`): The id of the server. init_settings (`dict`, defaults to `None`): - Init settings for agentscope.init. + Init settings for _init_server. start_event (`EventClass`, defaults to `None`): An Event instance used to determine whether the child process has been started. @@ -133,6 +135,8 @@ async def _setup_agent_server_async( max_timeout_seconds (`int`, defaults to `1800`): Maximum time for reply messages to be cached in the server. Note that expired messages will be deleted. + studio_url (`str`, defaults to `None`): + URL of the AgentScope Studio. custom_agents (`list`, defaults to `None`): A list of custom agent classes that are not in `agentscope.agents`. """ @@ -143,6 +147,8 @@ async def _setup_agent_server_async( servicer = AgentServerServicer( host=host, port=port, + server_id=server_id, + studio_url=studio_url, max_pool_size=max_pool_size, max_timeout_seconds=max_timeout_seconds, ) @@ -216,6 +222,7 @@ def __init__( local_mode: bool = False, custom_agents: list = None, server_id: str = None, + studio_url: str = None, agent_class: Type[AgentBase] = None, agent_args: tuple = (), agent_kwargs: dict = None, @@ -243,6 +250,8 @@ def __init__( server_id (`str`, defaults to `None`): The id of the agent server. If not specified, a random id will be generated. + studio_url (`Optional[str]`, defaults to `None`): + The url of the agentscope studio. agent_class (`Type[AgentBase]`, deprecated): The AgentBase subclass encapsulated by this wrapper. agent_args (`tuple`, deprecated): The args tuple used to @@ -260,8 +269,11 @@ def __init__( self.parent_con = None self.custom_agents = custom_agents self.server_id = ( - self.generate_server_id() if server_id is None else server_id + RpcAgentServerLauncher.generate_server_id(self.host, self.port) + if server_id is None + else server_id ) + self.studio_url = studio_url if ( agent_class is not None or len(agent_args) > 0 @@ -272,9 +284,10 @@ def __init__( " in `RpcAgentServerLauncher`", ) - def generate_server_id(self) -> str: + @classmethod + def generate_server_id(cls, host: str, port: int) -> str: """Generate server id""" - return f"{self.host}:{self.port}-{_get_timestamp('%y%m%d-%H:%M:%S')}" + return generate_id_from_seed(f"{host}:{port}:{time.time()}", length=8) def _launch_in_main(self) -> None: """Launch agent server in main-process""" @@ -290,6 +303,7 @@ def _launch_in_main(self) -> None: max_timeout_seconds=self.max_timeout_seconds, local_mode=self.local_mode, custom_agents=self.custom_agents, + studio_url=self.studio_url, ), ) @@ -313,6 +327,7 @@ def _launch_in_sub(self) -> None: "max_pool_size": self.max_pool_size, "max_timeout_seconds": self.max_timeout_seconds, "local_mode": self.local_mode, + "studio_url": self.studio_url, "custom_agents": self.custom_agents, }, ) @@ -420,7 +435,7 @@ def as_server() -> None: type=bool, default=False, help=( - "If `True`, only listen to requests from 'localhost', otherwise, " + "if `True`, only listen to requests from 'localhost', otherwise, " "listen to requests from all hosts." ), ) @@ -429,21 +444,51 @@ def as_server() -> None: type=str, help="path to the model config json file", ) + parser.add_argument( + "--server-id", + type=str, + default=None, + help="id of the server, used to register to the studio, generated" + " randomly if not specified.", + ) + parser.add_argument( + "--studio-url", + type=str, + default=None, + help="the url of agentscope studio", + ) + parser.add_argument( + "--no-log", + action="store_true", + help="whether to disable log", + ) + parser.add_argument( + "--save-api-invoke", + action="store_true", + help="whether to save api invoke", + ) + parser.add_argument( + "--use-monitor", + action="store_true", + help="whether to use monitor", + ) args = parser.parse_args() agentscope.init( project="agent_server", name=f"server_{args.host}:{args.port}", - runtime_id=_get_timestamp( - "server_{}_{}_%y%m%d-%H%M%S", - ).format(args.host, args.port), + save_log=not args.no_log, + save_api_invoke=args.save_api_invoke, model_configs=args.model_config_path, + use_monitor=args.use_monitor, ) launcher = RpcAgentServerLauncher( host=args.host, port=args.port, + server_id=args.server_id, max_pool_size=args.max_pool_size, max_timeout_seconds=args.max_timeout_seconds, local_mode=args.local_mode, + studio_url=args.studio_url, ) launcher.launch(in_subprocess=False) launcher.wait_until_terminate() diff --git a/src/agentscope/server/servicer.py b/src/agentscope/server/servicer.py index fb7ee8f98..6d23e36ed 100644 --- a/src/agentscope/server/servicer.py +++ b/src/agentscope/server/servicer.py @@ -6,6 +6,7 @@ import traceback from concurrent import futures from loguru import logger +import requests try: import dill @@ -25,7 +26,10 @@ "distribute", ) +from .._runtime import _runtime +from ..studio._client import _studio_client from ..agents.agent import AgentBase +from ..exception import StudioRegisterError from ..rpc.rpc_agent_pb2_grpc import RpcAgentServicer from ..message import ( Msg, @@ -34,6 +38,24 @@ ) +def _register_to_studio( + studio_url: str, + server_id: str, + host: str, + port: int, +) -> None: + """Register a server to studio.""" + url = f"{studio_url}/api/servers/register" + resp = requests.post( + url, + json={"server_id": server_id, "host": host, "port": port}, + timeout=10, # todo: configurable timeout + ) + if resp.status_code != 200: + logger.error(f"Failed to register server: {resp.text}") + raise StudioRegisterError(f"Failed to register server: {resp.text}") + + class AgentServerServicer(RpcAgentServicer): """A Servicer for RPC Agent Server (formerly RpcServerSideWrapper)""" @@ -41,6 +63,8 @@ def __init__( self, host: str = "localhost", port: int = None, + server_id: str = None, + studio_url: str = None, max_pool_size: int = 8192, max_timeout_seconds: int = 1800, ): @@ -51,6 +75,10 @@ def __init__( Hostname of the rpc agent server. port (`int`, defaults to `None`): Port of the rpc agent server. + server_id (`str`, defaults to `None`): + Server id of the rpc agent server. + studio_url (`str`, defaults to `None`): + URL of the AgentScope Studio. max_pool_size (`int`, defaults to `8192`): The max number of agent reply messages that the server can accommodate. Note that the oldest message will be deleted @@ -61,6 +89,17 @@ def __init__( """ self.host = host self.port = port + self.server_id = server_id + self.studio_url = studio_url + if studio_url is not None: + _register_to_studio( + studio_url=studio_url, + server_id=server_id, + host=host, + port=port, + ) + _studio_client.initialize(_runtime.runtime_id, studio_url) + self.result_pool = ExpiringDict( max_len=max_pool_size, max_age_seconds=max_timeout_seconds, diff --git a/src/agentscope/studio/__init__.py b/src/agentscope/studio/__init__.py new file mode 100644 index 000000000..ca1bbeb5e --- /dev/null +++ b/src/agentscope/studio/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +"""Import the entry point of AgentScope Studio.""" +from ._app import init + +__all__ = ["init"] diff --git a/src/agentscope/studio/_app.py b/src/agentscope/studio/_app.py new file mode 100644 index 000000000..c9375a94b --- /dev/null +++ b/src/agentscope/studio/_app.py @@ -0,0 +1,700 @@ +# -*- coding: utf-8 -*- +"""The Web Server of the AgentScope Studio.""" +import json +import os +import re +import subprocess +import tempfile +import threading +import traceback +from datetime import datetime +from typing import Tuple, Union, Any, Optional +from pathlib import Path + +from flask import ( + Flask, + request, + jsonify, + render_template, + Response, + abort, + send_file, +) +from flask_cors import CORS +from flask_sqlalchemy import SQLAlchemy +from flask_socketio import SocketIO, join_room, leave_room + +from agentscope._runtime import _runtime +from agentscope.constants import _DEFAULT_SUBDIR_CODE, _DEFAULT_SUBDIR_INVOKE +from agentscope.utils.tools import _is_process_alive + +_app = Flask(__name__) + +# Set the cache directory +_cache_dir = str(Path.home() / ".cache" / "agentscope-studio") +os.makedirs(_cache_dir, exist_ok=True) +_app.config[ + "SQLALCHEMY_DATABASE_URI" +] = f"sqlite:////{_cache_dir}/agentscope.db" +_db = SQLAlchemy(_app) + +_socketio = SocketIO(_app) + +# This will enable CORS for all routes +CORS(_app) + +_RUNS_DIRS = [] + + +class _UserInputRequestQueue: + """A queue to store the user input requests.""" + + _requests = {} + """The user input requests in the queue.""" + + @classmethod + def add_request(cls, run_id: str, agent_id: str, data: dict) -> None: + """Add a new user input request into queue. + + Args: + run_id (`str`): + The id of the runtime instance. + agent_id (`str`): + The id of the agent that requires user input. + data (`dict`): + The data of the user input request. + """ + if run_id not in cls._requests: + cls._requests[run_id] = {agent_id: data} + else: + # We ensure that the agent_id is unique here + cls._requests[run_id][agent_id] = data + + @classmethod + def fetch_a_request(cls, run_id: str) -> Optional[dict]: + """Fetch a user input request from the queue. + + Args: + run_id (`str`): + The id of the runtime instance. + """ + if run_id in cls._requests and len(cls._requests[run_id]) > 0: + # Fetch the oldest request + agent_id = list(cls._requests[run_id].keys())[0] + return cls._requests[run_id][agent_id] + else: + return None + + @classmethod + def close_a_request(cls, run_id: str, agent_id: str) -> None: + """Close a user input request in the queue. + + Args: + run_id (`str`): + The id of the runtime instance. + agent_id (`str`): + The id of the agent that requires user input. + """ + if run_id in cls._requests: + cls._requests[run_id].pop(agent_id) + + +class _RunTable(_db.Model): # type: ignore[name-defined] + """Runtime object.""" + + run_id = _db.Column(_db.String, primary_key=True) + project = _db.Column(_db.String) + name = _db.Column(_db.String) + timestamp = _db.Column(_db.String) + run_dir = _db.Column(_db.String) + pid = _db.Column(_db.Integer) + status = _db.Column(_db.String, default="finished") + + +class _ServerTable(_db.Model): # type: ignore[name-defined] + """Server object.""" + + id = _db.Column(_db.String, primary_key=True) + host = _db.Column(_db.String) + port = _db.Column(_db.Integer) + create_time = _db.Column(_db.DateTime, default=datetime.now) + + +class _MessageTable(_db.Model): # type: ignore[name-defined] + """Message object.""" + + id = _db.Column(_db.Integer, primary_key=True) + run_id = _db.Column( + _db.String, + _db.ForeignKey("run_table.run_id"), + nullable=False, + ) + name = _db.Column(_db.String) + role = _db.Column(_db.String) + content = _db.Column(_db.String) + url = _db.Column(_db.String) + meta = _db.Column(_db.String) + timestamp = _db.Column(_db.String) + + +def _get_all_runs_from_dir() -> dict: + """Get all runs from the directory.""" + global _RUNS_DIRS + runtime_configs_from_dir = {} + if _RUNS_DIRS is not None: + for runs_dir in set(_RUNS_DIRS): + for runtime_dir in os.listdir(runs_dir): + path_runtime = os.path.join(runs_dir, runtime_dir) + path_config = os.path.join(path_runtime, ".config") + if os.path.exists(path_config): + with open(path_config, "r", encoding="utf-8") as file: + runtime_config = json.load(file) + + # Default status is finished + # Note: this is only for local runtime instances + if "pid" in runtime_config and _is_process_alive( + runtime_config["pid"], + runtime_config["timestamp"], + ): + runtime_config["status"] = "running" + else: + runtime_config["status"] = "finished" + + if "run_dir" not in runtime_config: + runtime_config["run_dir"] = path_runtime + + if "id" in runtime_config: + runtime_config["run_id"] = runtime_config["id"] + del runtime_config["id"] + + runtime_id = runtime_config.get("run_id") + runtime_configs_from_dir[runtime_id] = runtime_config + + return runtime_configs_from_dir + + +def _remove_file_paths(error_trace: str) -> str: + """ + Remove the real traceback when exception happens. + """ + path_regex = re.compile(r'File "(.*?)(?=agentscope|app\.py)') + cleaned_trace = re.sub(path_regex, 'File "[hidden]/', error_trace) + + return cleaned_trace + + +def _convert_to_py( # type: ignore[no-untyped-def] + content: str, + **kwargs, +) -> Tuple: + """ + Convert json config to python code. + """ + from agentscope.web.workstation.workflow_dag import build_dag + + try: + cfg = json.loads(content) + return "True", build_dag(cfg).compile(**kwargs) + except Exception as e: + return "False", _remove_file_paths( + f"Error: {e}\n\n" f"Traceback:\n" f"{traceback.format_exc()}", + ) + + +@_app.route("/workstation") +def _workstation() -> str: + """Render the workstation page.""" + return render_template("workstation.html") + + +@_app.route("/api/runs/register", methods=["POST"]) +def _register_run() -> Response: + """Registers a running instance of an agentscope application.""" + + # Extract the input data from the request + data = request.json + run_id = data.get("run_id") + + # check if the run_id is already in the database + if _RunTable.query.filter_by(run_id=run_id).first(): + abort(400, f"RUN_ID {run_id} already exists") + + # Add into the database + _db.session.add( + _RunTable( + run_id=run_id, + project=data.get("project"), + name=data.get("name"), + timestamp=data.get("timestamp"), + run_dir=data.get("run_dir"), + pid=data.get("pid"), + status="running", + ), + ) + _db.session.commit() + + return jsonify(status="ok") + + +@_app.route("/api/servers/register", methods=["POST"]) +def _register_server() -> Response: + """ + Registers an agent server. + """ + data = request.json + server_id = data.get("server_id") + host = data.get("host") + port = data.get("port") + + if _ServerTable.query.filter_by(id=server_id).first(): + _app.logger.error(f"Server id {server_id} already exists.") + abort(400, f"run_id [{server_id}] already exists") + + _db.session.add( + _ServerTable( + id=server_id, + host=host, + port=port, + ), + ) + _db.session.commit() + + _app.logger.info(f"Register server id {server_id}") + return jsonify(status="ok") + + +@_app.route("/api/messages/push", methods=["POST"]) +def _push_message() -> Response: + """Receive a message from the agentscope application, and display it on + the web UI.""" + _app.logger.debug("Flask: receive push_message") + data = request.json + + run_id = data["run_id"] + name = data["name"] + role = data["role"] + content = data["content"] + metadata = data["metadata"] + timestamp = data["timestamp"] + url = data["url"] + + try: + new_message = _MessageTable( + run_id=run_id, + name=name, + role=role, + content=content, + # Before storing into the database, we need to convert the url into + # a string + meta=json.dumps(metadata), + url=json.dumps(url), + timestamp=timestamp, + ) + _db.session.add(new_message) + _db.session.commit() + except Exception as e: + abort(400, "Fail to put message with error: " + str(e)) + + data = { + "run_id": run_id, + "name": name, + "role": role, + "content": content, + "url": url, + "metadata": metadata, + "timestamp": timestamp, + } + + _socketio.emit( + "display_message", + data, + room=run_id, + ) + _app.logger.debug("Flask: send display_message") + return jsonify(status="ok") + + +@_app.route("/api/messages/run/", methods=["GET"]) +def _get_messages(run_id: str) -> Response: + """Get the history messages of specific run_id.""" + # From registered runtime instances + if len(_RunTable.query.filter_by(run_id=run_id).all()) > 0: + messages = _MessageTable.query.filter_by(run_id=run_id).all() + msgs = [ + { + "name": message.name, + "role": message.role, + "content": message.content, + "url": json.loads(message.url), + "metadata": json.loads(message.meta), + "timestamp": message.timestamp, + } + for message in messages + ] + return jsonify(msgs) + + # From the local file + run_dir = request.args.get("run_dir", default=None, type=str) + + # Search the run_dir from the registered runtime instances if not provided + if run_dir is None: + runtime_configs_from_dir = _get_all_runs_from_dir() + if run_id in runtime_configs_from_dir: + run_dir = runtime_configs_from_dir[run_id]["run_dir"] + + # Load the messages from the local file + path_messages = os.path.join(run_dir, "logging.chat") + if run_dir is None or not os.path.exists(path_messages): + return jsonify([]) + else: + with open(path_messages, "r", encoding="utf-8") as file: + msgs = [json.loads(_) for _ in file.readlines()] + return jsonify(msgs) + + +@_app.route("/api/runs/get/", methods=["GET"]) +def _get_run(run_id: str) -> Response: + """Get a specific run's detail.""" + run = _RunTable.query.filter_by(run_id=run_id).first() + if not run: + abort(400, f"run_id [{run_id}] not exists") + return jsonify( + { + "run_id": run.run_id, + "project": run.project, + "name": run.name, + "timestamp": run.timestamp, + "run_dir": run.run_dir, + "pid": run.pid, + "status": run.status, + }, + ) + + +@_app.route("/api/runs/all", methods=["GET"]) +def _get_all_runs() -> Response: + """Get all runs.""" + # Update the status of the registered runtimes + # Note: this is only for the applications running on the local machine + for run in _RunTable.query.filter( + _RunTable.status.in_(["running", "waiting"]), + ).all(): + if not _is_process_alive(run.pid, run.timestamp): + _RunTable.query.filter_by(run_id=run.run_id).update( + {"status": "finished"}, + ) + _db.session.commit() + + # From web connection + runtime_configs_from_register = { + _.run_id: { + "run_id": _.run_id, + "project": _.project, + "name": _.name, + "timestamp": _.timestamp, + "run_dir": _.run_dir, + "pid": _.pid, + "status": _.status, + } + for _ in _RunTable.query.all() + } + + # From directory + runtime_configs_from_dir = _get_all_runs_from_dir() + + # Remove duplicates between two sources + clean_runtimes = { + **runtime_configs_from_dir, + **runtime_configs_from_register, + } + + runs = list(clean_runtimes.values()) + + return jsonify(runs) + + +@_app.route("/api/invocation", methods=["GET"]) +def _get_invocations() -> Response: + """Get all API invocations in a run instance.""" + run_dir = request.args.get("run_dir") + path_invocations = os.path.join(run_dir, _DEFAULT_SUBDIR_INVOKE) + + invocations = [] + if os.path.exists(path_invocations): + for filename in os.listdir(path_invocations): + with open( + os.path.join(path_invocations, filename), + "r", + encoding="utf-8", + ) as file: + invocations.append(json.load(file)) + return jsonify(invocations) + + +@_app.route("/api/code", methods=["GET"]) +def _get_code() -> Response: + """Get the python code from the run directory.""" + run_dir = request.args.get("run_dir") + + dir_code = os.path.join(run_dir, _DEFAULT_SUBDIR_CODE) + + codes = {} + if os.path.exists(dir_code): + for filename in os.listdir(dir_code): + with open( + os.path.join(dir_code, filename), + "r", + encoding="utf-8", + ) as file: + codes[filename] = "".join(file.readlines()) + return jsonify(codes) + + +@_app.route("/api/file", methods=["GET"]) +def _get_file() -> Any: + """Get the local file via the url.""" + file_path = request.args.get("path", None) + + if file_path is not None: + try: + file = send_file(file_path) + return file + except FileNotFoundError: + return jsonify({"error": "File not found."}) + return jsonify({"error": "File not found."}) + + +@_app.route("/convert-to-py", methods=["POST"]) +def _convert_config_to_py() -> Response: + """ + Convert json config to python code and send back. + """ + content = request.json.get("data") + status, py_code = _convert_to_py(content) + return jsonify(py_code=py_code, is_success=status) + + +def _cleanup_process(proc: subprocess.Popen) -> None: + """Clean up the process for running application started by workstation.""" + proc.wait() + _app.logger.debug(f"The process with pid {proc.pid} is closed") + + +@_app.route("/convert-to-py-and-run", methods=["POST"]) +def _convert_config_to_py_and_run() -> Response: + """ + Convert json config to python code and run. + """ + content = request.json.get("data") + studio_url = request.url_root.rstrip("/") + run_id = _runtime.generate_new_runtime_id() + status, py_code = _convert_to_py( + content, + runtime_id=run_id, + studio_url=studio_url, + ) + + if status == "True": + try: + with tempfile.NamedTemporaryFile( + delete=False, + suffix=".py", + mode="w+t", + ) as tmp: + tmp.write(py_code) + tmp.flush() + proc = subprocess.Popen( # pylint: disable=R1732 + ["python", tmp.name], + ) + threading.Thread(target=_cleanup_process, args=(proc,)).start() + except Exception as e: + status, py_code = "False", _remove_file_paths( + f"Error: {e}\n\n" f"Traceback:\n" f"{traceback.format_exc()}", + ) + return jsonify(py_code=py_code, is_success=status, run_id=run_id) + + +@_app.route("/read-examples", methods=["POST"]) +def _read_examples() -> Response: + """ + Read tutorial examples from local file. + """ + lang = request.json.get("lang") + file_index = request.json.get("data") + + if not os.path.exists( + os.path.join( + _app.root_path, + "static", + "workstation_templates", + f"{lang}{file_index}.json", + ), + ): + lang = "en" + + with open( + os.path.join( + _app.root_path, + "static", + "workstation_templates", + f"{lang}{file_index}.json", + ), + "r", + encoding="utf-8", + ) as jf: + data = json.load(jf) + return jsonify(json=data) + + +@_app.route("/") +def _home() -> str: + """Render the home page.""" + return render_template("index.html") + + +@_socketio.on("request_user_input") +def _request_user_input(data: dict) -> None: + """Request user input""" + _app.logger.debug("Flask: receive request_user_input") + + run_id = data["run_id"] + agent_id = data["agent_id"] + + # Change the status into waiting + _db.session.query(_RunTable).filter_by(run_id=run_id).update( + {"status": "waiting"}, + ) + _db.session.commit() + + # Record into the queue + _UserInputRequestQueue.add_request(run_id, agent_id, data) + + # Ask for user input from the web ui + _socketio.emit( + "enable_user_input", + data, + room=run_id, + ) + + _app.logger.debug("Flask: send enable_user_input") + + +@_socketio.on("user_input_ready") +def _user_input_ready(data: dict) -> None: + """Get user input and send to the agent""" + _app.logger.debug(f"Flask: receive user_input_ready: {data}") + + run_id = data["run_id"] + agent_id = data["agent_id"] + content = data["content"] + url = data["url"] + + _db.session.query(_RunTable).filter_by(run_id=run_id).update( + {"status": "running"}, + ) + _db.session.commit() + + # Return to AgentScope application + _socketio.emit( + "fetch_user_input", + { + "agent_id": agent_id, + "name": data["name"], + "run_id": run_id, + "content": content, + "url": None if url in ["", []] else url, + }, + room=run_id, + ) + + # Close the request in the queue + _UserInputRequestQueue.close_a_request(run_id, agent_id) + + # Fetch a new user input request for this run_id if exists + new_request = _UserInputRequestQueue.fetch_a_request(run_id) + if new_request is not None: + _socketio.emit( + "enable_user_input", + new_request, + room=run_id, + ) + + _app.logger.debug("Flask: send fetch_user_input") + + +@_socketio.on("connect") +def _on_connect() -> None: + """Execute when a client is connected.""" + _app.logger.info("New client connected") + + +@_socketio.on("disconnect") +def _on_disconnect() -> None: + """Execute when a client is disconnected.""" + _app.logger.info("Client disconnected") + + +@_socketio.on("join") +def _on_join(data: dict) -> None: + """Join a websocket room""" + run_id = data["run_id"] + join_room(run_id) + + new_request = _UserInputRequestQueue.fetch_a_request(run_id) + if new_request is not None: + _socketio.emit( + "enable_user_input", + new_request, + room=run_id, + ) + + +@_socketio.on("leave") +def _on_leave(data: dict) -> None: + """Leave a websocket room""" + run_id = data["run_id"] + leave_room(run_id) + + +def init( + host: str = "127.0.0.1", + port: int = 5000, + run_dirs: Optional[Union[str, list[str]]] = None, + debug: bool = False, +) -> None: + """Start the AgentScope Studio web UI with the given configurations. + + Args: + host (str, optional): + The host of the web UI. Defaults to "127.0.0.1" + port (int, optional): + The port of the web UI. Defaults to 5000. + run_dirs (`Optional[Union[str, list[str]]]`, defaults to `None`): + The directories to search for the history of runtime instances. + debug (`bool`, optional): + Whether to enable the debug mode. Defaults to False. + """ + + # Set the history directories + if isinstance(run_dirs, str): + run_dirs = [run_dirs] + + global _RUNS_DIRS + _RUNS_DIRS = run_dirs + + # Create the cache directory + with _app.app_context(): + _db.create_all() + + if debug: + _app.logger.setLevel("DEBUG") + else: + _app.logger.setLevel("INFO") + + _socketio.run( + _app, + host=host, + port=port, + debug=debug, + allow_unsafe_werkzeug=True, + ) diff --git a/src/agentscope/studio/_client.py b/src/agentscope/studio/_client.py new file mode 100644 index 000000000..e62a98659 --- /dev/null +++ b/src/agentscope/studio/_client.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- +"""The client for AgentScope Studio.""" +from threading import Event +from typing import Optional, Union +import requests + +import socketio +from loguru import logger + +from agentscope.message import Msg + + +class _WebSocketClient: + """WebSocket Client of AgentScope Studio, only used to obtain + input messages from users.""" + + def __init__( + self, + studio_url: str, + run_id: str, + name: str, + agent_id: str, + ) -> None: + self.studio_url = studio_url + self.run_id = run_id + self.name = name + self.agent_id = agent_id + + self.user_input = None + self.sio = socketio.Client() + self.input_event = Event() + + @self.sio.event + def connect() -> None: + logger.debug("Establish a websocket connection with Studio.") + self.sio.emit( + "join", + {"run_id": self.run_id, "agent_id": self.agent_id}, + ) + + @self.sio.event + def disconnect() -> None: + logger.debug("Disconnected the websocket connection from Studio") + self.sio.emit( + "leave", + {"run_id": self.run_id, "agent_id": self.agent_id}, + ) + + @self.sio.on("fetch_user_input") + def on_fetch_user_input(data: dict) -> None: + self.user_input = data + self.input_event.set() + + self.sio.connect(f"{self.studio_url}") + + def get_user_input( + self, + require_url: bool, + required_keys: list[str], + ) -> Optional[dict]: + """Get user input from studio in real-time. + + Note: + Only agents that requires user inputs should call this function. + Calling this function will block the calling thread until the user + input is received. + """ + self.input_event.clear() + self.sio.emit( + "request_user_input", + { + "run_id": self.run_id, + "name": self.name, + "agent_id": self.agent_id, + "require_url": require_url, + "required_keys": required_keys, + }, + ) + self.input_event.wait() + return self.user_input + + def close(self) -> None: + """Close the websocket connection.""" + self.sio.disconnect() + + +class StudioClient: + """A client in AgentScope applications, used to register, push messages to + an AgentScope Studio backend, and obtain user inputs from the studio.""" + + active: bool = False + """Whether the client is active.""" + + studio_url: str + """The URL of the AgentScope Studio.""" + + runtime_id: str + + websocket_mapping: dict = {} + """A mapping of websocket clients to user agents.""" + + def initialize(self, runtime_id: str, studio_url: str) -> None: + """Initialize the client with the studio URL.""" + self.runtime_id = runtime_id + self.studio_url = studio_url + + def register_running_instance( + self, + project: str, + name: str, + timestamp: str, + run_dir: str, + pid: int, + ) -> None: + """Register a running instance to the AgentScope Studio.""" + url = f"{self.studio_url}/api/runs/register" + response = requests.post( + url, + json={ + "run_id": self.runtime_id, + "project": project, + "name": name, + "timestamp": timestamp, + "run_dir": run_dir, + "pid": pid, + }, + timeout=10, + ) + + if response.status_code == 200: + self.active = True + logger.info( + "Successfully registered to AgentScope Studio.\n" + "View your application at:\n" + "\n" + f" * {self.get_run_detail_page_url()}\n", + ) + else: + raise RuntimeError(f"Fail to register to studio: {response.text}") + + def push_message( + self, + message: Msg, + ) -> None: + """Push the message to the flask server (studio) for display. + + Args: + message (`Msg`): + The message to be pushed. + """ + send_url = f"{self.studio_url}/api/messages/push" + response = requests.post( + send_url, + json={ + "run_id": self.runtime_id, + "msg_id": message.id, + "name": message.name, + "role": message.role, + "content": str(message.content), + "timestamp": message.timestamp, + "metadata": message.metadata, + "url": message.url, + }, + timeout=10, + ) + + if response.status_code != 200: + logger.error(f"Fail to push message to studio: {response.text}") + + def get_user_input( + self, + agent_id: str, + name: str, + require_url: bool, + required_keys: Optional[Union[list[str], str]] = None, + ) -> dict: + """Get user input from the studio. + + Args: + agent_id (`str`): + The ID of the agent. + name (`str`): + The name of the agent. + require_url (`bool`): + Whether the input requires a URL. + required_keys (`Optional[Union[list[str], str]]`, defaults to + `None`): + The required keys for the input, which will be combined into a + dict in the content field. + + Returns: + `dict`: A dict with the user input and an url if required. + """ + + if agent_id not in self.websocket_mapping: + self.websocket_mapping[agent_id] = _WebSocketClient( + self.studio_url, + self.runtime_id, + name, + agent_id, + ) + + return self.websocket_mapping[agent_id].get_user_input( + require_url=require_url, + required_keys=required_keys, + ) + + def get_run_detail_page_url(self) -> str: + """Get the URL of the run detail page.""" + return f"{self.studio_url}/?run_id={self.runtime_id}" + + +_studio_client = StudioClient() diff --git a/src/agentscope/studio/static/css/base.css b/src/agentscope/studio/static/css/base.css new file mode 100644 index 000000000..98dc0b017 --- /dev/null +++ b/src/agentscope/studio/static/css/base.css @@ -0,0 +1,44 @@ +:root { + --tab-btn-icon-length: 20px; + + --body-bg: #ffffff; + + --main-color: #59AC80; + --main-color-light: #A0D9C4; + --main-color-light-light: #D1E9DC; + --main-color-very-light: #F3F9F1; + --main-color-dark: #3D7D5A; + --base-color: #F3F9F1; + + --border-color: #EBEBF0; + + /*Titlebar for each page*/ + --page-titlebar-height: 60px; + --page-content-height: calc(100% - var(--page-titlebar-height)); + + /*Navigation bar*/ + --page-sidebar-width: 250px; +} + +/*Text cannot be selected*/ +.unselectable-text { + -webkit-user-select: none; /* Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+/Edge */ + user-select: none; /* Standard */ +} + +a { + text-decoration: none; +} + +.page-titlebar { + display: flex; + width: 100%; + height: var(--page-titlebar-height); + flex-direction: row; + align-items: center; + border-bottom: 1px solid var(--border-color); + box-sizing: border-box; + padding: 0 20px; +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css/dashboard-detail-code.css b/src/agentscope/studio/static/css/dashboard-detail-code.css new file mode 100644 index 000000000..fb1e7c748 --- /dev/null +++ b/src/agentscope/studio/static/css/dashboard-detail-code.css @@ -0,0 +1,101 @@ +:root { + --code-list-width: 350px; + --code-content-width: calc(100% - var(--code-list-width)); +} + +#code-body { + display: flex; + flex-direction: row; + height: 100%; + width: 100%; +} + +#code-list { + display: flex; + flex-direction: column; + height: 100%; + width: var(--code-list-width); + box-sizing: border-box; + border: 0; +} + +#code-list ul { + display: block; + flex-direction: column; + align-items: flex-start; + justify-content: center; + width: 100%; + height: 35px; + box-sizing: border-box; + border-bottom: 1px solid var(--border-color); + padding: 5px; + margin: 0 0 3px 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#code-filename { + display: block; + flex-direction: column; + align-items: flex-start; + justify-content: center; + width: 100%; + height: 35px; + box-sizing: border-box; + border-bottom: 1px solid var(--border-color); + padding: 5px; + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#code-list li { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + width: 100%; + height: 35px; + padding: 3px 15px; + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + box-sizing: border-box; +} + +#code-list li:hover { + background-color: var(--main-color-light-light); + cursor: pointer; +} + +#code-list li.selected { + background-color: var(--main-color-light); +} + +#code-list ul:hover { + background-color: var(--main-color-light); + overflow: visible; + width: fit-content; + border-radius: 5px; + z-index: 10; +} + +#code-content { + display: flex; + flex-direction: column; + width: var(--code-content-width); + height: 100%; + box-sizing: border-box; + border: 1px solid var(--border-color); +} + +#code-editor { + display: flex; + width: 100%; + height: 100%; + overflow: auto; + white-space: pre; +} diff --git a/src/agentscope/studio/static/css/dashboard-detail-dialogue.css b/src/agentscope/studio/static/css/dashboard-detail-dialogue.css new file mode 100644 index 000000000..e7912f5b7 --- /dev/null +++ b/src/agentscope/studio/static/css/dashboard-detail-dialogue.css @@ -0,0 +1,484 @@ +:root { + --chat-bubble-border-radius: 5px; + + --chat-icon-width: 50px; + --chat-icon-height: 50px; + --chat-icon-horizontal-margin: 10px; + /*TODO: not used here*/ + --chat-icon-total-width: calc(var(--chat-icon-width) + var(--chat-icon-horizontal-margin) * 2); + + --chat-detail-width: 350px; + + /*Switch bar*/ + --chat-detail-switch-width: 50px; + --chat-detail-swtich-btn-length: 40px; + --chat-detail-switch-svg-length: 20px; + + --chat-panel-width: calc(100% - var(--chat-detail-width) - var(--chat-detail-switch-width)); + + /*Input area*/ + --chat-input-panel-height: 100px; + --chat-control-panel-height: 56px; + --chat-control-btn-margin-top: 6px; + + /*Delete button*/ + --chat-control-file-delete-length: 16px; + --chat-control-file-delete-position: -5px; + + /*List item*/ + --chat-control-file-item-length: calc(var(--chat-control-panel-height) - var(--chat-control-btn-margin-top)); + + /*Should be smaller than --chat-control-file-item-length--*/ + --chat-control-file-svg-length: 35px; + --chat-control-file-svg-margin: calc((var(--chat-control-file-item-length) - var(--chat-control-file-svg-length)) / 2); + + --chat-input-panel-font-size: 15px; +} + +#chat-body { + display: flex; + flex-direction: row; + width: 100%; + height: 100%; +} + +#chat-panel { + display: flex; + flex-direction: column; + width: var(--chat-panel-width); + height: 100%; + padding: 50px 50px; + box-sizing: border-box; +} + +#chat-detail { + display: flex; + flex-direction: column; + height: 100%; + max-height: 100%; + width: var(--chat-detail-width); + box-sizing: border-box; + border-left: 1px solid var(--border-color); + padding: 50px 20px; +} + +#chat-detail-switch { + display: flex; + flex-direction: column; + align-items: center; + height: 100%; + width: var(--chat-detail-switch-width); + box-sizing: border-box; + border-left: 1px solid var(--border-color); +} + +.chat-detail-switch-btn { + display: flex; + flex-direction: column; + width: var(--chat-detail-swtich-btn-length); + height: var(--chat-detail-swtich-btn-length); + align-items: center; + justify-content: center; + cursor: pointer; + box-sizing: border-box; + border-radius: 10px; + margin-top: 10px; + fill: #000000; +} + +.chat-detail-switch-btn svg { + display: flex; + width: var(--chat-detail-switch-svg-length); + height: var(--chat-detail-switch-svg-length); + align-items: center; + justify-content: center; +} + +.chat-detail-switch-btn:hover { + background-color: var(--main-color-light); + fill: var(--base-color); +} + +.chat-detail-switch-btn:active { + background-color: var(--main-color-dark); + fill: var(--base-color); +} + +.chat-detail-switch-btn.selected { + background-color: var(--main-color); + fill: var(--base-color); +} + +#dialogue-detail-content { + display: flex; + height: 100%; + width: 100%; + flex-direction: column; + max-height: 100%; + max-width: 100%; + box-sizing: border-box; + white-space: normal; + word-wrap: break-word; + overflow-wrap: break-word; +} + +#dialogue-info-title { + display: flex; + flex-direction: column; + justify-content: center; + font-weight: bold; + width: 100%; + height: 50px; + font-size: 18px; +} + +.dialogue-info-key { + display: flex; + width: 100%; + height: 30px; + align-items: center; + font-size: 15px; + font-weight: bold; +} + +.dialogue-info-value { + display: flex; + background-color: var(--border-color); + height: fit-content; + width: 100%; + max-width: 100%; + align-items: center; + padding: 5px 10px; + border-radius: 2px; + min-height: 33px; + box-sizing: border-box; + word-break: break-word; + overflow-wrap: break-word; + white-space: pre-wrap; +} + +.dialogue-info-row { + display: flex; + flex-direction: column; + width: 100%; + height: fit-content; + margin: 5px 0; +} + +#chat-box { + display: flex; + box-sizing: border-box; + flex-direction: column; + width: 100%; + flex-grow: 1; + margin-bottom: 50px; + max-height: 100%; + border: 1px solid var(--border-color); + border-radius: 8px; +} + +#chat-box-content { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + max-height: 100%; +} + +.chat-row { + display: flex; + flex-direction: row; + box-sizing: border-box; + width: 100%; + height: fit-content; + padding: 10px 0; +} + +.chat-row:hover { + background-color: var(--main-color-very-light); +} + +.user.chat-row { + justify-content: flex-end; +} + +.text-right-align { + text-align: right; +} + +.chat-icon { + display: flex; + justify-content: center; + box-sizing: border-box; + width: var(--chat-icon-width); + height: var(--chat-icon-height); + border-radius: 5px; + margin: 0 var(--chat-icon-horizontal-margin); + padding: 10px; + background-color: var(--main-color); + fill: #ffffff; +} + +.chat-content { + display: flex; + flex-direction: column; + width: calc(100% - 140px); + /*TODO: for test*/ + box-sizing: border-box; +} + +.user.chat-content { + align-items: flex-end; +} + +.chat-name { + display: flex; + margin-bottom: 5px; +} + +.chat-bubble { + display: flex; + flex-direction: column; + border: 1px solid var(--main-color-light); + background-color: #ffffff; + flex-grow: 1; + box-sizing: border-box; + padding: 10px; + width: fit-content; + max-width: 100%; + min-width: 100px; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.user.chat-bubble { + border-radius: var(--chat-bubble-border-radius) 0 var(--chat-bubble-border-radius) var(--chat-bubble-border-radius); + white-space: pre-wrap; +} + +.other.chat-bubble { + border-radius: 0 var(--chat-bubble-border-radius) var(--chat-bubble-border-radius) var(--chat-bubble-border-radius); +} + +.chat-bubble p { + display: inline; + flex-direction: row; + align-items: center; + margin: 0; +} + +.chat-bubble-multimodal-item { + display: flex; + max-height: 200px; + max-width: 100%; + width: auto; + height: auto; + min-height: 50px; + min-width: 50px; + margin-top: 5px; +} + +#chat-input { + display: flex; + height: fit-content; + width: 100%; + box-sizing: border-box; + border: 1px solid var(--border-color); + border-radius: 8px; + flex-direction: column; + padding: 10px; +} + +#chat-input:focus { + border-color: var(--main-color); +} + +#chat-input-name { + display: flex; + flex-direction: column; + width: fit-content; + max-width: 100px; + height: fit-content; + margin-right: 5px; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 2px; + font-size: var(--chat-input-panel-font-size); +} + +#chat-input-textarea { + display: flex; + flex-grow: 1; + height: 100%; + resize: none; + box-sizing: border-box; + padding: 2px; + font-size: var(--chat-input-panel-font-size); + font-family: source-sans, sans-serif; + + /*remove border*/ + border-color: transparent; + border-width: 0; + outline: none; +} + +#chat-control-panel { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + height: var(--chat-control-panel-height); + width: 100%; + box-sizing: border-box; +} + +#chat-control-url-btn svg { + display: flex; + height: 20px; + width: 20px; + align-items: center; + justify-content: center; +} + +#chat-input-panel { + display: flex; + width: 100%; + height: var(--chat-input-panel-height); + flex-direction: row; +} + +.chat-control-btn { + display: flex; + flex-direction: row; + align-items: center; + height: calc(100% - var(--chat-control-btn-margin-top)); + border-radius: 5px; + padding: 0 15px; + border: none; + font-size: 15px; + cursor: pointer; + background-color: var(--main-color-light-light); + color: var(--main-color-dark); + fill: var(--main-color-dark); + margin-top: var(--chat-control-btn-margin-top); +} + +.chat-control-btn:disabled, .chat-control-btn:disabled:hover, .chat-control-btn:disabled:active { + background-color: var(--border-color); + color: var(--base-color); + fill: var(--base-color); + cursor: not-allowed; +} + +#chat-control-url-btn { + width: fit-content; + margin-left: 10px; +} + +#chat-control-send-btn { + width: fit-content; + margin-left: 10px; +} + +#chat-control-file-list { + display: flex; + flex-direction: row; + align-items: flex-end; + height: 100%; + flex-grow: 1; + padding: 0 15px; + border: none; + font-size: 15px; + overflow-x: auto; +} + +.chat-control-file-item { + position: relative; + display: inline-block; + border-radius: 5px; + align-items: center; + justify-content: center; + height: var(--chat-control-file-item-length); + width: var(--chat-control-file-item-length); + margin: 0 5px; + vertical-align: center; + text-align: center; +} + +.chat-control-file-item:hover { + background-color: var(--main-color-light); +} + +.chat-control-file-delete { + position: absolute; + top: var(--chat-control-file-delete-position); + right: var(--chat-control-file-delete-position); + height: var(--chat-control-file-delete-length); + width: var(--chat-control-file-delete-length); + background-color: white; + fill: var(--main-color-dark); + border: 2px solid var(--main-color-dark); + border-radius: 50%; + cursor: pointer; + box-sizing: border-box; + display: none; +} + +.chat-control-file-delete > svg { + display: flex; + width: calc(var(--chat-control-file-delete-length) - 4px); + height: calc(var(--chat-control-file-delete-length) - 4px); +} + +.chat-control-file-item:hover .chat-control-file-delete { + display: block; +} + +.chat-control-file-item > svg { + display: block; + margin: var(--chat-control-file-svg-margin); + height: var(--chat-control-file-svg-length); + width: var(--chat-control-file-svg-length); +} + +.chat-control-btn:hover { + background-color: var(--main-color); + color: var(--base-color); + fill: var(--base-color); +} + +.chat-control-btn:active { + background-color: var(--main-color-dark); + color: var(--base-color); + fill: var(--base-color); +} + +.chat-control-send-btn-svg { + display: flex; + width: 20px; + height: 25px; + margin-left: 5px; +} + +#hidden-file-input { + display: none; +} + +#agentSwitchBtn { + display: none; +} + +.chat-bubble pre code { + white-space: pre-wrap; + word-wrap: break-word; +} + +#chat-box-content .clusterize-no-data { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + width: 100%; + color: var(--main-color-light); +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css/dashboard-detail-invocation.css b/src/agentscope/studio/static/css/dashboard-detail-invocation.css new file mode 100644 index 000000000..6a7f1782e --- /dev/null +++ b/src/agentscope/studio/static/css/dashboard-detail-invocation.css @@ -0,0 +1,44 @@ +#invocation-body { + display: flex; + flex-direction: row; + align-items: flex-end; + height: 100%; + width: 100%; +} + +#invocation-list { + display: flex; + flex-direction: column; + height: 100%; + width: 350px; + box-sizing: border-box; + border: 0; + background-color: #ffffff; +} + +#invocation-content { + display: flex; + flex-direction: column; + width: calc(100% - 350px); + height: 100%; + box-sizing: border-box; + border-left: 1px solid var(--border-color); +} + +#invocation-content .monaco-editor { + display: flex; + height: 100%; + width: 100%; + flex-grow: 1; + min-width: 100%; +} + +.content-placeholder { + display: flex; + color: var(--main-color-light-light); + width: 100%; + height: 100%; + align-items: center; + justify-content: center; + font-size: 18px; +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css/dashboard-detail.css b/src/agentscope/studio/static/css/dashboard-detail.css new file mode 100644 index 000000000..7681cfd14 --- /dev/null +++ b/src/agentscope/studio/static/css/dashboard-detail.css @@ -0,0 +1,82 @@ +:root { + --detail-sidebar-padding-vertical: 5px; + --detail-content-width: calc(100% - var(--page-sidebar-width)); +} + +#detail-body { + display: flex; + flex-direction: row; + height: 100%; + width: 100%; +} + +#detail-sidebar { + display: flex; + box-sizing: border-box; + height: 100%; + flex-direction: column; + width: var(--page-sidebar-width); + background-color: #ffffff; + + border-right-color: var(--border-color); + border-right-width: 1px; + border-right-style: solid; + padding: var(--detail-sidebar-padding-vertical) 0; +} + +.detail-sidebar-tabs { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + padding: 45px 10px; + box-sizing: border-box; +} + +.detail-sidebar-tab { + display: flex; + flex-direction: row; + height: var(--navigation-bar-item-height); + width: 100%; + box-sizing: border-box; + align-items: center; + border-radius: 10px; + padding-left: 20px; + margin: 5px 0; + cursor: pointer; +} + +.detail-sidebar-tab:hover { + background-color: var(--main-color-light); + fill: var(--base-color); + color: var(--base-color); +} + +.detail-sidebar-tab:active { + background-color: var(--main-color-dark); + fill: var(--base-color); + color: var(--base-color); +} + +.detail-sidebar-tab.selected { + background-color: var(--main-color); + fill: var(--base-color); + color: var(--base-color); +} + +.detail-sidebar-tab-svg { + display: flex; + width: var(--tab-btn-icon-length); + height: var(--tab-btn-icon-length); + margin-right: 10px; +} + +#detail-content { + display: flex; + background-color: #ffffff; + flex-direction: row; + height: 100%; + width: var(--detail-content-width); +} + + diff --git a/src/agentscope/studio/static/css/dashboard-runs.css b/src/agentscope/studio/static/css/dashboard-runs.css new file mode 100644 index 000000000..73e7712dd --- /dev/null +++ b/src/agentscope/studio/static/css/dashboard-runs.css @@ -0,0 +1,124 @@ +:root { + --runs-content-padding-vertical: 50px; + --runs-content-padding-horizontal: 80px; + --runs-content-control-panel-height: 55px; + --runs-search-input-height: 35px; + --runs-table-height: calc(100% - var(--runs-content-control-panel-height)); +} + +#runs-content { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + padding: var(--runs-content-padding-vertical) var(--runs-content-padding-horizontal); + box-sizing: border-box; +} + +#runs-control-panel { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + height: var(--runs-content-control-panel-height); + width: 100%; +} + +#runs-table { + flex-grow: 1; + overflow-y: auto; + width: 100%; + height: var(--runs-table-height); + max-height: var(--runs-table-height); + background-color: #ffffff; + border: 1px solid var(--border-color); +} + +#runs-search-input { + display: flex; + height: var(--runs-search-input-height); + flex-grow: 1; + align-items: center; + border: 1px solid var(--border-color); + padding: 0 10px; +} + +#runs-search-input:focus { + border-color: var(--main-color); + outline: none; /* 移除默认的焦点轮廓样式 */ +} + +/* Remove border from tabulator */ +.tabulator .tabulator-cell, +.tabulator .tabulator-col, +.tabulator .tabulator-header .tabulator-col { + border: none !important; +} + +.tabulator .tabulator-cell { + height: 45px; +} + +/* Remove the bottom border from table header */ +.tabulator .tabulator-header { + border-bottom: none !important; +} + +.tabulator-col-sorter-element.tabulator-sortable.tabulator-col { + background-color: var(--main-color-light); + color: var(--main-color-dark); +} + +/* Set the same color for all rows */ +/*.tabulator .tabulator-row {*/ +/* background-color: #FFF !important; !* Replace by your color *!*/ +/*}*/ + +/* or, you just want to remove the alternative background color and keep the basic background */ +/*.tabulator .tabulator-row:nth-child(even) {*/ +/* background-color: var(--main-color-light-light) !important; !* Causes even row background colors to inherit the default or specified row background colors *!*/ +/*}*/ + +.runs-table-status-tag { + display: flex; + flex-direction: row; + align-items: center; + height: 26px; + width: fit-content; + border-radius: 13px; + color: var(--base-color); + box-sizing: border-box; + margin: 0 5px; + padding: 0 14px; +} + +.running.runs-table-status-tag { + background-color: #d1e7fa; + color: #58c1ef; + fill: #58c1ef; +} + +.finished.runs-table-status-tag { + background-color: var(--main-color-light); + color: var(--main-color-dark); + fill: var(--main-color-dark); +} + +.waiting.runs-table-status-tag { + background-color: #f8efba; + color: #f6b93b; + fill: #f6b93b; +} + +.unknown.runs-table-status-tag { + background-color: #e1e1e1; + color: #3d4047; + fill: #3d4047; +} + +.runs-table-status-svg { + display: flex; + width: 15px; + height: 15px; + margin-right: 7px; +} diff --git a/src/agentscope/studio/static/css/dashboard.css b/src/agentscope/studio/static/css/dashboard.css new file mode 100644 index 000000000..d5e71c3c7 --- /dev/null +++ b/src/agentscope/studio/static/css/dashboard.css @@ -0,0 +1,37 @@ +#dashboard-panel { + display: flex; + height: 100%; + width: 100%; + flex-direction: column; +} + +.dashboard-titlebar-span { + display: flex; + height: 50px; + width: fit-content; + align-items: center; + cursor: pointer; +} + +.dashboard-subtitlebar-span { + display: flex; + height: 50px; + width: fit-content; + align-items: center; +} + +.dashboard-titlebar-svg { + display: flex; + width: 15px; + height: 15px; + align-items: center; + justify-content: center; + margin: 0 10px; +} + +#dashboard-content { + display: flex; + height: var(--page-content-height); + width: 100%; + flex-direction: row; +} \ No newline at end of file diff --git a/src/agentscope/web/static/css/fonts.css b/src/agentscope/studio/static/css/font.css similarity index 53% rename from src/agentscope/web/static/css/fonts.css rename to src/agentscope/studio/static/css/font.css index 6b354d5a0..5b151527f 100644 --- a/src/agentscope/web/static/css/fonts.css +++ b/src/agentscope/studio/static/css/font.css @@ -4,6 +4,6 @@ } @font-face { - font-family: 'oswald'; - src: url('/static/fonts/OSWALD.ttf') format('truetype'); + font-family: 'source-sans'; + src: url('/static/fonts/SourceSans3-Regular.ttf') format('truetype'); } \ No newline at end of file diff --git a/src/agentscope/studio/static/css/index.css b/src/agentscope/studio/static/css/index.css new file mode 100644 index 000000000..cc2e2e29e --- /dev/null +++ b/src/agentscope/studio/static/css/index.css @@ -0,0 +1,222 @@ +:root { + --navigation-bar-background-color: #ffffff; + --logo-font-color: #000000; + --tab-font-color: #000000; + + --navigation-bar-width: 240px; + --content-width: calc(100% - var(--navigation-bar-width)); + + /*To ensure the collapsed navigation bar fit the icon*/ + --navigation-bar-item-icon-length: var(--tab-btn-icon-length); + --navigation-bar-item-icon-margin: 10px; + --navigation-bar-item-padding: 10px; + --navigation-bar-width-collapsed: calc(var(--navigation-bar-item-icon-length) + 2 * var(--navigation-bar-item-icon-margin) + 2 * var(--navigation-bar-item-padding)); + --navigation-bar-item-height: calc(var(--navigation-bar-item-icon-length) + 2 * var(--navigation-bar-item-icon-margin)) +} + +html { + height: 100%; /* Fill the entire screen height */ + width: 100%; /* Fill the entire screen width */ + margin: 0; /* Eliminate default html margin */ + padding: 0; +} + +body { + display: flex; /* Allows body to be a flex container */ + height: 100%; /* Fill the entire screen height */ + width: 100%; /* Fill the entire screen width */ + margin: 0; /* Eliminate default body margin */ + flex-direction: row; + padding: 0; + background: var(--body-bg); + font-family: source-sans, sans-serif; + box-sizing: border-box; +} + +#workstation-iframe { + display: flex; + width: 100%; + height: 100%; + border: 0; +} + +#navigation-bar { + display: flex; + flex-direction: column; + width: var(--navigation-bar-width); + height: 100%; + justify-content: space-between; + align-items: center; + padding: 50px 0 50px 0; + box-sizing: border-box; + background-color: var(--navigation-bar-background-color); + border-right: 1px solid var(--border-color); + + /*Animation*/ + transition: width 0.5s; +} + +#navigation-bar.collapsed { + width: var(--navigation-bar-width-collapsed); +} + +.navigation-bar-item-label { + display: flex; + white-space: nowrap; +} + +#navigation-bar.collapsed .navigation-bar-item-label { + display: none; +} + +#content { + display: flex; + box-sizing: border-box; + width: var(--content-width); + height: 100%; + flex-grow: 1; +} + +#guide { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + box-sizing: border-box; + padding: 50px +} + +.guide-block { + display: flex; + flex-direction: column; + height: 150px; + width: 500px; + min-width: 200px; + background-color: var(--main-color); + border-radius: 10px; + justify-content: flex-end; + padding: 25px; + color: #ffffff; + cursor: pointer; +} + +/*when guide-block and right are all in class*/ +.guide-block.left { + margin-right: 10px; +} + +.guide-block.right { + margin-left: 10px; +} + +.guide-entry { + display: flex; + flex-direction: row; + justify-content: space-around; + width: 100%; + height: fit-content; + margin: 25px 0; +} + +.empty.guide-block { + background-color: #ffffff; +} + +.guide-block-title { + display: flex; + height: fit-content; + width: 100%; + justify-content: flex-start; + align-items: center; + font-size: 25px; + font-weight: bold; +} + +.guide-block-detail { + display: flex; + height: fit-content; + width: 100%; + justify-content: flex-start; + align-items: center; + font-size: 15px; +} + +#navigation-bar-logo { + font-family: 'krypton', sans-serif; + font-size: 20px; + color: var(--logo-font-color); + white-space: nowrap; +} + +#navigation-bar.collapsed .navigation-bar-logo-text { + display: none; +} + +.navigation-bar-items { + display: flex; + justify-content: center; + flex-grow: 1; /* 使得 .navigation-bar-items 占据可用空间 */ + width: 100%; + flex-direction: column; + + padding: var(--navigation-bar-item-padding); + box-sizing: border-box; +} + +.navigation-bar-item { + display: flex; + flex-direction: row; + align-items: center; + background-color: var(--navigation-bar-background-color); + width: 100%; + height: var(--navigation-bar-item-height); + border-radius: 10px; + color: var(--tab-font-color); + box-sizing: border-box; + margin: 5px 0; + cursor: pointer; +} + +.navigation-bar-item:hover { + background-color: var(--main-color-light); + fill: var(--base-color); + color: var(--base-color); +} + +.navigation-bar-item:active { + background-color: var(--main-color-dark); + fill: var(--base-color); + color: var(--base-color); +} + +.navigation-bar-item.selected { + background-color: var(--main-color); + fill: var(--base-color); + color: var(--base-color); +} + +.navigation-bar-item-icon { + display: flex; + width: var(--navigation-bar-item-icon-length); + height: var(--navigation-bar-item-icon-length); + margin: 0 var(--navigation-bar-item-icon-margin); + min-height: var(--navigation-bar-item-icon-length); + min-width: var(--navigation-bar-item-icon-length); +} + +.navigation-bar-hr { + display: flex; + height: 1px; + background-color: var(--border-color); + border: none; + margin: 10px 0; +} + +.coming-soon-hint { + display: flex; + height: 100%; + width: 100%; + justify-content: center; + align-items: center; + color: var(--main-color-light); +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css/workstation-drag-components.css b/src/agentscope/studio/static/css/workstation-drag-components.css new file mode 100644 index 000000000..086a7bbc9 --- /dev/null +++ b/src/agentscope/studio/static/css/workstation-drag-components.css @@ -0,0 +1,153 @@ +.title-box { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + height: 50px; + box-sizing: border-box; + border-radius: 5px; + background: var(--background-box-title); + padding: 0 10px; +} + +.drawflow-node.selected .title-box { + background-color: #ffffff; +} + +.title-box-left-items { + display: flex; + flex-direction: row; + align-items: center; + overflow-x: auto; + height: 100%; +} + +.title-box-svg { + display: flex; + align-items: center; + justify-content: center; + height: 25px; + width: 25px; + background-color: var(--main-color); + border-radius: 5px; + fill: #ffffff; + margin-right: 8px; +} + +/*TODO: 没有生效*/ +.drawflow-node.selected input, .drawflow-node.selected textarea { + border: 1px solid var(--main-color-light); +} + +.drawflow-node.selected input:focus, .drawflow-node.selected textarea:focus { + outline: 1px solid var(--main-color); +} + +.drawflow > .drawflow-delete { + border: 2px solid #43b993; + background: white; + color: #43b993; + -webkit-box-shadow: 0 2px 20px 2px #43b993; + box-shadow: 0 2px 20px 2px #43b993; +} + +.toggle-arrow { + display: flex; + height: 10px; + width: 10px; + margin-right: 5px; + transform: translateY(-50%); + cursor: pointer; + box-sizing: border-box; +} + +.box { + display: flex; + flex-direction: column; + font-size: 14px; + margin-top: 10px; + height: fit-content; +} + +.box.hidden { + display: none; +} + +.box input, .box select, .box textarea { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 100%; + height: 40px; + min-height: 40px; + padding: 0 10px; + border: 1px solid var(--border-color); + border-radius: 5px; +} + +.box label { + display: flex; + flex-direction: row; + align-items: center; + margin-top: 5px; + margin-bottom: 5px; +} + +.box a { + target: "_blank"; +} + +.readme { + display: flex; + flex-direction: column; + background-color: #ADD8E6; + font-size: 14px; + border: 1px solid #ddd; + border-radius: 5px; + width: 100%; + height: fit-content; + box-sizing: border-box; + padding: 10px; +} + +.drawflow-node .box-highlight { + padding: 10px 20px 20px 20px; + color: #555555; + font-size: 16px; + background-color: rgba(173, 216, 230, 0.5); + overflow: auto; +} + +.drawflow-node.welcome { + width: 250px; + min-width: 250px; +} + +.drawflow .connection .point { + stroke: var(--border-color); + stroke-width: 2; + fill: white; +} + +.drawflow .connection .point.selected, .drawflow .connection .point:hover { + fill: #4ea9ff; +} + +.drawflow .drawflow-node.GROUP { + width: 500px; + z-index: 0; +} + +.placeholder { + height: 300px; + z-index: 0; +} + +.drawflow .drawflow-node.GROUP.hover-drop { + background: hsl(225, 100%, 96%); +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css/workstation.css b/src/agentscope/studio/static/css/workstation.css new file mode 100644 index 000000000..9ad7ac91a --- /dev/null +++ b/src/agentscope/studio/static/css/workstation.css @@ -0,0 +1,842 @@ +:root { + --background-color: #ffffff; + --background-box-title: #f7f7f7; + --scale-factor: 2; + + --menu-height: 48px; + --menu-btn-height: 35px; + --menu-btn-width: 50px; + + --drawflow-height: calc(100% - var(--menu-height)); + + --workstation-sidebar-item-font-size: 18px; + --workstation-sidebar-subitem-font-size: 15px; +} + +html { + height: 100%; /* Fill the entire screen height */ + width: 100%; /* Fill the entire screen width */ + margin: 0; /* Eliminate default html margin */ + padding: 0; +} + +body { + display: flex; /* Allows body to be a flex container */ + height: 100%; /* Fill the entire screen height */ + width: 100%; /* Fill the entire screen width */ + margin: 0; /* Eliminate default body margin */ + flex-direction: row; + padding: 0; + background: var(--body-bg); + font-family: sans-serif; + box-sizing: border-box; +} + +#workstation-panel { + display: flex; + height: 100%; + width: 100%; + flex-direction: column; +} + +.them-edit-link { + position: absolute; + top: 10px; + right: 100px; + color: black; + font-size: 40px; +} + +.them-edit-link a { + text-decoration: none; +} + +.wrapper { + display: flex; + flex-direction: row; + width: 100%; + box-sizing: border-box; + height: var(--page-content-height); +} + +.col { + display: flex; + flex-direction: column; + width: var(--page-sidebar-width); + min-width: var(--page-sidebar-width); + max-width: var(--page-sidebar-width); + box-sizing: border-box; + height: 100%; + border-right: 1px solid var(--border-color); + padding: 50px 10px; + overflow-y: auto; +} + +.col ul { + margin: 0; +} + +.col ul { + padding-left: 0; +} + +.col ul, li { + list-style-type: none; +} + +.col-right { + display: flex; + flex-direction: column; + width: calc(100% - var(--page-sidebar-width)); + height: 100%; +} + +.menu { + display: flex; + flex-direction: row; + height: var(--menu-height); + width: 100%; + box-sizing: border-box; + align-items: center; +} + +.menu-btn { + display: flex; + height: var(--menu-btn-height); + width: var(--menu-btn-width); + white-space: nowrap; + align-items: center; + justify-content: center; + background-color: var(--main-color-light); + border-radius: 10px; + margin: 0 5px; + cursor: pointer; +} + +.menu-btn:hover { + background-color: var(--main-color); + fill: #ffffff; +} + +.menu-btn:active { + background-color: var(--main-color-dark); + fill: #ffffff; +} + +.menu-btn-svg { + display: flex; + width: 20px; + height: 20px; +} + +.menu-btn:hover .tooltip { + display: flex; + flex-direction: column; + align-items: center; + height: fit-content; + width: fit-content; + padding: 10px; + background-color: var(--main-color-light); +} + +.btn-cover { + position: relative; + cursor: not-allowed; + background: transparent; + z-index: 15000; + margin-left: 10px; +} + +.btn-cover::after { + content: attr(data-title); + pointer-events: none; + visibility: hidden; + opacity: 0; + transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out; + + position: absolute; + left: 50%; + top: 100%; + transform: translateX(-50%); + white-space: normal; + max-width: 200px; + text-align: center; + word-wrap: break-word; + background-color: #000; + color: #fff; + padding: 1px 1px; + border-radius: 3px; + font-size: 0.75rem; + z-index: 15000; + + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + margin-top: 8px; + min-width: 100px; +} + +.btn-cover[data-title]:hover::after { + visibility: visible; + opacity: 1; + min-width: 100px; +} + +.btn-cover:hover + .btn-disabled:hover::after { + visibility: visible; + opacity: 1; +} + +.btn-disabled { + pointer-events: none; + opacity: 0.6; + background-color: #ccc; + color: #666; + border: 1px solid #999; +} + +.btn-enabled + .btn-cover { + display: block; +} + +.swal-wide { + width: 80% !important; +} + +.control-bar { + display: flex; + flex-direction: row; + float: right; + position: absolute; + bottom: 10px; + right: 10px; + padding: 5px 10px; +} + +.lock-btn{ + display: flex; + align-items: center; + justify-content: center; + padding: 5px; + background: #555555; + border-radius: 4px; + z-index: 10000; + margin-right: 10px; + height: fit-content; + width: fit-content; +} + +.zoom-bar { + display: flex; + float: right; + bottom: 10px; + right: 10px; + padding: 5px 10px; + background: #555555; + border-radius: 4px; + z-index: 10000; +} + +.control-bar svg { + display: flex; + height: 25px; + width: 25px; + justify-content: center; + align-items: center; + fill: white; + margin: 5px; +} + +.zoom-bar svg:nth-child(1) { + padding-left: 0px; +} + +#drawflow { + display: flex; + width: 100%; + height: var(--drawflow-height); + top: 40px; + background: var(--background-color); + background-size: 25px 25px; + background-image: linear-gradient(to right, #f1f1f1 1px, transparent 1px), + linear-gradient(to bottom, #f1f1f1 1px, transparent 1px); +} + +@media only screen and (max-width: 768px) { + .col { + width: 50px; + } + + .col .workstation-sidebar-dragitem span { + display: none; + } + + #drawflow { + width: calc(100vw - 51px); + } +} + +/* Modal */ +.modal { + display: none; + position: fixed; + z-index: 10000; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + overflow: auto; + background-color: rgb(0, 0, 0); + background-color: rgba(0, 0, 0, 0.7); + +} + +.modal-content { + position: relative; + background-color: #fefefe; + margin: 15% auto; + padding: 20px; + border: 1px solid #888; + width: 400px; +} + +.modal .close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; + cursor: pointer; +} + +@media only screen and (max-width: 768px) { + .modal-content { + width: 80%; + } +} + +.workstation-sidebar-item { + display: flex; + flex-direction: column; + justify-content: center; + cursor: pointer; + font-size: var(--workstation-sidebar-item-font-size); + font-weight: bold; + box-sizing: border-box; + width: 100%; + height: 45px; + border-radius: 10px; + padding: 0 10px; +} + +.workstation-sidebar-subitem { + display: flex; + flex-direction: row; + align-items: center; + cursor: pointer; + font-size: var(--workstation-sidebar-subitem-font-size); + box-sizing: border-box; + width: 100%; + height: 40px; + border-radius: 10px; + padding: 0 10px; + font-weight: bold; + color: #808080; +} + +.workstation-sidebar-subitem:hover { + background-color: var(--main-color-light); + color: #ffffff; +} + +.workstation-sidebar-placeholder { + display: flex; + height: 20px; + width: 100%; +} + +.workstation-sidebar-sub-content { + display: none; +} + +.active + .workstation-sidebar-sub-content { + display: block; +} + +.workstation-sidebar-dragitem { + display: flex; + flex-direction: column; + justify-content: center; + font-size: var(--workstation-sidebar-subitem-font-size); + box-sizing: border-box; + width: calc(100% - 10px); + cursor: move; + height: 40px; + border-radius: 10px; + padding: 0 10px; + margin-left: 10px; +} + +.workstation-sidebar-dragitem:hover { + background-color: var(--main-color-light); + color: #ffffff; +} + +.workstation-sidebar-subitem-arrow { + display: flex; + height: 10px; + width: 10px; + align-items: center; + justify-content: center; + fill: #000; + margin-right: 5px; +} + +.highlighted-tab { + cursor: pointer; + color: #ffffff; + background-color: rgba(255, 167, 38, 0.8); + user-select: none; + transition: background-color 0.3s ease; + text-align: center; +} + +.highlighted-tab:hover { + background-color: rgba(251, 140, 0, 0.9); +} + +.toggle-sub-title { + cursor: pointer; + background-color: var(--main-color-light); + padding: 10px; + margin-top: 0; + margin-bottom: 0; + user-select: none; + transition: background-color 0.3s ease; + text-align: center; + border-radius: 10px; + flex-grow: 1; +} + +.toggle-sub-title:hover { + background-color: #e2e2e2; +} + +.draggable-content { + display: flex; + flex-direction: column; + max-height: 0; + opacity: 0; + overflow: auto; + transition: max-height 0.3s ease, opacity 0.3s ease, padding 0.3s ease, margin 0.3s ease; +} + +.draggable-content.visible { + margin-top: 5px; + padding: 10px; + height: fit-content; + opacity: 1; +} + +pre[class*="language-"] { + font-size: 0.5em; + max-height: 60vh; + overflow: auto; + margin: 1rem 0; +} + +.swal2-title { + font-size: 20px; +} + +.resize-handle-se { + position: absolute; + width: 18px; + height: 18px; + bottom: 0; + fill: var(--border-color); + right: 0; + cursor: nwse-resize; + z-index: 10; +} + +.drawflow .drawflow-node.selected .resize-handle-se { + fill: var(--main-color-light); +} + +.if-placeholder, .else-placeholder { + border: 1px dashed #ccc; + height: 30%; + margin: 5px; +} + +.cases-container { + margin-top: 10px; + min-height: 50px; +} + +.case-placeholder { + border: 1px dashed #ccc; + height: 100px; + padding: 5px; + margin-bottom: 5px; +} + +.case-placeholder:last-child { + height: 100px; + border-bottom: 1px dashed #ccc; +} + +.button { + display: inline-block; + padding: 6px 12px; + margin: 5px; + font-size: 10px; + font-weight: bold; + color: #ffffff; + background-image: linear-gradient(to right, #6e48aa, #9d50bb); + border: 2px solid transparent; + border-radius: 30px; + cursor: pointer; + text-align: center; + text-decoration: none; + transition: all 0.3s ease; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.button:hover { + background-image: linear-gradient(to left, #6e48aa, #9d50bb); + box-shadow: 0 8px 15px rgba(0, 0, 0, 0.2); + transform: translateY(-2px); +} + +.add-case { + background-image: linear-gradient(to right, #56ab2f, #a8e063); +} + +.remove-case { + background-image: linear-gradient(to right, #f85032, #e73827); +} + +.button:disabled, +.button:disabled:hover, +.button:disabled:active { + background-color: #cccccc; + color: #666666; + cursor: not-allowed; + box-shadow: none; + border: 2px solid #cccccc; +} + +.code-snippet { + display: inline; + margin-bottom: 4px; + line-height: 1.4; + padding: 2px 4px; + background-color: #f0f0f0; + font-family: 'Courier New', monospace; + border-radius: 3px; + border: 1px solid #eee; + color: #d63384; +} + +.iframe-container { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 20000; + background: rgba(0, 0, 0, 0.5); + justify-content: center; + align-items: center; +} + +.copilot-iframe { + width: 100%; + height: 100%; + border: 1px solid #ddd; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + transition: all 0.3s; + background: #ffffff; + border-radius: 10px; +} + +#close-iframe { + position: absolute; + top: 10px; + right: 10px; + padding: 5px 10px; + border: none; + background: rgba(0, 123, 255, 0.4); + color: white; + cursor: pointer; + border-radius: 0 0 0 5px; + font-size: 16px; + z-index: 10000; +} + + +#iframe-wrapper { + position: relative; + width: 90%; + height: 90%; +} + +#close-iframe .fas { + pointer-events: none; +} + +.tools-placeholder { + border: 2px dashed #ccc; + padding: 30px; + text-align: center; + margin-top: 10px; + color: #888; +} + +.swal2-container { + z-index: 20000 !important; +} + +.modules-info { + background-color: rgba(128, 128, 128, 0.2); + padding: 2px; + margin-bottom: 10px; +} + +.modules-info h4 { + margin: 0 0 10px 0; + font-size: 18px; + color: #444; +} + +.modules-info ul { + margin: 0; + padding: 0 0 0 20px; +} + +.modules-info li { + font-size: 14px; + color: #555; + margin-bottom: 10px; +} + +.highlight-module { + font-weight: bold; + color: #2a6496; + cursor: pointer; +} + +.highlight-module:hover { + text-decoration: underline; + color: #1d5b8f; +} + +.advanced-title-box { + cursor: pointer; + color: #333; + margin-top: 20px; +} + +.advanced-box { + margin: 10px 0; +} + +.swal2-textarea { + height: 400px; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; /* 设置等宽字体 */ +} + +.swal2-textarea.code { + padding: 15px; + background-color: #f5f5f5; + border: 1px solid #eee; + box-shadow: inset 0 1px 8px rgba(0, 0, 0, .1); + border-radius: 4px; +} + +.example-wrapper { + display: flex; + align-items: center; + justify-content: space-between; +} + +.new-action { + cursor: pointer; + padding: 8px; + margin-left: 10px; + border: none; + border-radius: 20px; + background-color: #007bff; + color: white; + transition: all 0.3s ease; + font-size: 14px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 30px; + overflow: hidden; + white-space: nowrap; + display: flex; + justify-content: center; + align-items: center; +} + +.new-action:hover, .new-action:focus { + width: auto; + padding: 8px 16px; + background-color: #0056b3; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); +} + +.new-action:active { + background-color: #00488a; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} + +#import-buttons { + display: flex; + flex-direction: column; + align-items: center; + position: absolute; + top: 30%; + right: 50px; + z-index: 10; + padding: 5px; + border-radius: 10px; + background-color: #ffffff; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + font-family: 'Poppins', sans-serif; + transition: all 0.3s ease; +} + +#import-buttons:hover { + box-shadow: 5px 5px 20px rgba(0, 0, 0, 0.25); + transform: translateY(-2px); +} + +#step-info { + margin-bottom: 10px; + padding: 10px; + border-radius: 4px; + text-align: center; + width: 150px; + font-family: 'Poppins', sans-serif; + font-size: 14px; + font-weight: 500; + letter-spacing: 0.05em; + line-height: 1.6; + color: #333; + background-color: #f8f9fa; + box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.1); + cursor: pointer; +} + +#step-warning { + position: absolute; + top: 8%; + right: 25.5%; + padding: 10px; + text-align: center; + /*font-family: 'Poppins', sans-serif;*/ + font-size: 14px; + letter-spacing: 0.05em; + line-height: 1.6; + color: #333; + margin: 10px; + border-radius: 5px; + border: 1px solid #ffcc00; + background-color: rgba(255, 255, 0, 0.15); + box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.1); + cursor: pointer; +} + +#step-info:hover, #step-warning:hover { + box-shadow: 5px 5px 20px rgba(0, 0, 0, 0.25); + transform: translateY(-2px); +} + +#import-prev, #import-next, #import-skip, #import-quit { + padding: 8px 12px; + margin: 4px; + border: none; + border-radius: 4px; + background-color: #007bff; + color: white; + cursor: pointer; + font-size: 16px; +} + +#import-prev:hover, #import-next:hover, #import-skip:hover, #import-quit:hover { + background-color: #0056b3; + transform: translateY(-2px); +} + +#import-prev i, #import-next i, #import-skip i, #import-quit i { + margin-right: 5px; +} + +#import-next:disabled, #import-prev:disabled, #import-skip:disabled { + background-color: #ccc; + cursor: not-allowed; +} + +#surveyModal { + display: none; + position: fixed; + bottom: 60px; + right: 20px; + background-color: white; + box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); + z-index: 1000; + border-radius: 10px; + overflow: hidden; + animation: fadeIn 0.3s; +} + +#surveyContent { + position: relative; + padding: 20px; + text-align: center; +} + +#surveyButton { + padding: 10px 20px; + background-color: #2ea44f; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; +} + +#surveyButton:hover { + background-color: #258741; + transform: scale(1.05); +} + +#surveyClose { + position: absolute; + top: 10px; + right: 15px; + color: #aaaaaa; + font-size: 25px; + cursor: pointer; +} + +#surveyClose:hover { + color: #777; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.text-input { + font-family: Arial, sans-serif; + font-size: 16px; + line-height: 1.2; + resize: vertical; +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css_third_party/clusterize.css b/src/agentscope/studio/static/css_third_party/clusterize.css new file mode 100644 index 000000000..dc7f878bf --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/clusterize.css @@ -0,0 +1,38 @@ +/* max-height - the only parameter in this file that needs to be edited. + * Change it to suit your needs. The rest is recommended to leave as is. + */ +.clusterize-scroll{ + max-height: 200px; + overflow: auto; +} + +/** + * Avoid vertical margins for extra tags + * Necessary for correct calculations when rows have nonzero vertical margins + */ +.clusterize-extra-row{ + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +/* By default extra tag .clusterize-keep-parity added to keep parity of rows. + * Useful when used :nth-child(even/odd) + */ +.clusterize-extra-row.clusterize-keep-parity{ + display: none; +} + +/* During initialization clusterize adds tabindex to force the browser to keep focus + * on the scrolling list, see issue #11 + * Outline removes default browser's borders for focused elements. + */ +.clusterize-content{ + outline: 0; + counter-reset: clusterize-counter; +} + +/* Centering message that appears when no data provided + */ +.clusterize-no-data td{ + text-align: center; +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css_third_party/drawflow.min.css b/src/agentscope/studio/static/css_third_party/drawflow.min.css new file mode 100644 index 000000000..5ef6f8477 --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/drawflow.min.css @@ -0,0 +1,147 @@ +.drawflow, .drawflow .parent-node { + position: relative; +} + +.parent-drawflow { + display: flex; + overflow: hidden; + touch-action: none; + outline: 0; +} + +.drawflow { + width: 100%; + height: 100%; + user-select: none; +} + +.drawflow .drawflow-node { + display: flex; + align-items: center; + position: absolute; + background: #fff; + width: 280px; + min-width: 150px; + height: fit-content; + border-radius: 4px; + border: 1px solid var(--border-color); + color: #000; + z-index: 2; + padding: 15px; + box-shadow: 0 2px 10px 2px var(--border-color); +} + +.drawflow .drawflow-node.selected { + background: var(--main-color-very-light); + border: 1px solid var(--main-color-light); + box-shadow: 0 2px 10px 2px var(--main-color-light); +} + +.drawflow .drawflow-node:hover { + cursor: move; +} + +.drawflow .drawflow-node .inputs, .drawflow .drawflow-node .outputs { + width: 0; +} + +.drawflow .drawflow-node .drawflow_content_node { + width: 100%; + display: block; +} + +.drawflow .drawflow-node .input, .drawflow .drawflow-node .output { + position: relative; + width: 15px; + height: 15px; + background: #fff; + border-radius: 50%; + border: 2px solid var(--border-color); + cursor: crosshair; + z-index: 1; + margin-bottom: 5px; +} + +.drawflow .drawflow-node .input { + left: -27px; + top: 2px; + background: #ff0; +} + +.drawflow .drawflow-node .output { + right: -3px; + top: 2px; +} + +.drawflow svg { + z-index: 0; +} + +.drawflow .connection { + position: absolute; + pointer-events: none; + overflow-x: visible; + overflow-y: visible; +} + +.drawflow .connection .main-path { + fill: none; + stroke-width: 3px; + stroke: var(--main-color); + pointer-events: all; +} + +.drawflow .connection .main-path:hover { + stroke: #1266ab; + cursor: pointer; +} + +.drawflow .connection .main-path.selected { + stroke: #43b993; +} + +.drawflow .connection .point { + cursor: move; + stroke: #000; + stroke-width: 2; + fill: #fff; + pointer-events: all; +} + +.drawflow .connection .point.selected, .drawflow .connection .point:hover { + fill: #1266ab; +} + +.drawflow .main-path { + fill: none; + stroke-width: 5px; + stroke: #4682b4; +} + +.drawflow-delete { + position: absolute; + display: block; + width: 30px; + height: 30px; + background: #ffffff; + color: var(--main-color-light); + z-index: 4; + border: 2px solid var(--main-color-light); + box-shadow: 0 2px 20px 2px var(--main-color-light); + line-height: 30px; + font-weight: 700; + text-align: center; + border-radius: 50%; + font-family: monospace; + cursor: pointer; +} + +.drawflow > .drawflow-delete { + margin-left: -15px; + margin-top: 15px; +} + +.parent-node .drawflow-delete { + right: -15px; + top: -15px; +} \ No newline at end of file diff --git a/src/agentscope/studio/static/css_third_party/highlight.min.css b/src/agentscope/studio/static/css_third_party/highlight.min.css new file mode 100644 index 000000000..2e58473dc --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/highlight.min.css @@ -0,0 +1 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} diff --git a/src/agentscope/studio/static/css_third_party/katex.min.css b/src/agentscope/studio/static/css_third_party/katex.min.css new file mode 100644 index 000000000..3d27397c5 --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.8"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/src/agentscope/studio/static/css_third_party/prism-line-numbers.min.css b/src/agentscope/studio/static/css_third_party/prism-line-numbers.min.css new file mode 100644 index 000000000..8170f6467 --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/prism-line-numbers.min.css @@ -0,0 +1 @@ +pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right} \ No newline at end of file diff --git a/src/agentscope/studio/static/css_third_party/prism.min.css b/src/agentscope/studio/static/css_third_party/prism.min.css new file mode 100644 index 000000000..8c4cc0576 --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/prism.min.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} \ No newline at end of file diff --git a/src/agentscope/studio/static/css_third_party/tabulator.min.css b/src/agentscope/studio/static/css_third_party/tabulator.min.css new file mode 100644 index 000000000..474c2c1c8 --- /dev/null +++ b/src/agentscope/studio/static/css_third_party/tabulator.min.css @@ -0,0 +1,2 @@ +.tabulator{background-color:#888;border:1px solid #999;font-size:14px;overflow:hidden;position:relative;text-align:left;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.tabulator[tabulator-layout=fitDataFill] .tabulator-tableholder .tabulator-table{min-width:100%}.tabulator[tabulator-layout=fitDataTable]{display:inline-block}.tabulator.tabulator-block-select,.tabulator.tabulator-ranges .tabulator-cell:not(.tabulator-editing){user-select:none}.tabulator .tabulator-header{background-color:#e6e6e6;border-bottom:1px solid #999;box-sizing:border-box;color:#555;font-weight:700;outline:none;overflow:hidden;position:relative;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;white-space:nowrap;width:100%}.tabulator .tabulator-header.tabulator-header-hidden{display:none}.tabulator .tabulator-header .tabulator-header-contents{overflow:hidden;position:relative}.tabulator .tabulator-header .tabulator-header-contents .tabulator-headers{display:inline-block}.tabulator .tabulator-header .tabulator-col{background:#e6e6e6;border-right:1px solid #aaa;box-sizing:border-box;display:inline-flex;flex-direction:column;justify-content:flex-start;overflow:hidden;position:relative;text-align:left;vertical-align:bottom}.tabulator .tabulator-header .tabulator-col.tabulator-moving{background:#cdcdcd;border:1px solid #999;pointer-events:none;position:absolute}.tabulator .tabulator-header .tabulator-col.tabulator-range-highlight{background-color:#d6d6d6;color:#000}.tabulator .tabulator-header .tabulator-col.tabulator-range-selected{background-color:#3876ca;color:#fff}.tabulator .tabulator-header .tabulator-col .tabulator-col-content{box-sizing:border-box;padding:4px;position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button{padding:0 8px}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-header-popup-button:hover{cursor:pointer;opacity:.6}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title-holder{position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap;width:100%}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title.tabulator-col-title-wrap{text-overflow:clip;white-space:normal}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-title-editor{background:#fff;border:1px solid #999;box-sizing:border-box;padding:1px;width:100%}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title .tabulator-header-popup-button+.tabulator-title-editor{width:calc(100% - 22px)}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{align-items:center;bottom:0;display:flex;position:absolute;right:4px;top:0}.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:6px solid #bbb;border-left:6px solid transparent;border-right:6px solid transparent;height:0;width:0}.tabulator .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{border-top:1px solid #aaa;display:flex;margin-right:-1px;overflow:hidden;position:relative}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter{box-sizing:border-box;margin-top:2px;position:relative;text-align:center;width:100%}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter textarea{height:auto!important}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter svg{margin-top:3px}.tabulator .tabulator-header .tabulator-col .tabulator-header-filter input::-ms-clear{height:0;width:0}.tabulator .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-right:25px}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable.tabulator-col-sorter-element:hover{background-color:#cdcdcd;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter{color:#bbb}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{border-bottom:6px solid #555;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=none] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:6px solid #bbb;border-top:none}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{border-bottom:6px solid #555;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=ascending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:6px solid #666;border-top:none}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter{color:#666}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter.tabulator-col-sorter-element .tabulator-arrow:hover{border-top:6px solid #555;cursor:pointer}}.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort=descending] .tabulator-col-content .tabulator-col-sorter .tabulator-arrow{border-bottom:none;border-top:6px solid #666;color:#666}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical .tabulator-col-content .tabulator-col-title{align-items:center;display:flex;justify-content:center;text-orientation:mixed;writing-mode:vertical-rl}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-col-vertical-flip .tabulator-col-title{transform:rotate(180deg)}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-title{padding-right:0;padding-top:20px}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable.tabulator-col-vertical-flip .tabulator-col-title{padding-bottom:20px;padding-right:0}.tabulator .tabulator-header .tabulator-col.tabulator-col-vertical.tabulator-sortable .tabulator-col-sorter{bottom:auto;justify-content:center;left:0;right:0;top:4px}.tabulator .tabulator-header .tabulator-frozen{left:0;position:sticky;z-index:11}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left{border-right:2px solid #aaa}.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-right{border-left:2px solid #aaa}.tabulator .tabulator-header .tabulator-calcs-holder{background:#f3f3f3!important;border-bottom:1px solid #aaa;border-top:1px solid #aaa;box-sizing:border-box;display:inline-block}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row{background:#f3f3f3!important}.tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-header .tabulator-frozen-rows-holder{display:inline-block}.tabulator .tabulator-header .tabulator-frozen-rows-holder:empty{display:none}.tabulator .tabulator-tableholder{-webkit-overflow-scrolling:touch;overflow:auto;position:relative;white-space:nowrap;width:100%}.tabulator .tabulator-tableholder:focus{outline:none}.tabulator .tabulator-tableholder .tabulator-placeholder{align-items:center;box-sizing:border-box;display:flex;justify-content:center;min-width:100%;width:100%}.tabulator .tabulator-tableholder .tabulator-placeholder[tabulator-render-mode=virtual]{min-height:100%}.tabulator .tabulator-tableholder .tabulator-placeholder .tabulator-placeholder-contents{color:#ccc;display:inline-block;font-size:20px;font-weight:700;padding:10px;text-align:center;white-space:normal}.tabulator .tabulator-tableholder .tabulator-table{background-color:#fff;color:#333;display:inline-block;overflow:visible;position:relative;white-space:nowrap}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs{background:#e2e2e2!important;font-weight:700}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-top{border-bottom:2px solid #aaa}.tabulator .tabulator-tableholder .tabulator-table .tabulator-row.tabulator-calcs.tabulator-calcs-bottom{border-top:2px solid #aaa}.tabulator .tabulator-tableholder .tabulator-range-overlay{inset:0;pointer-events:none;position:absolute;z-index:10}.tabulator .tabulator-tableholder .tabulator-range-overlay .tabulator-range{border:1px solid #2975dd;box-sizing:border-box;position:absolute}.tabulator .tabulator-tableholder .tabulator-range-overlay .tabulator-range.tabulator-range-active:after{background-color:#2975dd;border-radius:999px;bottom:-3px;content:"";height:6px;position:absolute;right:-3px;width:6px}.tabulator .tabulator-tableholder .tabulator-range-overlay .tabulator-range-cell-active{border:2px solid #2975dd;box-sizing:border-box;position:absolute}.tabulator .tabulator-footer{background-color:#e6e6e6;border-top:1px solid #999;color:#555;font-weight:700;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;white-space:nowrap}.tabulator .tabulator-footer .tabulator-footer-contents{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:5px 10px}.tabulator .tabulator-footer .tabulator-footer-contents:empty{display:none}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs{margin-top:-5px;overflow-x:auto}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab{border:1px solid #999;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:none;display:inline-block;font-size:.9em;padding:5px}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab:hover{cursor:pointer;opacity:.7}.tabulator .tabulator-footer .tabulator-spreadsheet-tabs .tabulator-spreadsheet-tab.tabulator-spreadsheet-tab-active{background:#fff}.tabulator .tabulator-footer .tabulator-calcs-holder{background:#f3f3f3!important;border-bottom:1px solid #aaa;border-top:1px solid #aaa;box-sizing:border-box;overflow:hidden;text-align:left;width:100%}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row{background:#f3f3f3!important;display:inline-block}.tabulator .tabulator-footer .tabulator-calcs-holder .tabulator-row .tabulator-col-resize-handle{display:none}.tabulator .tabulator-footer .tabulator-calcs-holder:only-child{border-bottom:none;margin-bottom:-5px}.tabulator .tabulator-footer>*+.tabulator-page-counter{margin-left:10px}.tabulator .tabulator-footer .tabulator-page-counter{font-weight:400}.tabulator .tabulator-footer .tabulator-paginator{color:#555;flex:1;font-family:inherit;font-size:inherit;font-weight:inherit;text-align:right}.tabulator .tabulator-footer .tabulator-page-size{border:1px solid #aaa;border-radius:3px;display:inline-block;margin:0 5px;padding:2px 5px}.tabulator .tabulator-footer .tabulator-pages{margin:0 7px}.tabulator .tabulator-footer .tabulator-page{background:hsla(0,0%,100%,.2);border:1px solid #aaa;border-radius:3px;display:inline-block;margin:0 2px;padding:2px 5px}.tabulator .tabulator-footer .tabulator-page.active{color:#d00}.tabulator .tabulator-footer .tabulator-page:disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-footer .tabulator-page:not(disabled):hover{background:rgba(0,0,0,.2);color:#fff;cursor:pointer}}.tabulator .tabulator-col-resize-handle{display:inline-block;margin-left:-3px;margin-right:-3px;position:relative;vertical-align:middle;width:6px;z-index:11}@media (hover:hover) and (pointer:fine){.tabulator .tabulator-col-resize-handle:hover{cursor:ew-resize}}.tabulator .tabulator-col-resize-handle:last-of-type{margin-right:0;width:3px}.tabulator .tabulator-col-resize-guide{background-color:#999;height:100%;margin-left:-.5px;opacity:.5;position:absolute;top:0;width:4px}.tabulator .tabulator-row-resize-guide{background-color:#999;height:4px;left:0;margin-top:-.5px;opacity:.5;position:absolute;width:100%}.tabulator .tabulator-alert{align-items:center;background:rgba(0,0,0,.4);display:flex;height:100%;left:0;position:absolute;text-align:center;top:0;width:100%;z-index:100}.tabulator .tabulator-alert .tabulator-alert-msg{background:#fff;border-radius:10px;display:inline-block;font-size:16px;font-weight:700;margin:0 auto;padding:10px 20px}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-msg{border:4px solid #333;color:#000}.tabulator .tabulator-alert .tabulator-alert-msg.tabulator-alert-state-error{border:4px solid #d00;color:#590000}.tabulator-row{background-color:#fff;box-sizing:border-box;min-height:22px;position:relative}.tabulator-row.tabulator-row-even{background-color:#efefef}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selectable:hover{background-color:#bbb;cursor:pointer}}.tabulator-row.tabulator-selected{background-color:#9abcea}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-selected:hover{background-color:#769bcc;cursor:pointer}}.tabulator-row.tabulator-row-moving{background:#fff;border:1px solid #000}.tabulator-row.tabulator-moving{border-bottom:1px solid #aaa;border-top:1px solid #aaa;pointer-events:none;position:absolute;z-index:15}.tabulator-row.tabulator-range-highlight .tabulator-cell.tabulator-range-row-header{background-color:#d6d6d6;color:#000}.tabulator-row.tabulator-range-highlight.tabulator-range-selected .tabulator-cell.tabulator-range-row-header,.tabulator-row.tabulator-range-selected .tabulator-cell.tabulator-range-row-header{background-color:#3876ca;color:#fff}.tabulator-row .tabulator-row-resize-handle{bottom:0;height:5px;left:0;position:absolute;right:0}.tabulator-row .tabulator-row-resize-handle.prev{bottom:auto;top:0}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-row-resize-handle:hover{cursor:ns-resize}}.tabulator-row .tabulator-responsive-collapse{border-bottom:1px solid #aaa;border-top:1px solid #aaa;box-sizing:border-box;padding:5px}.tabulator-row .tabulator-responsive-collapse:empty{display:none}.tabulator-row .tabulator-responsive-collapse table{font-size:14px}.tabulator-row .tabulator-responsive-collapse table tr td{position:relative}.tabulator-row .tabulator-responsive-collapse table tr td:first-of-type{padding-right:10px}.tabulator-row .tabulator-cell{border-right:1px solid #aaa;box-sizing:border-box;display:inline-block;outline:none;overflow:hidden;padding:4px;position:relative;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.tabulator-row .tabulator-cell.tabulator-row-header{background:#e6e6e6;border-bottom:1px solid #aaa;border-right:1px solid #999}.tabulator-row .tabulator-cell.tabulator-frozen{background-color:inherit;display:inline-block;left:0;position:sticky;z-index:11}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-right:2px solid #aaa}.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-left:2px solid #aaa}.tabulator-row .tabulator-cell.tabulator-editing{border:1px solid #1d68cd;outline:none;padding:0}.tabulator-row .tabulator-cell.tabulator-editing input,.tabulator-row .tabulator-cell.tabulator-editing select{background:transparent;border:1px;outline:none}.tabulator-row .tabulator-cell.tabulator-validation-fail{border:1px solid #d00}.tabulator-row .tabulator-cell.tabulator-validation-fail input,.tabulator-row .tabulator-cell.tabulator-validation-fail select{background:transparent;border:1px;color:#d00}.tabulator-row .tabulator-cell.tabulator-row-handle{align-items:center;display:inline-flex;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box{width:80%}.tabulator-row .tabulator-cell.tabulator-row-handle .tabulator-row-handle-box .tabulator-row-handle-bar{background:#666;height:3px;margin-top:2px;width:100%}.tabulator-row .tabulator-cell.tabulator-range-selected:not(.tabulator-range-only-cell-selected):not(.tabulator-range-row-header){background-color:#9abcea}.tabulator-row .tabulator-cell .tabulator-data-tree-branch-empty{display:inline-block;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-branch{border-bottom:2px solid #aaa;border-bottom-left-radius:1px;border-left:2px solid #aaa;display:inline-block;height:9px;margin-right:5px;margin-top:-9px;vertical-align:middle;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-control{align-items:center;background:rgba(0,0,0,.1);border:1px solid #333;border-radius:2px;display:inline-flex;height:11px;justify-content:center;margin-right:5px;overflow:hidden;vertical-align:middle;width:11px}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-data-tree-control:hover{background:rgba(0,0,0,.2);cursor:pointer}}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse{background:transparent;display:inline-block;height:7px;position:relative;width:1px}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand{background:#333;display:inline-block;height:7px;position:relative;width:1px}.tabulator-row .tabulator-cell .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle{align-items:center;background:#666;border-radius:20px;color:#fff;display:inline-flex;font-size:1.1em;font-weight:700;height:15px;justify-content:center;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;width:15px}@media (hover:hover) and (pointer:fine){.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle:hover{cursor:pointer;opacity:.7}}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-close{display:initial}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle.open .tabulator-responsive-collapse-toggle-open{display:none}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle svg{stroke:#fff}.tabulator-row .tabulator-cell .tabulator-responsive-collapse-toggle .tabulator-responsive-collapse-toggle-close{display:none}.tabulator-row .tabulator-cell .tabulator-traffic-light{border-radius:14px;display:inline-block;height:14px;width:14px}.tabulator-row.tabulator-group{background:#ccc;border-bottom:1px solid #999;border-right:1px solid #aaa;border-top:1px solid #999;box-sizing:border-box;font-weight:700;min-width:100%;padding:5px 5px 5px 10px}@media (hover:hover) and (pointer:fine){.tabulator-row.tabulator-group:hover{background-color:rgba(0,0,0,.1);cursor:pointer}}.tabulator-row.tabulator-group.tabulator-group-visible .tabulator-arrow{border-bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;margin-right:10px}.tabulator-row.tabulator-group.tabulator-group-level-1{padding-left:30px}.tabulator-row.tabulator-group.tabulator-group-level-2{padding-left:50px}.tabulator-row.tabulator-group.tabulator-group-level-3{padding-left:70px}.tabulator-row.tabulator-group.tabulator-group-level-4{padding-left:90px}.tabulator-row.tabulator-group.tabulator-group-level-5{padding-left:110px}.tabulator-row.tabulator-group .tabulator-group-toggle{display:inline-block}.tabulator-row.tabulator-group .tabulator-arrow{border-bottom:6px solid transparent;border-left:6px solid #666;border-right:0;border-top:6px solid transparent;display:inline-block;height:0;margin-right:16px;vertical-align:middle;width:0}.tabulator-row.tabulator-group span{color:#d00;margin-left:10px}.tabulator-toggle{background:#dcdcdc;border:1px solid #ccc;box-sizing:border-box;display:flex;flex-direction:row}.tabulator-toggle.tabulator-toggle-on{background:#1c6cc2}.tabulator-toggle .tabulator-toggle-switch{background:#fff;border:1px solid #ccc;box-sizing:border-box}.tabulator-popup-container{-webkit-overflow-scrolling:touch;background:#fff;border:1px solid #aaa;box-shadow:0 0 5px 0 rgba(0,0,0,.2);box-sizing:border-box;display:inline-block;font-size:14px;overflow-y:auto;position:absolute;z-index:10000}.tabulator-popup{border-radius:3px;padding:5px}.tabulator-tooltip{border-radius:2px;box-shadow:none;font-size:12px;max-width:Min(500px,100%);padding:3px 5px;pointer-events:none}.tabulator-menu .tabulator-menu-item{box-sizing:border-box;padding:5px 10px;position:relative;user-select:none}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-disabled{opacity:.5}@media (hover:hover) and (pointer:fine){.tabulator-menu .tabulator-menu-item:not(.tabulator-menu-item-disabled):hover{background:#efefef;cursor:pointer}}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu{padding-right:25px}.tabulator-menu .tabulator-menu-item.tabulator-menu-item-submenu:after{border-color:#aaa;border-style:solid;border-width:1px 1px 0 0;content:"";display:inline-block;height:7px;position:absolute;right:10px;top:calc(5px + .4em);transform:rotate(45deg);vertical-align:top;width:7px}.tabulator-menu .tabulator-menu-separator{border-top:1px solid #aaa}.tabulator-edit-list{-webkit-overflow-scrolling:touch;font-size:14px;max-height:200px;overflow-y:auto}.tabulator-edit-list .tabulator-edit-list-item{color:#333;outline:none;padding:4px}.tabulator-edit-list .tabulator-edit-list-item.active{background:#1d68cd;color:#fff}.tabulator-edit-list .tabulator-edit-list-item.active.focused{outline:1px solid hsla(0,0%,100%,.5)}.tabulator-edit-list .tabulator-edit-list-item.focused{outline:1px solid #1d68cd}@media (hover:hover) and (pointer:fine){.tabulator-edit-list .tabulator-edit-list-item:hover{background:#1d68cd;color:#fff;cursor:pointer}}.tabulator-edit-list .tabulator-edit-list-placeholder{color:#333;padding:4px;text-align:center}.tabulator-edit-list .tabulator-edit-list-group{border-bottom:1px solid #aaa;color:#333;font-weight:700;padding:6px 4px 4px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-2,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-2{padding-left:12px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-3,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-3{padding-left:20px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-4,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-4{padding-left:28px}.tabulator-edit-list .tabulator-edit-list-group.tabulator-edit-list-group-level-5,.tabulator-edit-list .tabulator-edit-list-item.tabulator-edit-list-group-level-5{padding-left:36px}.tabulator.tabulator-ltr{direction:ltr}.tabulator.tabulator-rtl{direction:rtl;text-align:initial}.tabulator.tabulator-rtl .tabulator-header .tabulator-col{border-left:1px solid #aaa;border-right:initial;text-align:initial}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-col-group .tabulator-col-group-cols{margin-left:-1px;margin-right:0}.tabulator.tabulator-rtl .tabulator-header .tabulator-col.tabulator-sortable .tabulator-col-title{padding-left:25px;padding-right:0}.tabulator.tabulator-rtl .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-sorter{left:8px;right:auto}.tabulator.tabulator-rtl .tabulator-tableholder .tabulator-range-overlay .tabulator-range.tabulator-range-active:after{background-color:#2975dd;border-radius:999px;bottom:-3px;content:"";height:6px;left:-3px;position:absolute;right:auto;width:6px}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell{border-left:1px solid #aaa;border-right:initial}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-branch{border-bottom-left-radius:0;border-bottom-right-radius:1px;border-left:initial;border-right:2px solid #aaa;margin-left:5px;margin-right:0}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell .tabulator-data-tree-control{margin-left:5px;margin-right:0}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left{border-left:2px solid #aaa}.tabulator.tabulator-rtl .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-right{border-right:2px solid #aaa}.tabulator.tabulator-rtl .tabulator-row .tabulator-col-resize-handle:last-of-type{margin-left:0;margin-right:-3px;width:3px}.tabulator.tabulator-rtl .tabulator-footer .tabulator-calcs-holder{text-align:initial}.tabulator-print-fullscreen{bottom:0;left:0;position:absolute;right:0;top:0;z-index:10000}body.tabulator-print-fullscreen-hide>:not(.tabulator-print-fullscreen){display:none!important}.tabulator-print-table{border-collapse:collapse}.tabulator-print-table .tabulator-data-tree-branch{border-bottom:2px solid #aaa;border-bottom-left-radius:1px;border-left:2px solid #aaa;display:inline-block;height:9px;margin-right:5px;margin-top:-9px;vertical-align:middle;width:7px}.tabulator-print-table .tabulator-print-table-group{background:#ccc;border-bottom:1px solid #999;border-right:1px solid #aaa;border-top:1px solid #999;box-sizing:border-box;font-weight:700;min-width:100%;padding:5px 5px 5px 10px}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-print-table-group:hover{background-color:rgba(0,0,0,.1);cursor:pointer}}.tabulator-print-table .tabulator-print-table-group.tabulator-group-visible .tabulator-arrow{border-bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #666;margin-right:10px}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-1 td{padding-left:30px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-2 td{padding-left:50px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-3 td{padding-left:70px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-4 td{padding-left:90px!important}.tabulator-print-table .tabulator-print-table-group.tabulator-group-level-5 td{padding-left:110px!important}.tabulator-print-table .tabulator-print-table-group .tabulator-group-toggle{display:inline-block}.tabulator-print-table .tabulator-print-table-group .tabulator-arrow{border-bottom:6px solid transparent;border-left:6px solid #666;border-right:0;border-top:6px solid transparent;display:inline-block;height:0;margin-right:16px;vertical-align:middle;width:0}.tabulator-print-table .tabulator-print-table-group span{color:#d00;margin-left:10px}.tabulator-print-table .tabulator-data-tree-control{align-items:center;background:rgba(0,0,0,.1);border:1px solid #333;border-radius:2px;display:inline-flex;height:11px;justify-content:center;margin-right:5px;overflow:hidden;vertical-align:middle;width:11px}@media (hover:hover) and (pointer:fine){.tabulator-print-table .tabulator-data-tree-control:hover{background:rgba(0,0,0,.2);cursor:pointer}}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse{background:transparent;display:inline-block;height:7px;position:relative;width:1px}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-collapse:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand{background:#333;display:inline-block;height:7px;position:relative;width:1px}.tabulator-print-table .tabulator-data-tree-control .tabulator-data-tree-control-expand:after{background:#333;content:"";height:1px;left:-3px;position:absolute;top:3px;width:7px} +/*# sourceMappingURL=tabulator.min.css.map */ \ No newline at end of file diff --git a/src/agentscope/web/static/fonts/KRYPTON.ttf b/src/agentscope/studio/static/fonts/KRYPTON.ttf similarity index 100% rename from src/agentscope/web/static/fonts/KRYPTON.ttf rename to src/agentscope/studio/static/fonts/KRYPTON.ttf diff --git a/src/agentscope/studio/static/fonts/SourceSans3-Regular.ttf b/src/agentscope/studio/static/fonts/SourceSans3-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c906bdab86660cc43369aae4825697f539c91ddc GIT binary patch literal 380932 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 wfhR6_fpK6QdLtp!IL)Dn(9 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≻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 BCPe@M literal 0 HcmV?d00001 diff --git a/src/agentscope/studio/static/html-drag-components/agent-dialogagent.html b/src/agentscope/studio/static/html-drag-components/agent-dialogagent.html new file mode 100644 index 000000000..aff97859a --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/agent-dialogagent.html @@ -0,0 +1,33 @@ +

\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/agent-dictdialogagent.html b/src/agentscope/studio/static/html-drag-components/agent-dictdialogagent.html new file mode 100644 index 000000000..6d5040212 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/agent-dictdialogagent.html @@ -0,0 +1,46 @@ +
+
+
+ + + + + DictDialogAgent +
+ + +
+
+
+ Agent that generates response in a dict format +
Node ID: ID_PLACEHOLDER
+
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/agent-reactagent.html b/src/agentscope/studio/static/html-drag-components/agent-reactagent.html new file mode 100644 index 000000000..83cbbf3fa --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/agent-reactagent.html @@ -0,0 +1,57 @@ +
+
+
+ + + + + ReActAgent +
+ + +
+ + +
+
+ Agent for ReAct (reasoning and acting) with tools +
Node ID: ID_PLACEHOLDER
+
+ + + +
+ + + +
+ + + +
+ + +
Please drag and + drop a Tool module into this area. Inserting other types of modules + may result in errors. +
+ + + +
+ + + +
+ + + +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/agent-texttoimageagent.html b/src/agentscope/studio/static/html-drag-components/agent-texttoimageagent.html new file mode 100644 index 000000000..d3ff12c51 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/agent-texttoimageagent.html @@ -0,0 +1,28 @@ +
+
+
+ + + + + TextToImageAgent +
+ + +
+
+
+ Agent for text to image generation +
Node ID: ID_PLACEHOLDER
+
+ + + +
+ + + +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/agent-useragent.html b/src/agentscope/studio/static/html-drag-components/agent-useragent.html new file mode 100644 index 000000000..8e9930449 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/agent-useragent.html @@ -0,0 +1,24 @@ +
+
+
+ + + + + UserAgent +
+ + +
+
+
+ A proxy agent for user +
Node ID: ID_PLACEHOLDER
+
+ + + +
+
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/message-msg.html b/src/agentscope/studio/static/html-drag-components/message-msg.html new file mode 100644 index 000000000..ca29eef48 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/message-msg.html @@ -0,0 +1,27 @@ +
+
+ + + + + Msg +
+ +
+ +
+ + +
+ + + +
+ + + +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/model-dashscope-chat.html b/src/agentscope/studio/static/html-drag-components/model-dashscope-chat.html new file mode 100644 index 000000000..241d38ce0 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/model-dashscope-chat.html @@ -0,0 +1,44 @@ +
+
+ + + + DashScope Chat +
+ +
+
+
DashScope Chat Configurations (Your API key will + NOT be stored and exposed to the website + maintainer) +
+
+ + + +
+ + +
+ + + + + +
+ + + +
+ + + +
diff --git a/src/agentscope/studio/static/html-drag-components/model-openai-chat.html b/src/agentscope/studio/static/html-drag-components/model-openai-chat.html new file mode 100644 index 000000000..5b3847e67 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/model-openai-chat.html @@ -0,0 +1,55 @@ +
+
+ + + + OpenAI Chat +
+ +
+
+
OpenAI Chat Configurations (Your API key will NOT + be stored and exposed to the website + maintainer) +
+
+ + + +
+ + + +
+ + + + + + +
+ + + +
+ + + + +
Advanced + ▼ +
+ + +
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/model-post-api-chat.html b/src/agentscope/studio/static/html-drag-components/model-post-api-chat.html new file mode 100644 index 000000000..9e4a05901 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/model-post-api-chat.html @@ -0,0 +1,50 @@ +
+
+ + + + Post API Chat +
+ +
+
+
Post API Chat Configuration
+
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+
diff --git a/src/agentscope/studio/static/html-drag-components/model-post-api-dall-e.html b/src/agentscope/studio/static/html-drag-components/model-post-api-dall-e.html new file mode 100644 index 000000000..7ff242764 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/model-post-api-dall-e.html @@ -0,0 +1,45 @@ +
+
+ + + + Post API Dall-E +
+ +
+
+
Post API Dall-E Configurations
+
+ +
+ +
+ +
+ +
+ + + +
+ + + +
+ +
+ +
+ +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-forlooppipeline.html b/src/agentscope/studio/static/html-drag-components/pipeline-forlooppipeline.html new file mode 100644 index 000000000..2808a61c5 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-forlooppipeline.html @@ -0,0 +1,25 @@ +
+
+ + + + ForLoopPipeline +
+ +
+
+
A template pipeline for implementing control flow + like for-loop +
+ + + +
+ + + +
+ +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-ifelsepipeline.html b/src/agentscope/studio/static/html-drag-components/pipeline-ifelsepipeline.html new file mode 100644 index 000000000..e3dafc6d1 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-ifelsepipeline.html @@ -0,0 +1,23 @@ +
+
+ + + + IfElsePipeline +
+ +
+
+
A template pipeline for implementing control flow + with if-else logic +
+ + + +
+ +
If condition
+ +
Else condition
+
diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-msghub.html b/src/agentscope/studio/static/html-drag-components/pipeline-msghub.html new file mode 100644 index 000000000..44e4d157c --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-msghub.html @@ -0,0 +1,26 @@ +
+
+ + + + MsgHub +
+ +
+
+
MsgHub is used to share messages among a group of + agents +
+ + + +
+ + + +
+ +
+
diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-placeholder.html b/src/agentscope/studio/static/html-drag-components/pipeline-placeholder.html new file mode 100644 index 000000000..59d5af5d6 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-placeholder.html @@ -0,0 +1,13 @@ +
+
+ + + + Placeholder +
+ +
+
+
A placeholder that do nothing
+
diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-sequentialpipeline.html b/src/agentscope/studio/static/html-drag-components/pipeline-sequentialpipeline.html new file mode 100644 index 000000000..f89ecacdb --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-sequentialpipeline.html @@ -0,0 +1,17 @@ +
+
+ + + + SequentialPipeline +
+ +
+
+
A template pipeline for implementing sequential + logic (from top to bottom) +
+ +
+
diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-switchpipeline.html b/src/agentscope/studio/static/html-drag-components/pipeline-switchpipeline.html new file mode 100644 index 000000000..bfb32653c --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-switchpipeline.html @@ -0,0 +1,27 @@ +
+
+ + + + SwitchPipeline +
+ +
+
+
A template pipeline for implementing control flow + with switch-case logic +
+ + + +
+ + + + + +
+ +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/pipeline-whilelooppipeline.html b/src/agentscope/studio/static/html-drag-components/pipeline-whilelooppipeline.html new file mode 100644 index 000000000..5ebfc6b2c --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/pipeline-whilelooppipeline.html @@ -0,0 +1,21 @@ +
+
+ + + + WhileLoopPipeline +
+ +
+
+
A template pipeline for implementing control flow + like while-loop +
+ + + +
+ +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/service-bing-search.html b/src/agentscope/studio/static/html-drag-components/service-bing-search.html new file mode 100644 index 000000000..27a36ef32 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/service-bing-search.html @@ -0,0 +1,23 @@ +
+
+ + + + + BingSearchService +
+ +
+
+
Integrate the Bing Search service within ReActAgent + to enhance agent capabilities +
+ + + +
+ + + +
diff --git a/src/agentscope/studio/static/html-drag-components/service-execute-python.html b/src/agentscope/studio/static/html-drag-components/service-execute-python.html new file mode 100644 index 000000000..5df8d85ed --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/service-execute-python.html @@ -0,0 +1,16 @@ +
+
+ + + + + PythonService +
+ +
+
+
Integrate the Python Interpreter within ReActAgent + to enhance agent capabilities +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/service-google-search.html b/src/agentscope/studio/static/html-drag-components/service-google-search.html new file mode 100644 index 000000000..935ed06f6 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/service-google-search.html @@ -0,0 +1,27 @@ +
+
+ + + + + GoogleSearchService +
+ +
+
+
Integrate the Google Search service within + ReActAgent to enhance agent capabilities +
+ + + +
+ + + +
+ + + +
diff --git a/src/agentscope/studio/static/html-drag-components/service-read-text.html b/src/agentscope/studio/static/html-drag-components/service-read-text.html new file mode 100644 index 000000000..de706969a --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/service-read-text.html @@ -0,0 +1,16 @@ +
+
+ + + + + ReadTextService +
+ +
+
+
Integrate the Read Text service within ReActAgent + to enhance agent capabilities +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/service-write-text.html b/src/agentscope/studio/static/html-drag-components/service-write-text.html new file mode 100644 index 000000000..719219957 --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/service-write-text.html @@ -0,0 +1,16 @@ +
+
+ + + + + WriteTextService +
+ +
+
+
Integrate the Write Text Service within ReActAgent + to enhance agent capabilities +
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html-drag-components/welcome.html b/src/agentscope/studio/static/html-drag-components/welcome.html new file mode 100644 index 000000000..4eec3bded --- /dev/null +++ b/src/agentscope/studio/static/html-drag-components/welcome.html @@ -0,0 +1,38 @@ +
+ 👏 Welcome! + +
+
+

Easy-to-use Multi-Agent Platform: + + AgentScope + +

+ + + + + + +
+ + + + + + + + +
\ No newline at end of file diff --git a/src/agentscope/studio/static/html/dashboard-detail-code.html b/src/agentscope/studio/static/html/dashboard-detail-code.html new file mode 100644 index 000000000..00a04b0a6 --- /dev/null +++ b/src/agentscope/studio/static/html/dashboard-detail-code.html @@ -0,0 +1,10 @@ +
+
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html/dashboard-detail-dialogue.html b/src/agentscope/studio/static/html/dashboard-detail-dialogue.html new file mode 100644 index 000000000..df4360414 --- /dev/null +++ b/src/agentscope/studio/static/html/dashboard-detail-dialogue.html @@ -0,0 +1,71 @@ +
+
+
+
+
No messages available.
+
+
+
+
+
User
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ + + + + + +
+
+ + + +
+
+
+ + + diff --git a/src/agentscope/studio/static/html/dashboard-detail-invocation.html b/src/agentscope/studio/static/html/dashboard-detail-invocation.html new file mode 100644 index 000000000..95c585bbb --- /dev/null +++ b/src/agentscope/studio/static/html/dashboard-detail-invocation.html @@ -0,0 +1,4 @@ +
+
+
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html/dashboard-detail.html b/src/agentscope/studio/static/html/dashboard-detail.html new file mode 100644 index 000000000..39a3c9088 --- /dev/null +++ b/src/agentscope/studio/static/html/dashboard-detail.html @@ -0,0 +1,40 @@ +
+
+
+
+ + + + Dialogue +
+
+ + + + + Code +
+
+ + + + API Invocation +
+
+
+ +
+ +
+ + +
\ No newline at end of file diff --git a/src/agentscope/studio/static/html/dashboard-runs.html b/src/agentscope/studio/static/html/dashboard-runs.html new file mode 100644 index 000000000..b51110b93 --- /dev/null +++ b/src/agentscope/studio/static/html/dashboard-runs.html @@ -0,0 +1,6 @@ +
+
+ +
+
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html/dashboard.html b/src/agentscope/studio/static/html/dashboard.html new file mode 100644 index 000000000..53640fbff --- /dev/null +++ b/src/agentscope/studio/static/html/dashboard.html @@ -0,0 +1,10 @@ +
+
+ Dashboard +
+
+
diff --git a/src/agentscope/studio/static/html/index-guide.html b/src/agentscope/studio/static/html/index-guide.html new file mode 100644 index 000000000..895af6ec2 --- /dev/null +++ b/src/agentscope/studio/static/html/index-guide.html @@ -0,0 +1,34 @@ +
+

Welcome to AgentScope Studio

+

+ AgentScope Studio is a web-based platform for monitoring, managing and developing multi-agent applications in AgentScope! Feel free to explore the platform and its features. +

+ +

Start to explore AgentScope Studio with

+
+
+
Dashboard
+
Monitor and manage your + AgentScope running instances. +
+
+
+
Workstation
+
Develop your multi-agent + applications by dragging. +
+
+
+
+
+
Gallery
+
Coming soon ...
+
+
+
Server Management
+
Coming soon ...
+
+
+
\ No newline at end of file diff --git a/src/agentscope/studio/static/html/market.html b/src/agentscope/studio/static/html/market.html new file mode 100644 index 000000000..533eab1f5 --- /dev/null +++ b/src/agentscope/studio/static/html/market.html @@ -0,0 +1 @@ +

Coming soon ...

\ No newline at end of file diff --git a/src/agentscope/studio/static/html/server.html b/src/agentscope/studio/static/html/server.html new file mode 100644 index 000000000..533eab1f5 --- /dev/null +++ b/src/agentscope/studio/static/html/server.html @@ -0,0 +1 @@ +

Coming soon ...

\ No newline at end of file diff --git a/src/agentscope/studio/static/html/template.html b/src/agentscope/studio/static/html/template.html new file mode 100644 index 000000000..a7bd107f0 --- /dev/null +++ b/src/agentscope/studio/static/html/template.html @@ -0,0 +1,47 @@ + + + + + + + \ No newline at end of file diff --git a/src/agentscope/studio/static/html/workstation_iframe.html b/src/agentscope/studio/static/html/workstation_iframe.html new file mode 100644 index 000000000..cf142a0ad --- /dev/null +++ b/src/agentscope/studio/static/html/workstation_iframe.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/agentscope/studio/static/js/dashboard-detail-code.js b/src/agentscope/studio/static/js/dashboard-detail-code.js new file mode 100644 index 000000000..e43c779cf --- /dev/null +++ b/src/agentscope/studio/static/js/dashboard-detail-code.js @@ -0,0 +1,77 @@ +let currentCode = null; +let editorInstance = null; + +function initializeDashboardDetailCodePage(codeUrl) { + initializeMonacoEditor(); + + fetch("/api/code?run_dir=" + codeUrl) + .then((response) => { + if (!response.ok) { + throw new Error("Connection error, cannot load the web page."); + } + return response.json(); + }) + .then((data) => { + console.log("Get ", data); + currentCode = data; + constructCodeFileList(codeUrl, data); + }) + .catch((error) => { + console.error("Error encountered while loading page: ", error); + }); +} + +function constructCodeFileList(codeUrl, code) { + let codeFileRows = [`
    ${codeUrl}
`]; + + if (code !== null && code !== undefined) { + if (Object.keys(code).length === 0) { + codeFileRows = [ + '
No code available
', + ]; + } else { + Object.keys(code).forEach((key) => + codeFileRows.push( + `
  • ${key}
  • ` + ) + ); + } + } + + document.getElementById("code-list").innerHTML = codeFileRows.join("\n"); +} + +function initializeMonacoEditor() { + require.config({ + paths: { + vs: "https://cdn.jsdelivr.net/npm/monaco-editor@latest/min/vs", + }, + }); + require(["vs/editor/editor.main"], function () { + editorInstance = monaco.editor.create( + document.getElementById("code-editor"), + { + language: "python", + theme: "vs-light", + scrollBeyondLastLine: false, + readOnly: true, + } + ); + }, function (error) { + console.error("Error encountered while loading monaco editor: ", error); + }); +} + +function displayCode(codeFileName) { + document.getElementById("code-filename").innerHTML = codeFileName; + + if (editorInstance) { + editorInstance.setValue(currentCode[codeFileName]); + } else { + console.log( + "Monaco editor instance is not available, set text content" + ); + document.getElementById("code-editor").textContent = + currentCode[codeFileName]; + } +} diff --git a/src/agentscope/studio/static/js/dashboard-detail-dialogue.js b/src/agentscope/studio/static/js/dashboard-detail-dialogue.js new file mode 100644 index 000000000..21b307a34 --- /dev/null +++ b/src/agentscope/studio/static/js/dashboard-detail-dialogue.js @@ -0,0 +1,621 @@ +let chatRowOtherTemplate, + chatRowUserTemplate, + chatRowSystemTemplate, + infoRowTemplate; + +let currentRuntimeInfo, currentMsgInfo, currentAgentInfo; + +let randomNumberGenerator; + +let infoClusterize; + +let inputFileList = document.getElementById("chat-control-file-list"); + +let waitForUserInput = false; +let userInputRequest = null; + +const agentIcons = [ + '', + '', + '', + '', + '', + '', +]; + +let nameToIconAndColor = {}; + +hljs.highlightAll(); + +const marked_options = { + gfm: true, + breaks: true, + pedantic: false, +}; + +marked.use({ + renderer: { + code(code, infostring, escaped) { + const language = infostring + ? hljs.getLanguage(infostring) + ? infostring + : "plaintext" + : "plaintext"; + // Use Highlight.js to highlight code blocks + return `
    ${
    +                hljs.highlight(code, {language}).value
    +            }
    `; + }, + }, +}); + +function randomSelectAgentIcon() { + return agentIcons[Math.floor(randomNumberGenerator.nextFloat() * agentIcons.length)]; +} + +function randomIntFromInterval(min, max) { + return Math.floor(randomNumberGenerator.nextFloat() * (max - min + 1) + min); +} + +function hslToHex(h, s, l) { + l /= 100; + const a = (s * Math.min(l, 1 - l)) / 100; + const f = (n) => { + const k = (n + h / 30) % 12; + const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); + return Math.round(255 * color) + .toString(16) + .padStart(2, "0"); // 转换为16进制并补零 + }; + return `#${f(0)}${f(8)}${f(4)}`; +} + +function randomSelectColor() { + const h = randomIntFromInterval(0, 360); // 色相:0°到360° + const s = randomIntFromInterval(50, 100); // 饱和度:50%到100% + const l = randomIntFromInterval(25, 75); // 亮度:25%到75% + return hslToHex(h, s, l); +} + +async function loadChatTemplate() { + const response = await fetch("static/html/template.html"); + const htmlText = await response.text(); + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlText, "text/html"); + + // save + chatRowOtherTemplate = doc.querySelector( + "#chat-row-other-template" + ).content; + chatRowUserTemplate = doc.querySelector("#chat-row-user-template").content; + chatRowSystemTemplate = doc.querySelector( + "#chat-row-system-template" + ).content; + infoRowTemplate = doc.querySelector("#dialogue-info-row-template").content; +} + +// Add a chat row according to the role field in the message +function addChatRow(index, pMsg) { + switch (pMsg.role.toLowerCase()) { + case "user": + return _addUserChatRow(index, pMsg); + case "system": + return _addSystemChatRow(index, pMsg); + case "assistant": + return _addAssistantChatRow(index, pMsg); + default: + console.error("Unknown role: " + pMsg.role); + return _addAssistantChatRow(index, pMsg); + } +} + +function _determineFileType(url) { + // Image + let img_suffix = [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".webp"]; + // Video + let video_suffix = [ + ".mp4", + ".webm", + ".avi", + ".mov", + ".wmv", + ".flv", + ".f4v", + ".m4v", + ".rmvb", + ".rm", + ".3gp", + ".dat", + ".ts", + ".mts", + ".vob", + ]; + // Audio + let audio_suffix = [".mp3", ".wav", ".wma", ".ogg", ".aac", ".flac"]; + + if (img_suffix.some((suffix) => url.endsWith(suffix))) { + return "image"; + } else if (video_suffix.some((suffix) => url.endsWith(suffix))) { + return "video"; + } else if (audio_suffix.some((suffix) => url.endsWith(suffix))) { + return "audio"; + } + return "file"; +} + +function _getMultiModalComponent(url) { + // Determine the type of the file + let urlType = _determineFileType(url); + + // If we need to fetch the url from the backend + let src = null; + if (url.startsWith("http://") || url.startsWith("https://")) { + // Obtain the url from the backend + src = url; + } else { + src = "/api/file?path=" + url; + } + + switch (urlType) { + case "image": + return `Image`; + case "audio": + return ``; + case "video": + return ``; + default: + return `${url}`; + } +} + +// Render multiple urls in a chat bubble +function _renderMultiModalUrls(urls) { + if (urls == null || urls === "") { + return "" + } + + if (typeof urls === "string") { + urls = [urls] + } + + if (Array.isArray(urls) && urls.length > 0) { + let innerHtml = ""; + for (let i = 0; i < urls.length; i++) { + innerHtml += _getMultiModalComponent(urls[i]); + } + return innerHtml; + } else { + return "" + } +} + +function _addUserChatRow(index, pMsg) { + const template = chatRowUserTemplate.cloneNode(true); + // template.querySelector('.chat-icon'). + template.querySelector(".chat-name").textContent = pMsg.name; + let chatBubble = template.querySelector(".chat-bubble"); + chatBubble.textContent += pMsg.content; + chatBubble.innerHTML += _renderMultiModalUrls(pMsg.url); + template.querySelector(".chat-row").setAttribute("data-index", index); + template + .querySelector(".chat-row") + .setAttribute("data-msg", JSON.stringify(pMsg)); + return template.firstElementChild.outerHTML; +} + +function _addAssistantChatRow(index, pMsg) { + const template = chatRowOtherTemplate.cloneNode(true); + + // If not record + let svg_html, color; + if (pMsg.name in nameToIconAndColor) { + svg_html = nameToIconAndColor[pMsg.name][0]; + color = nameToIconAndColor[pMsg.name][1]; + } else { + // First choose a svg icon + svg_html = randomSelectAgentIcon(); + color = randomSelectColor(); + // Record the color and icon + nameToIconAndColor[pMsg.name] = [svg_html, color]; + } + template.querySelector(".chat-icon").innerHTML = svg_html; + // change the background color randomly + template.querySelector(".chat-icon").style.backgroundColor = color; + + template.querySelector(".chat-name").textContent = pMsg.name; + let chatBubble = template.querySelector(".chat-bubble"); + chatBubble.innerHTML += marked.parse(pMsg.content, marked_options); + chatBubble.innerHTML += _renderMultiModalUrls(pMsg.url); + template.querySelector(".chat-row").setAttribute("data-index", index); + template + .querySelector(".chat-row") + .setAttribute("data-msg", JSON.stringify(pMsg)); + return template.firstElementChild.outerHTML; +} + +function _addSystemChatRow(index, pMsg) { + const template = chatRowSystemTemplate.cloneNode(true); + template.querySelector(".chat-name").textContent = pMsg.name; + let chatBubble = template.querySelector(".chat-bubble"); + chatBubble.innerHTML += marked.parse(pMsg.content, marked_options); + chatBubble.innerHTML += _renderMultiModalUrls(pMsg.url); + template.querySelector(".chat-row").setAttribute("data-index", index); + template + .querySelector(".chat-row") + .setAttribute("data-msg", JSON.stringify(pMsg)); + + return template.firstElementChild.outerHTML; +} + +function _addKeyValueInfoRow(pKey, pValue) { + const template = infoRowTemplate.cloneNode(true); + template.querySelector(".dialogue-info-key").textContent = + pKey.toUpperCase(); + // Not null + if (pValue !== null) { + let infoValue = template.querySelector(".dialogue-info-value"); + if (pKey.toLowerCase() === "url") { + infoValue.style.wordBreak = "break-all"; + } + + if (typeof pValue === "object") { + infoValue.textContent = JSON.stringify(pValue); + } else { + infoValue.textContent = pValue; + } + } + return template.firstElementChild.outerHTML; +} + +function disableInput() { + document.getElementById("chat-control-url-btn").disabled = true; + document.getElementById("chat-control-send-btn").disabled = true; +} + +function activateInput() { + document.getElementById("chat-control-url-btn").disabled = false; + document.getElementById("chat-control-send-btn").disabled = false; +} + +function _showInfoInDialogueDetailContent(data) { + if (data === null) { + infoClusterize.clear(); + return; + } + + let priorityKeys = [ + "run_id", + "id", + "project", + "name", + "timestamp", + "role", + "url", + "metadata", + "content", + ]; + // Deal with the priority keys first + let infoRows = priorityKeys + .filter((key) => key in data) + .map((key) => _addKeyValueInfoRow(key, data[key])); + // Handle the rest of the keys + Object.keys(data) + .filter((key) => !priorityKeys.includes(key)) // Skip the priority keys + .forEach((key) => infoRows.push(_addKeyValueInfoRow(key, data[key]))); + + // Create table + infoClusterize.update(infoRows); +} + +function _obtainAllUrlFromFileList() { + let urls = []; + for (let i = 0; i < inputFileList.children.length; i++) { + // obtain from the title attribute + urls.push(inputFileList.children[i].title); + } + return urls; +} + +function addFileListItem(url) { + let svg; + switch (_determineFileType(url)) { + case "image": + svg = ` + + + + + `; + break; + case "video": + svg = ` + + + + `; + break; + case "audio": + svg = ``; + break; + default: + svg = ``; + break; + } + + let newItem = document.createElement("div"); + newItem.classList.add("chat-control-file-item"); + newItem.innerHTML = svg; + newItem.title = url; + + // Delete btn + const deleteBtn = document.createElement("div"); + deleteBtn.classList.add("chat-control-file-delete"); + // deleteBtn.innerHTML = ``; + deleteBtn.innerHTML = ``; + deleteBtn.onclick = function () { + inputFileList.removeChild(newItem); + }; + newItem.appendChild(deleteBtn); + + inputFileList.appendChild(newItem); + inputFileList.scrollLeft = + inputFileList.scrollWidth - inputFileList.clientWidth; +} + +function _showUrlPrompt() { + const userInput = prompt("Please enter a local or web URL:", ""); + + if (userInput !== null && userInput !== "") { + addFileListItem(userInput); + } +} + +function _isMacOS() { + return navigator.platform.toUpperCase().indexOf("MAC") >= 0; +} + +function initializeDashboardDetailDialoguePage(pRuntimeInfo) { + console.log("Initialize with runtime id: " + pRuntimeInfo.run_id); + + // Initialize the random seed generator by run_id + randomNumberGenerator = new SeededRand(_hashStringToSeed(pRuntimeInfo.run_id)); + + // Reset the flag + waitForUserInput = false; + + // Empty the record dictionary + nameToIconAndColor = {}; + + let sendBtn = document.getElementById( + "chat-control-send-btn" + ); + + let inputTextArea = document.getElementById( + "chat-input-textarea" + ) + + inputTextArea.addEventListener("keydown", function (e) { + if (e.key === "Enter" && !e.ctrlKey && !e.metaKey) { + e.preventDefault(); + + if (sendBtn.disabled === false) { + sendBtn.click(); + } + } else if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) { + e.preventDefault(); + + let cursorPosition = inputTextArea.selectionStart; + let textBeforeCursor = inputTextArea.value.substring(0, cursorPosition); + let textAfterCursor = inputTextArea.value.substring(cursorPosition); + + inputTextArea.value = textBeforeCursor + "\n" + textAfterCursor; + + // Update the cursor position + inputTextArea.selectionStart = inputTextArea.selectionEnd = cursorPosition + 1; + } + }) + + // Set the placeholder according to the platform + if (_isMacOS()) { + inputTextArea.placeholder = "Input message here, ⌘ + Enter for new line"; + } else { + inputTextArea.placeholder = "Input message here, Ctrl + Enter for new line"; + } + + // Load the chat template + loadChatTemplate() + .then(() => { + // Initialize the detail objects + currentRuntimeInfo = pRuntimeInfo; + currentMsgInfo = null; + currentAgentInfo = null; + + infoClusterize = new Clusterize({ + scrollId: "chat-detail", + contentId: "dialogue-detail-content", + }); + + disableInput(); + + // Fetch the chat history from backend + fetch( + "/api/messages/run/" + + pRuntimeInfo.run_id + + "?run_dir=" + + pRuntimeInfo.run_dir + ) + .then((response) => { + if (!response.ok) { + throw new Error("Failed to fetch messages data"); + } + return response.json(); + }) + .then((data) => { + // Load the chat history + let chatRows = data.map((msg, index) => + addChatRow(index, msg) + ); + var clusterize = new Clusterize({ + rows: chatRows, + scrollId: "chat-box", + contentId: "chat-box-content", + }); + + document.getElementById("chat-box-content"); + addEventListener("click", function (event) { + let target = event.target; + + while ( + target && + target !== this && + target instanceof Element + ) { + if (target.matches(".chat-row")) { + // Record the current message + currentMsgInfo = JSON.parse( + target.getAttribute("data-msg") + ); + + // Update web ui + showInDetail("Message"); + break; + } + target = target.parentNode; + } + }); + // Load the detail content in the right panel + // traverse all the keys in pRuntimeInfo and create a key-value row + currentRuntimeInfo = pRuntimeInfo; + showInDetail("Runtime"); + + var socket = io(); + socket.on("connect", () => { + // Tell flask server the web ui is ready + socket.emit("join", {run_id: pRuntimeInfo.run_id}); + + sendBtn.onclick = () => { + var message = document.getElementById( + "chat-input-textarea" + ).value; + + if (message === "") { + alert("Please input a message!"); + return; + } + + // Send the message to the flask server according to the current request + let url = _obtainAllUrlFromFileList(); + socket.emit("user_input_ready", { + run_id: userInputRequest.run_id, + agent_id: userInputRequest.agent_id, + name: userInputRequest.name, + url: url, + content: message, + }); + // Finish a user input + while (inputFileList.firstChild) { + inputFileList.removeChild(inputFileList.firstChild); + } + + waitForUserInput = false; + + console.log("Studio: send user_input_ready"); + + document.getElementById( + "chat-input-textarea" + ).value = ""; + disableInput(); + }; + }); + socket.on("display_message", (data) => { + if (data.run_id === pRuntimeInfo.run_id) { + console.log("Studio: receive display_message"); + let row = addChatRow( + clusterize.getRowsAmount(), + data + ); + clusterize.append([row]); + clusterize.refresh(); + + var scrollElem = + document.getElementById("chat-box"); + scrollElem.scrollTop = scrollElem.scrollHeight; + } + }); + socket.on("enable_user_input", (data) => { + // Require user input in web ui + console.log("Studio: receive enable_user_input"); + + // If already waiting for user input, just abort the request + if (!waitForUserInput) { + // If not waiting for user input, enable the send button + waitForUserInput = true; + // Record the current request + userInputRequest = data; + activateInput(); + document.getElementById( + "chat-input-name" + ).textContent = data.name; + } + }); + }) + .catch((error) => { + console.error("Failed to fetch messages data:", error); + }); + }) + .catch((error) => { + console.error("Failed to load chat template:", error); + }); +} + +function showInDetail(detailType) { + document.getElementById("dialogue-info-title").innerHTML = + detailType.toUpperCase(); + + document.getElementById("runtimeSwitchBtn").classList.remove("selected"); + document.getElementById("msgSwitchBtn").classList.remove("selected"); + document.getElementById("agentSwitchBtn").classList.remove("selected"); + + switch (detailType.toLowerCase()) { + case "runtime": + document + .getElementById("runtimeSwitchBtn") + .classList.add("selected"); + _showInfoInDialogueDetailContent(currentRuntimeInfo); + break; + case "message": + document.getElementById("msgSwitchBtn").classList.add("selected"); + _showInfoInDialogueDetailContent(currentMsgInfo); + break; + case "agent": + document.getElementById("agentSwitchBtn").classList.add("selected"); + _showInfoInDialogueDetailContent(currentAgentInfo); + break; + } +} + +function _hashStringToSeed(str) { + let hash = 0; + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; // Turn it into a 32bit integer + } + return hash; +} + +// Linear congruential generator +class SeededRand { + constructor(seed) { + this.modulus = 2147483648; // 2**31 + this.multiplier = 48271; // 常数 + this.increment = 0; // 常数 + this.seed = seed % this.modulus; + if (this.seed <= 0) this.seed += this.modulus - 1; + } + + nextFloat() { + this.seed = (this.seed * this.multiplier + this.increment) % this.modulus; + return this.seed / this.modulus; + } +} \ No newline at end of file diff --git a/src/agentscope/studio/static/js/dashboard-detail-invocation.js b/src/agentscope/studio/static/js/dashboard-detail-invocation.js new file mode 100644 index 000000000..34daf1ea7 --- /dev/null +++ b/src/agentscope/studio/static/js/dashboard-detail-invocation.js @@ -0,0 +1,75 @@ +let invocationEditor = null; + +function initializeDashboardDetailInvocationPage(runDir) { + // load monaco editor + require.config({ + paths: { + vs: "https://cdn.jsdelivr.net/npm/monaco-editor@latest/min/vs", + }, + }); + require(["vs/editor/editor.main"], function () { + invocationEditor = monaco.editor.create( + document.getElementById("invocation-content"), + { + language: "json", + theme: "vs-light", + minimap: { + enabled: false, + }, + scrollBeyondLastLine: false, + readOnly: true, + } + ); + }); + + // fetch data from server + fetch("/api/invocation?run_dir=" + runDir) + .then((response) => { + if (response.ok) { + return response.json(); + } else { + throw new Error("Failed to fetch invocation detail"); + } + }) + .then((data) => { + console.log(data); + var invocationTable = new Tabulator("#invocation-list", { + data: data, + columns: [ + { + title: "Model Wrapper", + field: "model_class", + editor: false, + vertAlign: "middle", + }, + { + title: "Timestamp", + field: "timestamp", + editor: false, + vertAlign: "middle", + }, + ], + layout: "fitColumns", + placeholder: + "
    No invocation records available.
    ", + initialSort: [ + { + column: "timestamp", + dir: "asc", + }, + ], + }); + + // Set up row click event + invocationTable.on("rowClick", function (e, row) { + // Jump to the run detail page + console.log(row.getData()); + invocationEditor.setValue( + JSON.stringify(row.getData(), null, 2) + ); + }); + }) + .catch((error) => { + console.error(error); + }); +} diff --git a/src/agentscope/studio/static/js/dashboard-detail.js b/src/agentscope/studio/static/js/dashboard-detail.js new file mode 100644 index 000000000..5898cdaf1 --- /dev/null +++ b/src/agentscope/studio/static/js/dashboard-detail.js @@ -0,0 +1,92 @@ +let runtimeInfo = null; +let currentContent = null; + +function initializeDashboardDetailPageByUrl(pageUrl) { + switch (pageUrl) { + case "static/html/dashboard-detail-dialogue.html": + initializeDashboardDetailDialoguePage(runtimeInfo); + break; + case "static/html/dashboard-detail-code.html": + initializeDashboardDetailCodePage(runtimeInfo["run_dir"]); + break; + case "static/html/dashboard-detail-invocation.html": + initializeDashboardDetailInvocationPage(runtimeInfo["run_dir"]); + break; + } +} + +// The dashboard detail page supports three tabs: +// 1. dialogue tab: the dialogue history of the runtime instance +// 2. code tab: the code files +// 3. invocation tab: the model invocation records +function loadDashboardDetailContent(pageUrl, javascriptUrl) { + const dialogueTabBtn = document.getElementById("dialogue-tab-btn"); + const codeTabBtn = document.getElementById("code-tab-btn"); + const invocationTabBtn = document.getElementById("invocation-tab-btn"); + if (currentContent === pageUrl) { + return; + } else { + currentContent = pageUrl; + } + // switch selected status + switch (pageUrl) { + case "static/html/dashboard-detail-dialogue.html": + dialogueTabBtn.classList.add("selected"); + codeTabBtn.classList.remove("selected"); + invocationTabBtn.classList.remove("selected"); + break; + case "static/html/dashboard-detail-code.html": + dialogueTabBtn.classList.remove("selected"); + codeTabBtn.classList.add("selected"); + invocationTabBtn.classList.remove("selected"); + break; + case "static/html/dashboard-detail-invocation.html": + dialogueTabBtn.classList.remove("selected"); + codeTabBtn.classList.remove("selected"); + invocationTabBtn.classList.add("selected"); + break; + } + + fetch(pageUrl, { cache: "no-store" }) + .then((response) => { + if (!response.ok) { + throw new Error("Connection error, cannot load the web page."); + } + return response.text(); + }) + .then((html) => { + // Load the page content + document.getElementById("detail-content").innerHTML = html; + + if (!isScriptLoaded(javascriptUrl)) { + let script = document.createElement("script"); + script.src = javascriptUrl; + script.onload = function () { + initializeDashboardDetailPageByUrl(pageUrl); + }; + document.head.appendChild(script); + } else { + initializeDashboardDetailPageByUrl(pageUrl); + } + }) + .catch((error) => { + console.error("Error encountered while loading page: ", error); + document.getElementById("content").innerHTML = + "

    Loading failed.

    " + error; + }); +} + +// Initialize the dashboard detail page, this function is the entry point of the dashboard detail page +function initializeDashboardDetailPage(pRuntimeInfo) { + // The default content of the dashboard detail page + console.log( + "Initialize dashboard detail page with runtime id: " + + pRuntimeInfo.run_id + ); + runtimeInfo = pRuntimeInfo; + currentContent = null; + loadDashboardDetailContent( + "static/html/dashboard-detail-dialogue.html", + "static/js/dashboard-detail-dialogue.js" + ); +} diff --git a/src/agentscope/studio/static/js/dashboard-runs.js b/src/agentscope/studio/static/js/dashboard-runs.js new file mode 100644 index 000000000..51be4960c --- /dev/null +++ b/src/agentscope/studio/static/js/dashboard-runs.js @@ -0,0 +1,115 @@ +// Search functionality for runs table +function allColumnFilter(data) { + let searchValue = document + .getElementById("runs-search-input") + .value.toLowerCase(); + + for (var field in data) { + if (data.hasOwnProperty(field)) { + var value = data[field]; + + if (value != null) { + value = value.toString().toLowerCase(); + if (value.includes(searchValue)) { + return true; + } + } + } + } + return false; +} + +function renderIconInRunsTable(cell, formatterParams, onRendered) { + let value = cell.getValue(); + switch (value) { + case "running": + return '
    running
    '; + + case "waiting": + return '
    waiting
    '; + + case "finished": + return '
    finished
    '; + + default: + return '
    unknown
    '; + } +} + +function initializeDashboardRunsPage() { + //TODO: fetch runs data from server + fetch("/api/runs/all") + .then((response) => { + if (!response.ok) { + throw new Error("Failed to fetch runs data"); + } + return response.json(); + }) + .then((data) => { + var runsTable = new Tabulator("#runs-table", { + data: data, + columns: [ + { + title: "Status", + field: "status", + editor: false, + vertAlign: "middle", + formatter: renderIconInRunsTable, + }, + { + title: "ID", + field: "run_id", + editor: false, + vertAlign: "middle", + }, + { + title: "Project", + field: "project", + editor: false, + vertAlign: "middle", + }, + { + title: "Name", + field: "name", + editor: false, + vertAlign: "middle", + }, + { + title: "Timestamp", + field: "timestamp", + editor: false, + vertAlign: "middle", + }, + ], + layout: "fitColumns", + initialSort: [{ column: "timestamp", dir: "desc" }], + }); + + // Search logic + document + .getElementById("runs-search-input") + .addEventListener("input", function (e) { + let searchValue = e.target.value; + if (searchValue) { + // Filter the table + runsTable.setFilter(allColumnFilter); + } else { + //Clear the filter + runsTable.clearFilter(); + } + }); + + // Set up row click event + runsTable.on("rowClick", function (e, row) { + // Jump to the run detail page + loadDetailPageInDashboardContent( + "static/html/dashboard-detail.html", + "static/js/dashboard-detail.js", + row.getData() + ); + }); + }) + .catch((error) => { + console.error(error); + }); +} diff --git a/src/agentscope/studio/static/js/dashboard.js b/src/agentscope/studio/static/js/dashboard.js new file mode 100644 index 000000000..ffaeeb43d --- /dev/null +++ b/src/agentscope/studio/static/js/dashboard.js @@ -0,0 +1,117 @@ +function loadRunsPageInDashboardContent(pageUrl, javascriptUrl) { + fetch(pageUrl) + .then((response) => { + if (!response.ok) { + throw new Error("Connection error, cannot load the web page."); + } + return response.text(); + }) + .then((html) => { + // Load the page content + document.getElementById("dashboard-content").innerHTML = html; + + // Load the javascript file + if (!isScriptLoaded(javascriptUrl)) { + console.log("Loading script from " + javascriptUrl + "..."); + let script = document.createElement("script"); + script.src = javascriptUrl; + script.onload = function () { + // Initialize the runs tables + initializeDashboardRunsPage(); + }; + document.head.appendChild(script); + } else { + // Initialize the runs tables + initializeDashboardRunsPage(); + } + + // Jump to specific run if url contains run_id + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.has("run_id")) { + var loc = window.location; + var baseUrl = loc.protocol + "//" + loc.host; + const run_id = urlParams.get("run_id"); + history.replaceState(null, null, baseUrl); + fetch("/api/runs/get/" + run_id) + .then((response) => { + console.log("fetch /api/runs/get/"); + + if (!response.ok) { + throw new Error( + "Runtime id " + run_id + " not found." + ); + } + return response.json(); + }) + .then((data) => { + console.log("get runs" + data); + loadDetailPageInDashboardContent( + "static/html/dashboard-detail.html", + "static/js/dashboard-detail.js", + data + ); + }); + } + }) + .catch((error) => { + console.error("Error encountered while loading page: ", error); + document.getElementById("content").innerHTML = + "

    Loading failed.

    " + error; + }); +} + +function loadDetailPageInDashboardContent(pageUrl, javascriptUrl, runtimeInfo) { + fetch(pageUrl) + .then((response) => { + if (!response.ok) { + throw new Error("Connection error, cannot load the web page."); + } + return response.text(); + }) + .then((html) => { + // Load the page content + document.getElementById("dashboard-content").innerHTML = html; + + if (!isScriptLoaded(javascriptUrl)) { + console.log("Loading script from " + javascriptUrl + "..."); + let script = document.createElement("script"); + script.src = javascriptUrl; + script.onload = function () { + initializeDashboardDetailPage(runtimeInfo); + }; + document.head.appendChild(script); + } else { + initializeDashboardDetailPage(runtimeInfo); + } + + // Update the title bar of the dashboard page + let titleBar = document.getElementById("dashboard-titlebar"); + // TODO: Add link to the dashboard page + titleBar.innerHTML += + '' + + "Runtime ID: " + + runtimeInfo.run_id + + ""; + let mainTitle = document.getElementById("dashboard-main-title"); + mainTitle.onclick = () => { + loadTabPage( + "static/html/dashboard.html", + "static/js/dashboard.js" + ); + }; + }) + .catch((error) => { + console.error("Error encountered while loading page: ", error); + document.getElementById("content").innerHTML = + "

    Loading failed.

    " + error; + }); +} + +// Initialize the dashboard page with a table of runtime instances +function initializeDashboardPage() { + // The default content of the dashboard page + loadRunsPageInDashboardContent( + "static/html/dashboard-runs.html", + "static/js/dashboard-runs.js" + ); +} diff --git a/src/agentscope/studio/static/js/index.js b/src/agentscope/studio/static/js/index.js new file mode 100644 index 000000000..ac1355dd5 --- /dev/null +++ b/src/agentscope/studio/static/js/index.js @@ -0,0 +1,137 @@ +const dashboardTabBtn = document.getElementById("dashboard-tab-btn"); +const workstationTabBtn = document.getElementById("workstation-tab-btn"); +const marketTabBtn = document.getElementById("market-tab-btn"); +const serverTabBtn = document.getElementById("server-tab-btn"); +const navigationBar = document.getElementById("navigation-bar"); + +let currentPageUrl = null; +let inGuidePage = true; +// When navigation bar collapsed, only when the mouse leaves the navigation bar, then navigation bar will be able to be expanded +let activeExpanded = false; + +// Check if the script is already loaded +function isScriptLoaded(src) { + return Array.from(document.scripts).some((script) => { + return ( + new URL(script.src).pathname === + new URL(src, window.location.href).pathname + ); + }); +} + +// After loading different pages, we need to call the initialization function of this page +function initializeTabPageByUrl(pageUrl) { + switch (pageUrl) { + case "static/html/dashboard.html": + initializeDashboardPage(); + break; + case "static/html/workstation_iframe.html": + let script = document.createElement("script"); + script.src = "static/js/workstation_iframe.js"; + document.head.appendChild(script); + break; + } +} + +// Loading different pages in index.html +function loadTabPage(pageUrl, javascriptUrl) { + fetch(pageUrl) + .then((response) => { + if (!response.ok) { + throw new Error("Connection error, cannot load the web page."); + } + return response.text(); + }) + .then((html) => { + currentPageUrl = pageUrl; + + // Hide the sidebar for other pages except the guide page + if (pageUrl === "static/html/index-guide.html") { + navigationBar.classList.remove("collapsed"); + inGuidePage = true; + } else { + navigationBar.classList.add("collapsed"); + inGuidePage = false; + activeExpanded = false; + } + + // Load the javascript file + if (javascriptUrl && !isScriptLoaded(javascriptUrl)) { + let script = document.createElement("script"); + script.src = javascriptUrl; + script.onload = function () { + // The first time we must initialize the page within the onload function to ensure the script is loaded + initializeTabPageByUrl(pageUrl); + }; + document.head.appendChild(script); + } else { + console.log("Script already loaded for " + javascriptUrl); + // If is not the first time, we can directly call the initialization function + initializeTabPageByUrl(pageUrl); + } + + // Load the page content + document.getElementById("content").innerHTML = html; + + // switch selected status of the tab buttons + switch (pageUrl) { + case "static/html/dashboard.html": + dashboardTabBtn.classList.add("selected"); + workstationTabBtn.classList.remove("selected"); + marketTabBtn.classList.remove("selected"); + serverTabBtn.classList.remove("selected"); + break; + + case "static/html/workstation_iframe.html": + dashboardTabBtn.classList.remove("selected"); + workstationTabBtn.classList.add("selected"); + marketTabBtn.classList.remove("selected"); + serverTabBtn.classList.remove("selected"); + break; + + case "static/html/market.html": + dashboardTabBtn.classList.remove("selected"); + workstationTabBtn.classList.remove("selected"); + marketTabBtn.classList.add("selected"); + serverTabBtn.classList.remove("selected"); + break; + + case "static/html/server.html": + dashboardTabBtn.classList.remove("selected"); + workstationTabBtn.classList.remove("selected"); + marketTabBtn.classList.remove("selected"); + serverTabBtn.classList.add("selected"); + break; + } + }) + .catch((error) => { + console.error("Error encountered while loading page: ", error); + document.getElementById("content").innerHTML = + "

    Loading failed.

    " + error; + }); +} + +loadTabPage("static/html/index-guide.html", null); + +document.addEventListener("DOMContentLoaded", function () { + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.has("run_id")) { + loadTabPage("static/html/dashboard.html", "static/js/dashboard.js"); + } +}); + +navigationBar.addEventListener("mouseenter", function () { + if (activeExpanded) { + navigationBar.classList.remove("collapsed"); + } +}); + +navigationBar.addEventListener("mouseleave", function () { + // In guide page, the navigation bar will not be collapsed + if (!inGuidePage) { + // Collapse the navigation bar when the mouse leaves the navigation bar + navigationBar.classList.add("collapsed"); + // Allow the navigation bar to be expanded when the mouse leaves the navigation bar to avoid expanding right after collapsing (when not finished collapsing yet) + activeExpanded = true; + } +}); diff --git a/src/agentscope/studio/static/js/workstation.js b/src/agentscope/studio/static/js/workstation.js new file mode 100644 index 000000000..88d71bfc1 --- /dev/null +++ b/src/agentscope/studio/static/js/workstation.js @@ -0,0 +1,2036 @@ +let editor; +let currentZIndex = 0; + +let mobile_item_selec; +let mobile_last_move; + +let importQueue; +let dataToImportStep; +let currentImportIndex; +let accumulatedImportData; +let descriptionStep; + + +let nameToHtmlFile = { + 'welcome': 'welcome.html', + 'dashscope_chat': 'model-dashscope-chat.html', + 'openai_chat': 'model-openai-chat.html', + 'post_api_chat': 'model-post-api-chat.html', + 'post_api_dall_e': 'model-post-api-dall-e.html', + 'Message': 'message-msg.html', + 'DialogAgent': 'agent-dialogagent.html', + 'UserAgent': 'agent-useragent.html', + 'TextToImageAgent': 'agent-texttoimageagent.html', + 'DictDialogAgent': 'agent-dictdialogagent.html', + 'ReActAgent': 'agent-reactagent.html', + 'Placeholder': 'pipeline-placeholder.html', + 'MsgHub': 'pipeline-msghub.html', + 'SequentialPipeline': 'pipeline-sequentialpipeline.html', + 'ForLoopPipeline': 'pipeline-forlooppipeline.html', + 'WhileLoopPipeline': 'pipeline-whilelooppipeline.html', + 'IfElsePipeline': 'pipeline-ifelsepipeline.html', + 'SwitchPipeline': 'pipeline-switchpipeline.html', + 'BingSearchService': 'service-bing-search.html', + 'GoogleSearchService': 'service-google-search.html', + 'PythonService': 'service-execute-python.html', + 'ReadTextService': 'service-read-text.html', + 'WriteTextService': 'service-write-text.html', +} + +// Cache the loaded html files +let htmlCache = {}; + +// When clicking the sidebar item, it will expand/collapse the next content +function onClickSidebarSubItem(element) { + element.classList.toggle("active"); + let content = element.nextElementSibling; + if (content.style.display === "block") { + content.style.display = "none"; + } else { + content.style.display = "block"; + } +} + + +// Load html source code dynamically +async function fetchHtml(fileName) { + try { + let filePath = 'static/html-drag-components/' + fileName; + const response = await fetch(filePath); + if (!response.ok) { + throw new Error('Fail to load ' + filePath); + } + return await response.text(); + } catch (error) { + return error; + } +} + + +async function initializeWorkstationPage() { + console.log("Initialize Workstation Page") + // Initialize the Drawflow editor + let id = document.getElementById("drawflow"); + editor = new Drawflow(id); + editor.reroute = true; + editor.createCurvature = function createCurvature(start_pos_x, start_pos_y, end_pos_x, end_pos_y, curvature_value, type) { + var line_x = start_pos_x; + var line_y = start_pos_y; + var x = end_pos_x; + var y = end_pos_y; + var curvature = curvature_value; + //type openclose open close other + switch (type) { + case 'open': + if (start_pos_x >= end_pos_x) { + var hx1 = line_x + Math.abs(x - line_x) * curvature; + var hx2 = x - Math.abs(x - line_x) * (curvature * -1); + } else { + var hx1 = line_x + Math.abs(x - line_x) * curvature; + var hx2 = x - Math.abs(x - line_x) * curvature; + } + return ' M ' + line_x + ' ' + line_y + ' C ' + hx1 + ' ' + line_y + ' ' + hx2 + ' ' + y + ' ' + x + ' ' + y; + + case 'close': + if (start_pos_x >= end_pos_x) { + var hx1 = line_x + Math.abs(x - line_x) * (curvature * -1); + var hx2 = x - Math.abs(x - line_x) * curvature; + } else { + var hx1 = line_x + Math.abs(x - line_x) * curvature; + var hx2 = x - Math.abs(x - line_x) * curvature; + } //M0 75H10L5 80L0 75Z + return ' M ' + line_x + ' ' + line_y + ' C ' + hx1 + ' ' + line_y + ' ' + hx2 + ' ' + y + ' ' + x + ' ' + y + ' M ' + (x - 11) + ' ' + y + ' L' + (x - 20) + ' ' + (y - 5) + ' L' + (x - 20) + ' ' + (y + 5) + 'Z'; + + case 'other': + if (start_pos_x >= end_pos_x) { + var hx1 = line_x + Math.abs(x - line_x) * (curvature * -1); + var hx2 = x - Math.abs(x - line_x) * (curvature * -1); + } else { + var hx1 = line_x + Math.abs(x - line_x) * curvature; + var hx2 = x - Math.abs(x - line_x) * curvature; + } + return ' M ' + line_x + ' ' + line_y + ' C ' + hx1 + ' ' + line_y + ' ' + hx2 + ' ' + y + ' ' + x + ' ' + y; + + default: + var hx1 = line_x + Math.abs(x - line_x) * curvature; + var hx2 = x - Math.abs(x - line_x) * curvature; + + return ' M ' + line_x + ' ' + line_y + ' C ' + hx1 + ' ' + line_y + ' ' + hx2 + ' ' + y + ' ' + x + ' ' + y + ' M ' + (x - 11) + ' ' + y + ' L' + (x - 20) + ' ' + (y - 5) + ' L' + (x - 20) + ' ' + (y + 5) + 'Z'; + } + } + editor.start(); + editor.zoom_out(); + + let welcome = await fetchHtml('welcome.html'); + const welcomeID = editor.addNode('welcome', 0, 0, 50, 50, 'welcome', {}, welcome); + setupNodeListeners(welcomeID); + + editor.on('nodeCreated', function (id) { + console.log("Node created " + id); + disableButtons(); + makeNodeTop(id); + setupNodeListeners(id); + setupNodeCopyListens(id); + addEventListenersToNumberInputs(id); + setupTextInputListeners(id); + }) + + editor.on('nodeRemoved', function (id) { + console.log("Node removed " + id); + disableButtons(); + Object.keys(editor.drawflow.drawflow[editor.module].data).forEach(nodeKey => { + var node = editor.drawflow.drawflow[editor.module].data[nodeKey]; + var nodeData = + editor.drawflow.drawflow[editor.module].data[nodeKey].data; + console.log("nodeKey", nodeKey); + console.log("node", node); + console.log("nodeData", nodeData); + console.log("id", id); + + if (nodeData && nodeData.copies) { + console.log("Array.isArray(nodeData.copies)", Array.isArray(nodeData.copies)) + if (nodeData.copies.includes(id)) { + console.log("nodeData.copies", nodeData.copies); + console.log("nodeData.copies.includes(id)", + nodeData.copies.includes(id)); + var index = nodeData.copies.indexOf(id); + console.log("index", index); + if (index > -1) { + nodeData.copies.splice(index, 1); + editor.updateNodeDataFromId(nodeKey, nodeData); + } + } + } + }) + }) + + editor.on('nodeSelected', function (id) { + console.log("Node selected " + id); + makeNodeTop(id); + }) + + editor.on('moduleCreated', function (name) { + console.log("Module Created " + name); + }) + + editor.on('moduleChanged', function (name) { + console.log("Module Changed " + name); + }) + + editor.on('connectionCreated', function (connection) { + console.log('Connection created'); + console.log(connection); + disableButtons(); + }) + + editor.on('connectionRemoved', function (connection) { + console.log('Connection removed'); + console.log(connection); + disableButtons(); + }) + + editor.on('mouseMove', function (position) { + // console.log('Position mouse x:' + position.x + ' y:' + position.y); + }) + + editor.on('nodeMoved', function (id) { + console.log("Node moved " + id); + disableButtons(); + }) + + editor.on('zoom', function (zoom) { + console.log('Zoom level ' + zoom); + }) + + editor.on('translate', function (position) { + console.log('Translate x:' + position.x + ' y:' + position.y); + }) + + editor.on('addReroute', function (id) { + console.log("Reroute added " + id); + }) + + editor.on('removeReroute', function (id) { + console.log("Reroute removed " + id); + }) + + editor.selectNode = function (id) { + if (this.node_selected != null) { + this.node_selected.classList.remove("selected"); + if (this.node_selected !== this.ele_selected) { + this.dispatch('nodeUnselected', true); + } + } + const element = document.querySelector(`#node-${id}`); + this.ele_selected = element; + this.node_selected = element; + this.node_selected.classList.add("selected"); + if (this.node_selected !== this.ele_selected) { + this.node_selected = element; + this.node_selected.classList.add('selected'); + this.dispatch('nodeSelected', this.ele_selected.id.slice(5)); + } + console.log(id) + } + + let last_x = 0; + let last_y = 0; + let dragElementHover = null; + + editor.on("mouseMove", ({x, y}) => { + const hoverEles = document.elementsFromPoint(x, y); + const nextGroup = hoverEles.find(ele => ele.classList.contains('GROUP') && (!editor.node_selected || ele.id !== editor.node_selected.id)); + + if (nextGroup) { + if (dragElementHover !== nextGroup) { + if (dragElementHover) { + dragElementHover.classList.remove("hover-drop"); + } + dragElementHover = nextGroup; + dragElementHover.classList.add("hover-drop"); + } + } else if (dragElementHover) { + dragElementHover.classList.remove("hover-drop"); + dragElementHover = null; + } + + if (editor.node_selected && editor.drag) { + const selectedNodeId = editor.node_selected.id.slice(5); + var dx = (last_x - x) * editor.precanvas.clientWidth / (editor.precanvas.clientWidth * editor.zoom); + var dy = (last_y - y) * editor.precanvas.clientHeight / (editor.precanvas.clientHeight * editor.zoom); + + if (editor.node_selected.classList.contains("GROUP")) { + moveGroupNodes(selectedNodeId, -dx, -dy); + } + } else { + if (dragElementHover) { + dragElementHover.classList.remove("hover-drop"); + dragElementHover = null; + } + } + + last_x = x; + last_y = y; + }); + + editor.on("nodeMoved", (id) => { + const dragNode = id; + if (dragElementHover !== null) { + const dropNode = dragElementHover.id.slice(5); + if (dragNode !== dropNode) { + removeOfGroupNode(dragNode); + dragElementHover.classList.remove("hover-drop"); + const dropNodeInfo = editor.getNodeFromId(dropNode); + const dropNodeInfoData = dropNodeInfo.data; + if (dropNodeInfoData.elements.indexOf(dragNode) === -1) { + dropNodeInfoData.elements.push(dragNode); + editor.updateNodeDataFromId(dropNode, dropNodeInfoData); + // remove connections + editor.removeConnectionNodeId('node-' + id); + // Hide the ports when node is inside the group + togglePortsDisplay(dragNode, 'none'); + const dragNodeData = editor.getNodeFromId(dragNode); + if (dragNodeData.class !== "GROUP") { + collapseNode(dragNode); + } + } + } + dragElementHover = null; + } else { + // If the node is moved outside of any group, show the ports + togglePortsDisplay(dragNode, ''); + removeOfGroupNode(dragNode); + } + }) + + editor.on("nodeRemoved", (id) => { + removeOfGroupNode(id); + }); + + /* DRAG EVENT */ + + /* Mouse and Touch Actions */ + + var elements = document.getElementsByClassName('workstation-sidebar-dragitem'); + for (var i = 0; i < elements.length; i++) { + elements[i].addEventListener('touchend', drop, false); + elements[i].addEventListener('touchmove', positionMobile, false); + elements[i].addEventListener('touchstart', drag, false); + } + + mobile_item_selec = ''; + mobile_last_move = null; + + importQueue = []; + currentImportIndex = 0; + accumulatedImportData = {}; + descriptionStep = []; + console.log("importQueue", importQueue) + + document.getElementById('surveyButton').addEventListener('click', function () { + window.open('https://survey.aliyun.com/apps/zhiliao/vgpTppn22', '_blank'); + }); + + document.getElementById('surveyClose').addEventListener('click', function () { + hideSurveyModal(); + }); + + setTimeout(showSurveyModal, 30000); +} + + +function makeNodeTop(id) { + const node = document.getElementById(`node-${id}`); + const nodeInfo = editor.getNodeFromId(id); + + if (nodeInfo) { + console.log("currentZIndex: " + currentZIndex); + currentZIndex += 1; + node.style.zIndex = currentZIndex; + + if (nodeInfo.class === 'GROUP') { + nodeInfo.data.elements.forEach((elementId) => { + makeNodeTop(elementId); + }); + } + } +} + + +function moveGroupNodes(groupId, dx, dy) { + const groupInfo = editor.getNodeFromId(groupId); + const elements = groupInfo.data.elements || []; + elements.forEach(eleId => { + const eleNode = document.getElementById(`node-${eleId}`); + const eleNodeInfo = editor.getNodeFromId(eleId); + + if (eleNode) { + const nodeData = editor.drawflow.drawflow[editor.module].data[eleId]; + const newPosX = nodeData.pos_x + dx; + const newPosY = nodeData.pos_y + dy; + + eleNode.style.left = newPosX + "px"; + eleNode.style.top = newPosY + "px"; + + if (editor.drawflow.drawflow[editor.module] && + editor.drawflow.drawflow[editor.module].data && + editor.drawflow.drawflow[editor.module].data[eleId]) { + editor.drawflow.drawflow[editor.module].data[eleId].pos_x = newPosX; + editor.drawflow.drawflow[editor.module].data[eleId].pos_y = newPosY; + } + + editor.updateConnectionNodes(`node-${eleId}`); + } + + if (eleNodeInfo.class && eleNodeInfo.class === "GROUP") { + moveGroupNodes(eleId, dx, dy); + } + }); +} + + +function collapseNode(nodeId) { + const nodeElement = document.getElementById(`node-${nodeId}`); + const contentBox = nodeElement.querySelector('.box'); + const toggleArrow = nodeElement.querySelector('.toggle-arrow'); + + contentBox.classList.add('hidden'); + toggleArrow.textContent = "\u25BC"; +} + + +function togglePortsDisplay(nodeId, displayStyle) { + const nodeElement = document.querySelector(`#node-${nodeId}`); + if (nodeElement) { + const inputs = nodeElement.querySelectorAll('.inputs .input'); + const outputs = nodeElement.querySelectorAll('.outputs .output'); + inputs.forEach(input => { + input.style.display = displayStyle; + }); + outputs.forEach(output => { + output.style.display = displayStyle; + }); + } +} + + +function removeOfGroupNode(id) { + Object.keys(editor.drawflow.drawflow[editor.module].data).forEach(ele => { + if (editor.drawflow.drawflow[editor.module].data[ele].class === "GROUP") { + const findIndex = editor.drawflow.drawflow[editor.module].data[ele].data.elements.indexOf(id); + if (findIndex !== -1) { + editor.drawflow.drawflow[editor.module].data[ele].data.elements.splice(findIndex, 1); + } + } + }) +} + + +function positionMobile(ev) { + mobile_last_move = ev; +} + + +function allowDrop(ev) { + ev.preventDefault(); +} + + +function drag(ev) { + if (ev.type === "touchstart") { + mobile_item_selec = ev.target.closest(".workstation-sidebar-dragitem").getAttribute('data-node'); + } else { + ev.dataTransfer.setData("node", ev.target.getAttribute('data-node')); + } +} + + +function drop(ev) { + if (ev.type === "touchend") { + var parentdrawflow = document.elementFromPoint(mobile_last_move.touches[0].clientX, mobile_last_move.touches[0].clientY).closest("#drawflow"); + if (parentdrawflow != null) { + addNodeToDrawFlow(mobile_item_selec, mobile_last_move.touches[0].clientX, mobile_last_move.touches[0].clientY); + } + mobile_item_selec = ''; + } else { + ev.preventDefault(); + var data = ev.dataTransfer.getData("node"); + addNodeToDrawFlow(data, ev.clientX, ev.clientY); + } + +} + + +async function addNodeToDrawFlow(name, pos_x, pos_y) { + if (editor.editor_mode === 'fixed') { + return false; + } + pos_x = pos_x * (editor.precanvas.clientWidth / (editor.precanvas.clientWidth * editor.zoom)) - (editor.precanvas.getBoundingClientRect().x * (editor.precanvas.clientWidth / (editor.precanvas.clientWidth * editor.zoom))); + pos_y = pos_y * (editor.precanvas.clientHeight / (editor.precanvas.clientHeight * editor.zoom)) - (editor.precanvas.getBoundingClientRect().y * (editor.precanvas.clientHeight / (editor.precanvas.clientHeight * editor.zoom))); + + var htmlSourceCode = await fetchHtmlSourceCodeByName(name); + + switch (name) { + // Workflow-Model + case 'dashscope_chat': + const dashscope_chatId = editor.addNode('dashscope_chat', 0, 0, pos_x, + pos_y, + 'dashscope_chat', { + "args": + { + "config_name": '', + "model_name": '', + "api_key": '', + "temperature": 0.0, + "seed": 0, + "model_type": 'dashscope_chat', + "messages_key": 'input' + } + }, + htmlSourceCode); + addEventListenersToNumberInputs(dashscope_chatId); + break; + + case 'openai_chat': + const openai_chatId = editor.addNode('openai_chat', 0, 0, pos_x, + pos_y, + 'openai_chat', { + "args": + { + "config_name": '', + "model_name": '', + "api_key": '', + "temperature": 0.0, + "seed": 0, + "model_type": 'openai_chat', + "messages_key": 'messages' + } + }, + htmlSourceCode); + addEventListenersToNumberInputs(openai_chatId); + break; + + case 'post_api_chat': + const post_api_chatId = editor.addNode('post_api_chat', 0, 0, pos_x, pos_y, + 'post_api_chat', { + "args": + { + "config_name": '', + "api_url": '', + "headers": { + "content_type": 'application/json', + "authorization": '', + }, + "json_args": { + "model": '', + "temperature": 0.0, + "seed": 0, + }, + "model_type": 'post_api_chat', + "messages_key": 'messages' + } + }, + htmlSourceCode); + addEventListenersToNumberInputs(post_api_chatId); + break; + + case 'post_api_dall_e': + const post_api_dall_eId = editor.addNode('post_api_dall_e', 0, + 0, + pos_x, pos_y, + 'post_api_dall_e', { + "args": + { + "config_name": '', + "api_url": '', + "headers": { + "content_type": 'application/json', + "authorization": '', + }, + "json_args": { + "model": '', + "n": 1, + "size": "", + "temperature": 0.0, + "seed": 0, + }, + "model_type": 'post_api_dall_e', + "messages_key": 'prompt' + } + }, + htmlSourceCode); + addEventListenersToNumberInputs(post_api_dall_eId); + break; + + // Message + case 'Message': + editor.addNode('Message', 1, 1, pos_x, + pos_y, 'Message', { + "args": + { + "name": '', + "content": '', + "url": '' + } + }, htmlSourceCode); + break; + + // Workflow-Agent + case 'DialogAgent': + const DialogAgentID = editor.addNode('DialogAgent', 1, 1, + pos_x, + pos_y, + 'DialogAgent', { + "args": { + "name": '', + "sys_prompt": '', + "model_config_name": '' + } + }, htmlSourceCode); + var nodeElement = document.querySelector(`#node-${DialogAgentID} .node-id`); + if (nodeElement) { + nodeElement.textContent = DialogAgentID; + } + break; + + case 'UserAgent': + const UserAgentID = editor.addNode('UserAgent', 1, 1, pos_x, + pos_y, 'UserAgent', { + "args": {"name": 'User'} + }, htmlSourceCode); + var nodeElement = document.querySelector(`#node-${UserAgentID} .node-id`); + if (nodeElement) { + nodeElement.textContent = UserAgentID; + } + break; + + case 'TextToImageAgent': + const TextToImageAgentID = + editor.addNode('TextToImageAgent', 1, + 1, pos_x, pos_y, + 'TextToImageAgent', { + "args": { + "name": '', + "model_config_name": '' + } + }, htmlSourceCode); + var nodeElement = document.querySelector(`#node-${TextToImageAgentID} .node-id`); + if (nodeElement) { + nodeElement.textContent = TextToImageAgentID; + } + break; + + case 'DictDialogAgent': + const DictDialogAgentID = editor.addNode('DictDialogAgent', 1, + 1, pos_x, pos_y, + 'DictDialogAgent', { + "args": { + "name": '', + "sys_prompt": '', + "model_config_name": '', + "parse_func": '', + "fault_handler": '', + "max_retries": 3, + } + }, htmlSourceCode); + var nodeElement = document.querySelector(`#node-${DictDialogAgentID} .node-id`); + if (nodeElement) { + nodeElement.textContent = DictDialogAgentID; + } + break; + + case 'ReActAgent': + const ReActAgentID = editor.addNode('ReActAgent', 1, 1, pos_x, pos_y, + 'GROUP', { + elements: [], + "args": { + "name": '', + "sys_prompt": '', + "model_config_name": '', + "max_iters": 10, + "verbose": '', + } + }, htmlSourceCode); + var nodeElement = document.querySelector(`#node-${ReActAgentID} .node-id`); + if (nodeElement) { + nodeElement.textContent = ReActAgentID; + } + break; + + // Workflow-Pipeline + case 'Placeholder': + editor.addNode('Placeholder', 1, 1, + pos_x, pos_y, 'Placeholder', {}, htmlSourceCode); + break; + + case 'MsgHub': + editor.addNode('MsgHub', 1, 1, pos_x, pos_y, + 'GROUP', { + elements: [], + "args": { + "announcement": { + "name": '', + "content": '' + } + } + }, htmlSourceCode); + break; + + case 'SequentialPipeline': + editor.addNode('SequentialPipeline', 1, 1, pos_x, pos_y, + 'GROUP', {elements: []}, htmlSourceCode); + break; + + case 'ForLoopPipeline': + const ForLoopPipelineID = + editor.addNode('ForLoopPipeline', 1, 1, pos_x, pos_y, + 'GROUP', { + elements: [], + "args": { + "max_loop": 3, + "break_func": '' + } + }, htmlSourceCode); + addEventListenersToNumberInputs(ForLoopPipelineID); + break; + + case 'WhileLoopPipeline': + editor.addNode('WhileLoopPipeline', 1, 1, pos_x, pos_y, + 'GROUP', { + elements: [], + "args": { + "condition_func": '' + } + }, htmlSourceCode); + break; + + case 'IfElsePipeline': + editor.addNode('IfElsePipeline', 1, + 1, pos_x, pos_y, 'GROUP', { + elements: [], args: { + "condition_func": '' + } + }, htmlSourceCode); + break; + + case 'SwitchPipeline': + const SwitchPipelineID = editor.addNode('SwitchPipeline', 1, 1, pos_x, pos_y, 'GROUP', { + elements: [], args: { + "condition_func": '', + "cases": [], + } + }, htmlSourceCode); + setupSwitchPipelineListeners(SwitchPipelineID); + const caseContainer = document.querySelector(`#node-${SwitchPipelineID} .case-container`); + if (caseContainer) { + addDefaultCase(caseContainer); + } else { + console.error(`Case container not found in node-${SwitchPipelineID}.`); + } + break; + + // Workflow-Service + case 'BingSearchService': + editor.addNode('BingSearchService', 0, 0, + pos_x, pos_y, 'BingSearchService', { + "args": { + "api_key": "", + "num_results": 3, + } + }, htmlSourceCode); + break; + + case 'GoogleSearchService': + editor.addNode('GoogleSearchService', 0, 0, + pos_x, pos_y, 'GoogleSearchService', { + "args": { + "api_key": "", + "cse_id": "", + "num_results": 3, + } + }, htmlSourceCode); + break; + + case 'PythonService': + editor.addNode('PythonService', 0, 0, + pos_x, pos_y, 'PythonService', {}, htmlSourceCode); + break; + + case 'ReadTextService': + editor.addNode('ReadTextService', 0, 0, + pos_x, pos_y, 'ReadTextService', {}, htmlSourceCode); + break; + + case 'WriteTextService': + editor.addNode('WriteTextService', 0, 0, + pos_x, pos_y, 'WriteTextService', {}, htmlSourceCode); + break; + + default: + } +} + +function setupTextInputListeners(nodeId) { + const newNode = document.getElementById(`node-${nodeId}`); + if (newNode) { + const stopPropagation = function(event) { + event.stopPropagation(); + }; + newNode.addEventListener('mousedown', function(event) { + const target = event.target; + if (target.tagName === 'TEXTAREA' || target.tagName === 'INPUT') { + stopPropagation(event); + } + }, false); + } +} + +function toggleAdvanced() { + var advancedBox = document.querySelector('.advanced-box'); + if (advancedBox.style.display === "none") { + advancedBox.style.display = "block"; + } else { + advancedBox.style.display = "none"; + } +} + + +function handleInputChange(event) { + const input = event.target; + + if (input.type === 'number') { + const value = input.value; + const floatValue = parseFloat(value); + const nodeId = input.closest('.drawflow_content_node').parentElement.id.slice(5); + + if (!isNaN(floatValue)) { + const node = editor.getNodeFromId(nodeId); + const dataAttributes = + Array.from(input.attributes).filter(attr => + attr.name.startsWith('df-args-')); + dataAttributes.forEach(attr => { + const attrName = attr.name; + if (attrName.startsWith('df-args-json_args-')) { + const dataAttribute = attrName.substring(18) + if + (node.data.args.json_args.hasOwnProperty(dataAttribute)) { + node.data.args.json_args[dataAttribute] = floatValue; + editor.updateNodeDataFromId(nodeId, node.data); + } + } else { + const dataAttribute = attrName.substring(8); + if (node.data.args.hasOwnProperty(dataAttribute)) { + node.data.args[dataAttribute] = floatValue; + editor.updateNodeDataFromId(nodeId, node.data); + } + } + }); + } else { + console.error("Invalid input value:", value); + } + } +} + + +function addEventListenersToNumberInputs(nodeId) { + const nodeElement = document.getElementById(`node-${nodeId}`); + if (nodeElement) { + const numberInputs = nodeElement.querySelectorAll('input[type=number]'); + numberInputs.forEach(input => { + input.addEventListener('change', handleInputChange); + }); + } +} + + +function validateTemperature(input) { + const value = input.valueAsNumber; + if (isNaN(value) || value < 0 || value >= 2) { + input.setCustomValidity('Temperature must be greater or equal than 0 and less than 2!'); + } else { + input.setCustomValidity(''); + } + input.reportValidity(); +} + + +function validateSeed(input) { + const value = parseInt(input.value, 10); // Parse the value as an integer. + if (isNaN(value) || value < 0 || !Number.isInteger(parseFloat(input.value))) { + input.setCustomValidity('Seed must be a non-negative integer!'); + } else { + input.setCustomValidity(''); + } + input.reportValidity(); +} + + +document.addEventListener('input', function (event) { + const input = event.target; + + if (input.getAttribute('df-args-temperature') !== null || + input.getAttribute('df-args-json_args-temperature') !== null) { + validateTemperature(input); + } + + if (input.getAttribute('df-args-seed') !== null || + input.getAttribute('df-args-json_args-seed') !== null) { + validateSeed(input); + } +}); + +var transform = ''; + + +function updateReadmeAndTrimExtrasInHTML(htmlString, nodeId) { + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, 'text/html'); + const containerDiv = doc.body.firstChild; + + removeNonReadmeChildren(containerDiv); + updateReadmeContent(containerDiv, nodeId); + + return containerDiv.innerHTML; +} + +function updateReadmeContent(containerDiv, nodeId) { + const readmeDiv = containerDiv.querySelector('.readme'); + if (readmeDiv) { + console.log("readmeDiv", readmeDiv); + + let newDiv = document.createElement('div'); + newDiv.innerHTML = `Copy from Node ID: ${nodeId}`; + readmeDiv.appendChild(newDiv); + + console.log("readmeDiv after", readmeDiv); + } +} + +function removeNonReadmeChildren(containerDiv) { + const boxDiv = containerDiv.querySelector('.box'); + if (boxDiv) { + boxDiv.querySelectorAll('*:not(.readme)').forEach(child => child.remove()); + } +} + +function createNodeHTML(node, isCopy, originalNodeId) { + let modifiedHtml = isCopy ? processNodeCopyHTML(node.html) : node.html; + return updateReadmeAndTrimExtrasInHTML(modifiedHtml, originalNodeId); +} + +function processNodeCopyHTML(htmlString) { + const parser = new DOMParser(); + const doc = parser.parseFromString(htmlString, 'text/html'); + + ['.copy-button', 'div .node-id'].forEach(selector => { + const element = doc.querySelector(selector); + if (element) element.remove(); + }); + + return doc.body.innerHTML; +} + +function copyNode(originalNodeId) { + const originalNode = editor.getNodeFromId(originalNodeId); + originalNode.data.copies = originalNode.data.copies || []; + + const newNodeHTML = createNodeHTML(originalNode, true, originalNodeId); + const [posX, posY] = [originalNode.pos_x + 30, originalNode.pos_y + 30]; + + editor.addNode("CopyNode", + Object.keys(originalNode.inputs).length, + Object.keys(originalNode.outputs).length, + posX, posY, 'node-' + originalNode.name, {elements: [originalNodeId.toString()]}, + newNodeHTML); +} + +function setupNodeCopyListens(nodeId) { + const newNode = document.getElementById(`node-${nodeId}`); + if (newNode) { + const copyButton = newNode.querySelector('.copy-button'); + if (copyButton) { + copyButton.addEventListener('click', function () { + copyNode(nodeId); + }); + } + } +} + +function hideShowGroupNodes(groupId, show) { + const groupInfo = editor.getNodeFromId(groupId); + if (groupInfo && groupInfo.class === 'GROUP') { + groupInfo.data.elements.forEach(elementNodeId => { + const elementNode = document.getElementById(`node-${elementNodeId}`); + const childNodeInfo = editor.getNodeFromId(elementNodeId); + if (elementNode) { + elementNode.style.display = show ? '' : 'none'; + } + if (childNodeInfo.class === 'GROUP') { + hideShowGroupNodes(elementNodeId, show); + } + }); + } +} + +function setupNodeListeners(nodeId) { + const newNode = document.getElementById(`node-${nodeId}`); + if (newNode) { + + const titleBox = newNode.querySelector('.title-box'); + const contentBox = newNode.querySelector('.box') || + newNode.querySelector('.box-highlight'); + + // Add resize handle to the bottom right corner of the node + const resizeHandleSE = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + + const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); + path.setAttribute('d', 'M932.37602347 512.88874453l-420.37602347 420.37602347 56.43525867 56.43525867 420.37602453-420.37602347-56.43525973-56.43525867z m-3.55497707-474.58942293L34.29997333 933.264768l56.43525867 56.43525867L985.25630613 95.1789536l-56.43525973-56.879632z'); + + resizeHandleSE.setAttribute('viewBox', '0 0 1024 1024'); + resizeHandleSE.appendChild(path); + + resizeHandleSE.classList.add('resize-handle-se'); + + contentBox.appendChild(resizeHandleSE); + + const toggleArrow = newNode.querySelector('.toggle-arrow'); + + if (toggleArrow && contentBox && titleBox) { + toggleArrow.addEventListener('click', function () { + contentBox.classList.toggle('hidden'); + + if (contentBox.classList.contains('hidden')) { + toggleArrow.textContent = "\u25BC"; + hideShowGroupNodes(nodeId, false); + } else { + toggleArrow.textContent = "\u25B2"; + hideShowGroupNodes(nodeId, true); + } + editor.updateConnectionNodes('node-' + nodeId); + }); + + let startX, startY, startWidth, startHeight; + + resizeHandleSE.addEventListener('mousedown', function (e) { + e.stopPropagation(); + document.addEventListener('mousemove', doDragSE, false); + document.addEventListener('mouseup', stopDragSE, false); + + startX = e.clientX; + startY = e.clientY; + startWidth = parseInt(document.defaultView.getComputedStyle(contentBox).width, 10); + startHeight = parseInt(document.defaultView.getComputedStyle(contentBox).height, 10); + }); + + function doDragSE(e) { + newNode.style.width = 'auto'; + + const newWidth = (startWidth + e.clientX - startX) ; + if (newWidth > 200) { + contentBox.style.width = newWidth + 'px'; + titleBox.style.width = newWidth + 'px'; + } + + const newHeight = (startHeight + e.clientY - startY); + contentBox.style.height = newHeight + 'px'; + + editor.updateConnectionNodes('node-' + nodeId); + } + + function stopDragSE(e) { + document.removeEventListener('mousemove', doDragSE, false); + document.removeEventListener('mouseup', stopDragSE, false); + } + + } + } +} + +function setupSwitchPipelineListeners(nodeId) { + const newNode = document.getElementById(`node-${nodeId}`); + if (!newNode) { + console.error(`Node with ID node-${nodeId} not found.`); + return; + } + const addCaseButton = newNode.querySelector('.add-case'); + if (!addCaseButton) { + console.error(`Add Case button not found in node-${nodeId}.`); + return; + } + addCaseButton.addEventListener('click', function () { + var caseContainer = newNode.querySelector('.case-container'); + if (!caseContainer) { + console.error(`Case container not found in node-${nodeId}.`); + return; + } + var defaultCaseElement = caseContainer.querySelector('.default-case'); + if (defaultCaseElement) { + caseContainer.removeChild(defaultCaseElement); + } + var caseCount = caseContainer.getElementsByClassName('case-placeholder').length; + var caseElement = document.createElement('div'); + caseElement.classList.add('case-placeholder'); + + var caseText = document.createTextNode(`Case ${caseCount + 1}: `); + caseElement.appendChild(caseText); + + var inputElement = document.createElement('input'); + inputElement.type = 'text'; + inputElement.placeholder = `Case Pattern`; + + inputElement.dataset.caseIndex = caseCount; + + caseElement.appendChild(inputElement); + caseContainer.appendChild(caseElement); + + inputElement.addEventListener('input', function (e) { + var nodeData = editor.getNodeFromId(nodeId).data; + console.log("nodeData", nodeData); + var index = e.target.dataset.caseIndex; + console.log("index", index); + nodeData.args.cases[index] = e.target.value; + editor.updateNodeDataFromId(nodeId, nodeData); + }); + + editor.getNodeFromId(nodeId).data.args.cases.push(''); + + addDefaultCase(caseContainer); + editor.updateConnectionNodes('node-' + nodeId); + }); + + const removeCaseButton = newNode.querySelector('.remove-case'); + if (!removeCaseButton) { + console.error(`Remove Case button not found in node-${nodeId}.`); + return; + } + removeCaseButton.addEventListener('click', function () { + var caseContainer = newNode.querySelector('.case-container'); + var cases = caseContainer.getElementsByClassName('case-placeholder'); + if (cases.length > 1) { + caseContainer.removeChild(cases[cases.length - 2]); + var nodeData = editor.getNodeFromId(nodeId).data; + nodeData.args.cases.splice(nodeData.args.cases.length - 1, 1); + editor.updateNodeDataFromId(nodeId, nodeData); + } + editor.updateConnectionNodes('node-' + nodeId); + }); +} + +function addDefaultCase(caseContainer) { + var defaultCaseElement = document.createElement('div'); + defaultCaseElement.classList.add('case-placeholder', 'default-case'); + defaultCaseElement.textContent = `Default Case`; + caseContainer.appendChild(defaultCaseElement); +} + + +function closemodal(e) { + e.target.closest(".drawflow-node").style.zIndex = "2"; + e.target.parentElement.parentElement.style.display = "none"; + editor.precanvas.style.transform = transform; + editor.precanvas.style.left = '0px'; + editor.precanvas.style.top = '0px'; + editor.editor_mode = "edit"; +} + + +function changeModule(event) { + var all = document.querySelectorAll(".menu ul li"); + for (var i = 0; i < all.length; i++) { + all[i].classList.remove('selected'); + } + event.target.classList.add('selected'); +} + + +function changeLockMode(option) { + let lockSvg = document.getElementById('lock-svg'); + let unlockSvg = document.getElementById('unlock-svg'); + if (option === 'lock') { + editor.editor_mode = 'edit'; + lockSvg.style.display = 'none'; + unlockSvg.style.display = 'block'; + } else { + editor.editor_mode = 'fixed'; + lockSvg.style.display = 'block'; + unlockSvg.style.display = 'none'; + } +} + + +function toggleDraggable(element) { + var content = element.nextElementSibling; + if (content.classList.contains('visible')) { + content.classList.remove('visible'); + } else { + content.classList.add('visible'); + } +} + + +function filterEmptyValues(obj) { + return Object.entries(obj).reduce((acc, [key, value]) => { + if (typeof value === 'object' && value !== null) { + const filteredNestedObj = filterEmptyValues(value); + if (Object.keys(filteredNestedObj).length > 0) { + acc[key] = filteredNestedObj; + } + } else if (value !== '') { + acc[key] = value; + } + return acc; + }, {}); +} + + +// This function is the most important to AgentScope config. +function reorganizeAndFilterConfigForAgentScope(inputData) { + // Assuming there's only one tab ('Home'), but adjust if there are more + const homeTab = inputData.drawflow.Home; + // Create a new object to hold the reorganized and filtered nodes + const filteredNodes = {}; + + // Iterate through the nodes and copy them to the filteredNodes object + Object.entries(homeTab.data).forEach(([key, node]) => { + // Skip the node if the name is 'welcome' or 'readme' + const nodeName = node.name.toLowerCase(); + if (nodeName === 'welcome' || nodeName === 'readme') { + return; + } + + // Create a copy of the node without 'html', 'typenode', 'class', 'id', and 'name' fields + const { + html, + typenode, + pos_x, + pos_y, + class: classField, + id, + ...cleanNode + } = node; + + if (cleanNode.data && cleanNode.data.args) { + cleanNode.data.args = filterEmptyValues(cleanNode.data.args); + } + + // Add the cleaned node to the filteredNodes object using its id as the key + filteredNodes[key] = cleanNode; + }); + + // Return the filtered and reorganized nodes instead of the original structure + return filteredNodes; +} + + +function sortElementsByPosition(inputData) { + let hasError = false; + + Object.keys(inputData.drawflow).forEach((moduleKey) => { + const moduleData = inputData.drawflow[moduleKey]; + Object.entries(moduleData.data).forEach(([nodeId, node]) => { + if (node.class === 'GROUP') { + let elements = node.data.elements; + let elementsWithPosition = elements.map(elementId => { + const elementNode = document.querySelector(`#node-${elementId}`); + return elementNode ? { + id: elementId, + position: { + x: elementNode.style.left, + y: elementNode.style.top + } + } : null; + }).filter(el => el); + + try { + elementsWithPosition.sort((a, b) => { + let y1 = parseInt(a.position.y, 10); + let y2 = parseInt(b.position.y, 10); + if (y1 === y2) { + throw new Error(`Two elements have the same y position: Element ${a.id} and Element ${b.id}`); + } + return y1 - y2; + }); + } catch (error) { + alert(error.message); + hasError = true; + } + node.data.elements = elementsWithPosition.map(el => el.id); + } + }); + }); + return hasError; +} + + +function checkConditions() { + let hasModelTypeError = true; + let hasAgentError = true; + let agentModelConfigNames = new Set(); + let modelConfigNames = new Set(); + let isApiKeyEmpty = false; + const nodesData = editor.export().drawflow.Home.data; + + for (let nodeId in nodesData) { + let node = nodesData[nodeId]; + console.log("node", node); + console.log("node.inputs", node.inputs); + + if (node.inputs) { + for (let inputKey in node.inputs) { + if (node.inputs[inputKey].connections && + node.inputs[inputKey].connections.length > 1) { + Swal.fire({ + title: 'Invalid Connections', + text: + `${node.name} has more than one connection in inputs.`, + icon: 'error', + confirmButtonText: 'Ok' + }); + return false; + } + } + } + + let nodeElement = document.getElementById('node-' + nodeId); + const requiredInputs = nodeElement.querySelectorAll('input[data-required="true"]'); + + let titleBox = nodeElement.querySelector('.title-box'); + + let titleText = titleBox.getAttribute("data-class"); + + for (const input of requiredInputs) { + if (input.value.trim() === '') { + let inputLabel = input.previousElementSibling; + if (inputLabel && inputLabel.tagName.toLowerCase() === "label") { + let labelText = inputLabel.textContent.trim(); + + Swal.fire({ + title: 'Value Missing!', + text: `${labelText} is missing in ${titleText}.`, + icon: 'error', + confirmButtonText: 'Ok' + }); + return false; + } + } + } + + if (node.data && node.data.args && node.data.args.model_type) { + hasModelTypeError = false; + modelConfigNames.add(node.data.args.config_name); + if (node.data.args.api_key === "") { + isApiKeyEmpty = isApiKeyEmpty || true; + } + } + if (node.name.includes('Agent') && "model_config_name" in node.data.args) { + hasAgentError = false; + if (node.data && node.data.args) { + agentModelConfigNames.add(node.data.args.model_config_name); + } + } + if (node.name === 'ReActAgent') { + const elements = node.data.elements; + for (const nodeId of elements) { + const childNode = nodesData[nodeId] + if (!childNode || !childNode.name.includes('Service')) { + Swal.fire({ + title: 'Invalid ReActAgent Configuration', + text: + `ReActAgent must only contain Tool nodes as child nodes.`, + icon: 'error', + confirmButtonText: 'Ok' + }); + return false; + } + } + } + if (node.name === 'IfElsePipeline') { + const elementsSize = node.data.elements.length; + if (elementsSize !== 1 && elementsSize !== 2) { + Swal.fire({ + title: 'Invalid IfElsePipeline Configuration', + text: `IfElsePipeline should have 1 or 2 elements, but has ${elementsSize}.`, + icon: 'error', + confirmButtonText: 'Ok' + }); + return false; + } + } + if (['ForLoopPipeline', 'WhileLoopPipeline', 'MsgHub'].includes(node.name)) { + if (node.data.elements.length !== 1) { + hasError = true; + Swal.fire({ + title: 'Invalid Configuration', + text: `${node.name} must have exactly one element.`, + icon: 'error', + confirmButtonText: 'Ok' + }); + return false; + } + let childNodeId = node.data.elements[0]; + let childNode = nodesData[childNodeId]; + if (!childNode || !childNode.name.includes('Pipeline')) { + Swal.fire({ + title: 'Invalid Configuration', + text: + ` ${childNode.name} contained in ${node.name} is not a Pipeline node.`, + icon: 'error', + confirmButtonText: 'Ok' + }); + return false; + } + } + } + + let unmatchedConfigNames = [...agentModelConfigNames].filter(name => !modelConfigNames.has(name)); + console.log("modelConfigNames", modelConfigNames); + console.log("agentModelConfigNames", agentModelConfigNames); + console.log("unmatchedConfigNames", unmatchedConfigNames); + if (hasModelTypeError) { + Swal.fire({ + title: 'Error!', + text: + 'Error: At least one Model node must be present.', + icon: 'error', + confirmButtonText: 'Ok' + }); + } else if (hasAgentError) { + Swal.fire({ + title: 'No Agent Nodes Found', + text: "Error: At least one Agent node must be present.", + icon: 'error', + confirmButtonText: 'Ok' + }); + } else if (unmatchedConfigNames.length > 0) { + Swal.fire({ + title: 'Configuration Mismatch', + html: + "Each Agent's 'Model config name' must match a Model node's 'Config Name'.
    Unmatched: " + unmatchedConfigNames.join(', '), + icon: 'error', + confirmButtonText: 'Ok' + }); + } else if (isApiKeyEmpty) { + Swal.fire({ + title: 'API KEY Missing', + text: + "API KEY is missing in your model nodes. Please either enter the API KEY in the corresponding position, or enter a random bit of content and replace it with the real value in the exported files.", + icon: 'error', + confirmButtonText: 'Ok' + }); + } else { + return true; + } +} + + +function showCheckPopup() { + var btnCovers = document.querySelectorAll('.btn-cover'); + if (checkConditions()) { + Swal.fire({ + title: 'Validation Success', + text: "All checks are passed!", + icon: 'success', + confirmButtonText: 'Great!' + }); + btnCovers.forEach(function (btnCover) { + var button = btnCover.querySelector('.btn-disabled'); + if (button) { + button.classList.remove('btn-disabled'); + } + btnCover.removeAttribute('data-title'); + }); + } +} + + +function disableButtons() { + var btnCovers = document.querySelectorAll('.btn-cover'); + + btnCovers.forEach(function (btnCover) { + var button = btnCover.querySelector('div'); + if (button) { + button.classList.add('btn-disabled'); + } + btnCover.setAttribute('data-title', + 'Please click the "Check" button first.'); + }); +} + + +function showExportPyPopup() { + if (checkConditions()) { + const rawData = editor.export(); + + const hasError = sortElementsByPosition(rawData); + if (hasError) { + return; + } + + const filteredData = reorganizeAndFilterConfigForAgentScope(rawData); + + Swal.fire({ + title: 'Processing...', + text: 'Please wait.', + allowOutsideClick: false, + onBeforeOpen: () => { + Swal.showLoading() + } + }); + + fetch('/convert-to-py', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: JSON.stringify(filteredData, null, 4), + }) + }).then(response => { + if (!response.ok) { + throw new Error('Network error.'); + } + return response.json(); + }) + .then(data => { + Swal.close(); + if (data.is_success === 'True') { + Swal.fire({ + title: 'Workflow Python Code', + html: + '

    Save as main.py
    ' + + 'Then run the following command in your terminal:
    ' + + '

    python main.py

    ' + + 'or
    as_studio main.py

    ' + + '
    ' +
    +                            data.py_code +
    +                            '
    ', + showCloseButton: true, + showCancelButton: true, + confirmButtonText: 'Copy', + cancelButtonText: 'Close', + onBeforeOpen: (element) => { + const codeElement = element.querySelector('code'); + Prism.highlightElement(codeElement); + const copyButton = Swal.getConfirmButton(); + copyButton.addEventListener('click', () => { + copyToClipboard(codeElement.textContent); + }); + } + }); + } else { + const errorMessage = ` +

    An error occurred during the Python code generation process. Please check the following error:

    +
    ${data.py_code}
    + `; + Swal.fire({ + title: 'Error!', + html: errorMessage, + icon: 'error', + customClass: { + popup: 'error-popup' + }, + confirmButtonText: 'Close', + onBeforeOpen: (element) => { + const codeElement = element.querySelector('code'); + Prism.highlightElement(codeElement); + } + }); + } + }) + .catch(error => { + console.error('Error:', error); + Swal.fire('Failed!', + 'There was an error generating your code.', + 'error'); + }); + } +} + + +function showExportRunPopup() { + if (checkConditions()) { + const rawData = editor.export(); + const hasError = sortElementsByPosition(rawData); + if (hasError) { + return; + } + const filteredData = reorganizeAndFilterConfigForAgentScope(rawData); + + Swal.fire({ + title: 'Processing...', + text: 'Please wait.', + allowOutsideClick: false, + onBeforeOpen: () => { + Swal.showLoading() + } + }); + + fetch('/convert-to-py-and-run', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: JSON.stringify(filteredData, null, 4), + }) + }).then(response => { + if (!response.ok) { + throw new Error('Network error.'); + } + return response.json(); + }) + .then(data => { + Swal.close(); + if (data.is_success === 'True') { + Swal.fire({ + title: 'Application Running in Background', + html: + '

    Your application has been successfully run ' + + 'in background.
    ' + + '

    Task ID:' + + data.run_id + '

    ' + + '
    ' +
    +                            data.py_code +
    +                            '
    ', + showCloseButton: true, + showCancelButton: true, + confirmButtonText: 'Copy Code', + cancelButtonText: 'Close', + onBeforeOpen: (element) => { + const codeElement = element.querySelector('code'); + Prism.highlightElement(codeElement); + const copyButton = Swal.getConfirmButton(); + copyButton.addEventListener('click', () => { + copyToClipboard(codeElement.textContent); + }); + } + }); + } else { + const errorMessage = ` +

    An error occurred during the Python code running process. Please check the following error:

    +
    ${data.py_code}
    + `; + Swal.fire({ + title: 'Error!', + html: errorMessage, + icon: 'error', + customClass: { + popup: 'error-popup' + }, + confirmButtonText: 'Close', + onBeforeOpen: (element) => { + const codeElement = element.querySelector('code'); + Prism.highlightElement(codeElement); + } + }); + } + }) + .catch(error => { + console.error('Error:', error); + Swal.close(); + Swal.fire('Failed!', + 'There was an error running your workflow.', + 'error'); + }); + } +} + + +function showExportHTMLPopup() { + const rawData = editor.export(); + + // Remove the html attribute from the nodes to avoid inconsistencies in html + removeHtmlFromUsers(rawData); + + const exportData = JSON.stringify(rawData, null, 4); + + const escapedExportData = exportData + .replace(//g, '>'); + + Swal.fire({ + title: 'Workflow HTML', + html: + '

    This is used for generating HTML code, not for running.
    ' + + '

    '
    +            + escapedExportData +
    +            '
    ', + showCloseButton: true, + showCancelButton: true, + confirmButtonText: 'Copy', + cancelButtonText: 'Close', + onBeforeOpen: (element) => { + // Find the code element inside the Swal content + const codeElement = element.querySelector('code'); + + // Now highlight the code element with Prism + Prism.highlightElement(codeElement); + + // Copy to clipboard logic + const content = codeElement.textContent; + const copyButton = Swal.getConfirmButton(); + copyButton.addEventListener('click', () => { + copyToClipboard(content); + }); + } + }); +} + + +function isValidDataStructure(data) { + if ( + data.hasOwnProperty('drawflow') && + data.drawflow.hasOwnProperty('Home') && + data.drawflow.Home.hasOwnProperty('data') + ) { + + for (const nodeId in data.drawflow.Home.data) { + const node = data.drawflow.Home.data[nodeId]; + + if ( + !node.hasOwnProperty('id') || + typeof node.id !== 'number' || + !node.hasOwnProperty('name') || + typeof node.name !== 'string' || + !node.hasOwnProperty('class') || + typeof node.class !== 'string' + ) { + return false; + } + } + return true; + } + return false; +} + + +function showImportHTMLPopup() { + Swal.fire({ + title: 'Import Workflow Data', + html: + "

    Please paste your HTML data below. Ensure that the source of the HTML data is trusted, as importing HTML from unknown or untrusted sources may pose security risks.

    ", + input: 'textarea', + inputLabel: 'Paste your HTML data here:', + inputPlaceholder: + 'Paste your HTML data generated from `Export HTML` button...', + inputAttributes: { + 'aria-label': 'Paste your HTML data here', + 'class': 'code' + }, + customClass: { + input: 'code' + }, + showCancelButton: true, + confirmButtonText: 'Import', + cancelButtonText: 'Cancel', + inputValidator: (value) => { + if (!value) { + return 'You need to paste code generated from `Export HTML` button!'; + } + try { + const parsedData = JSON.parse(value); + if (isValidDataStructure(parsedData)) { + + } else { + return 'The data is invalid. Please check your data and try again.'; + } + } catch (e) { + return 'Invalid data! You need to paste code generated from `Export HTML` button!'; + } + }, + preConfirm: (data) => { + try { + const parsedData = JSON.parse(data); + + // Add html source code to the nodes data + addHtmlAndReplacePlaceHolderBeforeImport(parsedData) + .then(() => { + editor.clear(); + editor.import(parsedData); + importSetupNodes(parsedData); + Swal.fire('Imported!', '', 'success'); + }); + + } catch (error) { + Swal.showValidationMessage(`Import error: ${error}`); + } + } + }); +} + + +function removeHtmlFromUsers(data) { + Object.keys(data.drawflow.Home.data).forEach((nodeId) => { + const node = data.drawflow.Home.data[nodeId]; + // Remove the html attribute from the node + delete node.html; + }); +} + + +async function fetchHtmlSourceCodeByName(name) { + // Fetch the HTML source code from the cache if it exists + if (name in htmlCache) { + return htmlCache[name]; + } + + // Load the HTML source code + let htmlSourceCode = await fetchHtml(nameToHtmlFile[name]); + htmlCache[name] = htmlSourceCode; + return htmlSourceCode; +} + + +async function addHtmlAndReplacePlaceHolderBeforeImport(data) { + const idPlaceholderRegex = /ID_PLACEHOLDER/g; + for (const nodeId of Object.keys(data.drawflow.Home.data)) { + const node = data.drawflow.Home.data[nodeId]; + + if (!node.html) { + const sourceCode = await fetchHtmlSourceCodeByName(node.name); + + // Add new html attribute to the node + console.log(sourceCode) + node.html = sourceCode.replace(idPlaceholderRegex, nodeId); + } + } +} + + +function importSetupNodes(dataToImport) { + Object.keys(dataToImport.drawflow.Home.data).forEach((nodeId) => { + setupNodeListeners(nodeId); + + const nodeElement = document.getElementById(`node-${nodeId}`); + if (nodeElement) { + const copyButton = nodeElement.querySelector('.button.copy-button'); + if (copyButton) { + setupNodeCopyListens(nodeId); + } + } + }); +} + + +function copyToClipboard(contentToCopy) { + var tempTextarea = document.createElement("textarea"); + tempTextarea.value = contentToCopy; + document.body.appendChild(tempTextarea); + tempTextarea.select(); + tempTextarea.setSelectionRange(0, 99999); + + try { + var successful = document.execCommand("copy"); + if (successful) { + Swal.fire('Copied!', '', 'success'); + } else { + Swal.fire('Failed to copy', '', 'error'); + } + } catch (err) { + Swal.fire('Failed to copy', '', 'error'); + } + document.body.removeChild(tempTextarea); +} + + +function fetchExample(index, processData) { + fetch('/read-examples', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: index, + lang: getCookie('locale') || 'en' + }) + }).then(response => { + if (!response.ok) { + throw new Error('Network error.'); + } + return response.json(); + }) + .then(processData); +} + + +function importExample(index) { + fetchExample(index, data => { + const dataToImport = data.json; + + addHtmlAndReplacePlaceHolderBeforeImport(dataToImport) + .then(() => { + clearModuleSelected(); + editor.import(dataToImport); + Object.keys(dataToImport.drawflow.Home.data).forEach((nodeId) => { + setupNodeListeners(nodeId); + const nodeElement = document.getElementById(`node-${nodeId}`); + if (nodeElement) { + const copyButton = nodeElement.querySelector('.button.copy-button'); + if (copyButton) { + setupNodeCopyListens(nodeId); + } + } + }); + }); + }) +} + + +function importExample_step(index) { + fetchExample(index, data => { + const dataToImportStep = data.json; + clearModuleSelected(); + descriptionStep = ["Readme", "Model", "UserAgent", + "DialogAgent"]; + initializeImport(dataToImportStep); + }) +} + + +function updateImportButtons() { + document.getElementById('import-prev').disabled = currentImportIndex + <= 1; + document.getElementById('import-next').disabled = currentImportIndex >= importQueue.length; + document.getElementById('import-skip').disabled = currentImportIndex >= importQueue.length; +} + + +function createElement(tag, id, html = '', parent = document.body) { + let element = document.getElementById(id) || document.createElement(tag); + element.id = id; + element.innerHTML = html; + if (!element.parentNode) { + parent.appendChild(element); + } + return element; +} + + +function initializeImport(data) { + ['buttons-container', 'buttons-container-html'].forEach(cls => { + let containers = document.getElementsByClassName(cls); + Array.from(containers).forEach(container => container.style.display = 'none'); + }); + + createElement('div', 'left-sidebar-blur', '', document.body).style.cssText = ` + position: fixed; top: 67px; left: 0; bottom: 0; width: 250px; + background: rgba(128, 128, 128, 0.7); + filter: blur(2px); z-index: 1000; cursor: not-allowed; + `; + + createElement('div', 'import-buttons', '', document.body); + + dataToImportStep = data; + importQueue = Object.keys(dataToImportStep.drawflow.Home.data); + + const importButtonsDiv = document.getElementById('import-buttons'); + createElement('div', 'step-info', '', importButtonsDiv); + createElement('button', 'import-prev', + ' {{_("Previous")}}', + importButtonsDiv).onclick = importPreviousComponent; + createElement('button', 'import-next', + ' {{_("Next")}}', + importButtonsDiv).onclick = importNextComponent; + createElement('button', 'import-skip', + ' {{_("Skip")}}', + importButtonsDiv).onclick = importSkipComponent; + createElement('button', 'import-quit', + ' {{_("Quit")}}', + importButtonsDiv).onclick = importQuitComponent; + createElement('div', 'step-warning', + '{{_("Caution: You are currently in the tutorial mode where modifications are restricted.
    Please click Quit to exit and start creating your custom multi-agent applications.")}}', document.body); + + accumulatedImportData = {}; + currentImportIndex = 0; + importNextComponent(); + + updateImportButtons(); +} + + +function importPreviousComponent() { + if (currentImportIndex > 0) { + currentImportIndex--; + accumulatedImportData = Object.assign({}, ...importQueue.slice(0, currentImportIndex).map(k => ({[k]: dataToImportStep.drawflow.Home.data[k]}))); + editor.import({drawflow: {Home: {data: accumulatedImportData}}}); + updateStepInfo(); + } + updateImportButtons(); +} + + +function importNextComponent() { + const nodeId = importQueue[currentImportIndex]; + accumulatedImportData[nodeId] = dataToImportStep.drawflow.Home.data[nodeId]; + editor.import({drawflow: {Home: {data: accumulatedImportData}}}); + currentImportIndex++; + updateStepInfo(); + updateImportButtons(); +} + + +function importSkipComponent() { + accumulatedImportData = Object.assign({}, ...importQueue.map(k => ({[k]: dataToImportStep.drawflow.Home.data[k]}))); + editor.import({drawflow: {Home: {data: accumulatedImportData}}}); + currentImportIndex = importQueue.length; + updateImportButtons(); + updateStepInfo(); +} + + +function importQuitComponent() { + clearModuleSelected(); + ['buttons-container', 'buttons-container-html'].forEach(cls => { + let containers = document.getElementsByClassName(cls); + Array.from(containers).forEach(container => container.style.display = ''); + }); +} + + +function updateStepInfo() { + let stepInfoDiv = document.getElementById('step-info'); + if (stepInfoDiv && currentImportIndex > 0) { + stepInfoDiv.innerHTML = + `{{_("Current Step")}} (${currentImportIndex}/${importQueue.length})
    ${descriptionStep[currentImportIndex - 1]}`; + } else if (stepInfoDiv) { + stepInfoDiv.innerHTML = 'No steps to display.'; + } +} + + +function clearModuleSelected() { + editor.clearModuleSelected(); + + let importButtonsDiv = document.getElementById("import-buttons"); + if (importButtonsDiv) { + importButtonsDiv.remove(); + } + + let stepWarningDiv = document.getElementById("step-warning"); + if (stepWarningDiv) { + stepWarningDiv.remove(); + } + + let blurDiv = document.getElementById('left-sidebar-blur'); + if (blurDiv) { + blurDiv.remove(); + } +} + + +function getCookie(name) { + var matches = document.cookie.match(new RegExp( + "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" + )); + return matches ? decodeURIComponent(matches[1]) : undefined; +} + + +function showSurveyModal() { + document.getElementById("surveyModal").style.display = "block"; +} + + +function hideSurveyModal() { + document.getElementById("surveyModal").style.display = "none"; +} \ No newline at end of file diff --git a/src/agentscope/studio/static/js/workstation_iframe.js b/src/agentscope/studio/static/js/workstation_iframe.js new file mode 100644 index 000000000..cc6d9209a --- /dev/null +++ b/src/agentscope/studio/static/js/workstation_iframe.js @@ -0,0 +1,3 @@ +var iframe = document.getElementById('workstation-iframe'); +var currentUrl = window.location.protocol + '//' + window.location.host + '/workstation'; +iframe.src = currentUrl; \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/clusterize.min.js b/src/agentscope/studio/static/js_third_party/clusterize.min.js new file mode 100644 index 000000000..da6609604 --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/clusterize.min.js @@ -0,0 +1,17 @@ +/* Clusterize.js - v0.19.0 - 2021-12-19 + http://NeXTs.github.com/Clusterize.js/ + Copyright (c) 2015 Denis Lukov; Licensed GPLv3 */ + +;(function(p,m){"undefined"!=typeof module?module.exports=m():"function"==typeof define&&"object"==typeof define.amd?define(m):this[p]=m()})("Clusterize",function(){function p(b,a,c){return a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent("on"+b,c)}function m(b,a,c){return a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent("on"+b,c)}function t(b){return"[object Array]"===Object.prototype.toString.call(b)}function q(b,a){return window.getComputedStyle?window.getComputedStyle(a)[b]: +a.currentStyle[b]}var r=function(){for(var b=3,a=document.createElement("b"),c=a.all||[];a.innerHTML="\x3c!--[if gt IE "+ ++b+"]>=r&&!c.tag&&(c.tag=b[0].match(/<([^>\s/]*)/)[1].toLowerCase()),1>=this.content_elem.children.length&&(a.data=this.html(b[0]+b[0]+b[0])),c.tag||(c.tag=this.content_elem.children[0].tagName.toLowerCase()), +this.getRowsHeight(b))},getRowsHeight:function(b){var a=this.options,c=a.item_height;a.cluster_height=0;if(b.length&&(b=this.content_elem.children,b.length)){var d=b[Math.floor(b.length/2)];a.item_height=d.offsetHeight;"tr"==a.tag&&"collapse"!=q("borderCollapse",this.content_elem)&&(a.item_height+=parseInt(q("borderSpacing",this.content_elem),10)||0);"tr"!=a.tag&&(b=parseInt(q("marginTop",d),10)||0,d=parseInt(q("marginBottom",d),10)||0,a.item_height+=Math.max(b,d));a.block_height=a.item_height*a.rows_in_block; +a.rows_in_cluster=a.blocks_in_cluster*a.rows_in_block;a.cluster_height=a.blocks_in_cluster*a.block_height;return c!=a.item_height}},getClusterNum:function(b){var a=this.options;a.scroll_top=this.scroll_elem.scrollTop;var c=a.cluster_height-a.block_height;return Math.min(Math.floor(a.scroll_top/c),Math.floor(b.length*a.item_height/c))},generateEmptyRow:function(){var b=this.options;if(!b.tag||!b.show_no_data_row)return[];var a=document.createElement(b.tag),c=document.createTextNode(b.no_data_text); +a.className=b.no_data_class;if("tr"==b.tag){var d=document.createElement("td");d.colSpan=100;d.appendChild(c)}a.appendChild(d||c);return[a.outerHTML]},generate:function(b){var a=this.options,c=b.length;if(cg&&e++;d=r&&"tr"==this.options.tag){var c=document.createElement("div");for(c.innerHTML=""+b+"
    ";b=a.lastChild;)a.removeChild(b);for(c=this.getChildNodes(c.firstChild.firstChild);c.length;)a.appendChild(c.shift())}else a.innerHTML=b},getChildNodes:function(b){b=b.children;for(var a=[],c=0,d=b.length;c 100 && (n > this.prevDiff && this.zoom_in(), n < this.prevDiff && this.zoom_out()), this.prevDiff = n + } + } + + pointerup_handler(e) { + this.remove_event(e), this.evCache.length < 2 && (this.prevDiff = -1) + } + + remove_event(e) { + for (var t = 0; t < this.evCache.length; t++) if (this.evCache[t].pointerId == e.pointerId) { + this.evCache.splice(t, 1); + break + } + } + + load() { + for (var e in this.drawflow.drawflow[this.module].data) this.addNodeImport(this.drawflow.drawflow[this.module].data[e], this.precanvas); + if (this.reroute) for (var e in this.drawflow.drawflow[this.module].data) this.addRerouteImport(this.drawflow.drawflow[this.module].data[e]); + for (var e in this.drawflow.drawflow[this.module].data) this.updateConnectionNodes("node-" + e); + const t = this.drawflow.drawflow; + let n = 1; + Object.keys(t).map((function (e, i) { + Object.keys(t[e].data).map((function (e, t) { + parseInt(e) >= n && (n = parseInt(e) + 1) + })) + })), this.nodeId = n + } + + removeReouteConnectionSelected() { + this.dispatch("connectionUnselected", !0), this.reroute_fix_curvature && this.connection_selected.parentElement.querySelectorAll(".main-path").forEach((e, t) => { + e.classList.remove("selected") + }) + } + + click(e) { + if (this.dispatch("click", e), "fixed" === this.editor_mode) { + if (e.preventDefault(), "parent-drawflow" !== e.target.classList[0] && "drawflow" !== e.target.classList[0]) return !1; + this.ele_selected = e.target.closest(".parent-drawflow") + } else "view" === this.editor_mode ? (null != e.target.closest(".drawflow") || e.target.matches(".parent-drawflow")) && (this.ele_selected = e.target.closest(".parent-drawflow"), e.preventDefault()) : (this.first_click = e.target, this.ele_selected = e.target, 0 === e.button && this.contextmenuDel(), null != e.target.closest(".drawflow_content_node") && (this.ele_selected = e.target.closest(".drawflow_content_node").parentElement)); + switch (this.ele_selected.classList[0]) { + case"drawflow-node": + null != this.node_selected && (this.node_selected.classList.remove("selected"), this.node_selected != this.ele_selected && this.dispatch("nodeUnselected", !0)), null != this.connection_selected && (this.connection_selected.classList.remove("selected"), this.removeReouteConnectionSelected(), this.connection_selected = null), this.node_selected != this.ele_selected && this.dispatch("nodeSelected", this.ele_selected.id.slice(5)), this.node_selected = this.ele_selected, this.node_selected.classList.add("selected"), this.draggable_inputs ? "SELECT" !== e.target.tagName && (this.drag = !0) : "INPUT" !== e.target.tagName && "TEXTAREA" !== e.target.tagName && "SELECT" !== e.target.tagName && !0 !== e.target.hasAttribute("contenteditable") && (this.drag = !0); + break; + case"output": + this.connection = !0, null != this.node_selected && (this.node_selected.classList.remove("selected"), this.node_selected = null, this.dispatch("nodeUnselected", !0)), null != this.connection_selected && (this.connection_selected.classList.remove("selected"), this.removeReouteConnectionSelected(), this.connection_selected = null), this.drawConnection(e.target); + break; + case"parent-drawflow": + case"drawflow": + null != this.node_selected && (this.node_selected.classList.remove("selected"), this.node_selected = null, this.dispatch("nodeUnselected", !0)), null != this.connection_selected && (this.connection_selected.classList.remove("selected"), this.removeReouteConnectionSelected(), this.connection_selected = null), this.editor_selected = !0; + break; + case"main-path": + null != this.node_selected && (this.node_selected.classList.remove("selected"), this.node_selected = null, this.dispatch("nodeUnselected", !0)), null != this.connection_selected && (this.connection_selected.classList.remove("selected"), this.removeReouteConnectionSelected(), this.connection_selected = null), this.connection_selected = this.ele_selected, this.connection_selected.classList.add("selected"); + const t = this.connection_selected.parentElement.classList; + t.length > 1 && (this.dispatch("connectionSelected", { + output_id: t[2].slice(14), + input_id: t[1].slice(13), + output_class: t[3], + input_class: t[4] + }), this.reroute_fix_curvature && this.connection_selected.parentElement.querySelectorAll(".main-path").forEach((e, t) => { + e.classList.add("selected") + })); + break; + case"point": + this.drag_point = !0, this.ele_selected.classList.add("selected"); + break; + case"drawflow-delete": + this.node_selected && this.removeNodeId(this.node_selected.id), this.connection_selected && this.removeConnection(), null != this.node_selected && (this.node_selected.classList.remove("selected"), this.node_selected = null, this.dispatch("nodeUnselected", !0)), null != this.connection_selected && (this.connection_selected.classList.remove("selected"), this.removeReouteConnectionSelected(), this.connection_selected = null) + } + "touchstart" === e.type ? (this.pos_x = e.touches[0].clientX, this.pos_x_start = e.touches[0].clientX, this.pos_y = e.touches[0].clientY, this.pos_y_start = e.touches[0].clientY, this.mouse_x = e.touches[0].clientX, this.mouse_y = e.touches[0].clientY) : (this.pos_x = e.clientX, this.pos_x_start = e.clientX, this.pos_y = e.clientY, this.pos_y_start = e.clientY), ["input", "output", "main-path"].includes(this.ele_selected.classList[0]) && e.preventDefault(), this.dispatch("clickEnd", e) + } + + position(e) { + if ("touchmove" === e.type) var t = e.touches[0].clientX, + n = e.touches[0].clientY; else t = e.clientX, n = e.clientY; + if (this.connection && this.updateConnection(t, n), this.editor_selected && (i = this.canvas_x + -(this.pos_x - t), s = this.canvas_y + -(this.pos_y - n), this.dispatch("translate", { + x: i, + y: s + }), this.precanvas.style.transform = "translate(" + i + "px, " + s + "px) scale(" + this.zoom + ")"), this.drag) { + e.preventDefault(); + var i = (this.pos_x - t) * this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom), + s = (this.pos_y - n) * this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom); + this.pos_x = t, this.pos_y = n, this.ele_selected.style.top = this.ele_selected.offsetTop - s + "px", this.ele_selected.style.left = this.ele_selected.offsetLeft - i + "px", this.drawflow.drawflow[this.module].data[this.ele_selected.id.slice(5)].pos_x = this.ele_selected.offsetLeft - i, this.drawflow.drawflow[this.module].data[this.ele_selected.id.slice(5)].pos_y = this.ele_selected.offsetTop - s, this.updateConnectionNodes(this.ele_selected.id) + } + if (this.drag_point) { + i = (this.pos_x - t) * this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom), s = (this.pos_y - n) * this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom); + this.pos_x = t, this.pos_y = n; + var o = this.pos_x * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)) - this.precanvas.getBoundingClientRect().x * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)), + l = this.pos_y * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)) - this.precanvas.getBoundingClientRect().y * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)); + this.ele_selected.setAttributeNS(null, "cx", o), this.ele_selected.setAttributeNS(null, "cy", l); + const e = this.ele_selected.parentElement.classList[2].slice(9), + c = this.ele_selected.parentElement.classList[1].slice(13), + d = this.ele_selected.parentElement.classList[3], + a = this.ele_selected.parentElement.classList[4]; + let r = Array.from(this.ele_selected.parentElement.children).indexOf(this.ele_selected) - 1; + if (this.reroute_fix_curvature) { + r -= this.ele_selected.parentElement.querySelectorAll(".main-path").length - 1, r < 0 && (r = 0) + } + const h = e.slice(5), + u = this.drawflow.drawflow[this.module].data[h].outputs[d].connections.findIndex((function (e, t) { + return e.node === c && e.output === a + })); + this.drawflow.drawflow[this.module].data[h].outputs[d].connections[u].points[r] = { + pos_x: o, + pos_y: l + }; + const p = this.ele_selected.parentElement.classList[2].slice(9); + this.updateConnectionNodes(p) + } + "touchmove" === e.type && (this.mouse_x = t, this.mouse_y = n), this.dispatch("mouseMove", { + x: t, + y: n + }) + } + + dragEnd(e) { + if ("touchend" === e.type) var t = this.mouse_x, + n = this.mouse_y, + i = document.elementFromPoint(t, n); else t = e.clientX, n = e.clientY, i = e.target; + if (this.drag && (this.pos_x_start == t && this.pos_y_start == n || this.dispatch("nodeMoved", this.ele_selected.id.slice(5))), this.drag_point && (this.ele_selected.classList.remove("selected"), this.pos_x_start == t && this.pos_y_start == n || this.dispatch("rerouteMoved", this.ele_selected.parentElement.classList[2].slice(14))), this.editor_selected && (this.canvas_x = this.canvas_x + -(this.pos_x - t), this.canvas_y = this.canvas_y + -(this.pos_y - n), this.editor_selected = !1), !0 === this.connection) if ("input" === i.classList[0] || this.force_first_input && (null != i.closest(".drawflow_content_node") || "drawflow-node" === i.classList[0])) { + if (!this.force_first_input || null == i.closest(".drawflow_content_node") && "drawflow-node" !== i.classList[0]) s = i.parentElement.parentElement.id, o = i.classList[1]; else { + if (null != i.closest(".drawflow_content_node")) var s = i.closest(".drawflow_content_node").parentElement.id; else var s = i.id; + if (0 === Object.keys(this.getNodeFromId(s.slice(5)).inputs).length) var o = !1; else var o = "input_1" + } + var l = this.ele_selected.parentElement.parentElement.id, + c = this.ele_selected.classList[1]; + if (l !== s && !1 !== o) { + if (0 === this.container.querySelectorAll(".connection.node_in_" + s + ".node_out_" + l + "." + c + "." + o).length) { + this.connection_ele.classList.add("node_in_" + s), this.connection_ele.classList.add("node_out_" + l), this.connection_ele.classList.add(c), this.connection_ele.classList.add(o); + var d = s.slice(5), a = l.slice(5); + this.drawflow.drawflow[this.module].data[a].outputs[c].connections.push({ + node: d, + output: o + }), this.drawflow.drawflow[this.module].data[d].inputs[o].connections.push({ + node: a, + input: c + }), this.updateConnectionNodes("node-" + a), this.updateConnectionNodes("node-" + d), this.dispatch("connectionCreated", { + output_id: a, + input_id: d, + output_class: c, + input_class: o + }) + } else this.dispatch("connectionCancel", !0), this.connection_ele.remove(); + this.connection_ele = null + } else this.dispatch("connectionCancel", !0), this.connection_ele.remove(), this.connection_ele = null + } else this.dispatch("connectionCancel", !0), this.connection_ele.remove(), this.connection_ele = null; + this.drag = !1, this.drag_point = !1, this.connection = !1, this.ele_selected = null, this.editor_selected = !1, this.dispatch("mouseUp", e) + } + + contextmenu(e) { + if (this.dispatch("contextmenu", e), e.preventDefault(), "fixed" === this.editor_mode || "view" === this.editor_mode) return !1; + if (this.precanvas.getElementsByClassName("drawflow-delete").length && this.precanvas.getElementsByClassName("drawflow-delete")[0].remove(), this.node_selected || this.connection_selected) { + var t = document.createElement("div"); + t.classList.add("drawflow-delete"), t.innerHTML = "x", this.node_selected && this.node_selected.appendChild(t), this.connection_selected && this.connection_selected.parentElement.classList.length > 1 && (t.style.top = e.clientY * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)) - this.precanvas.getBoundingClientRect().y * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)) + "px", t.style.left = e.clientX * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)) - this.precanvas.getBoundingClientRect().x * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)) + "px", this.precanvas.appendChild(t)) + } + } + + contextmenuDel() { + this.precanvas.getElementsByClassName("drawflow-delete").length && this.precanvas.getElementsByClassName("drawflow-delete")[0].remove() + } + + key(e) { + if (this.dispatch("keydown", e), "fixed" === this.editor_mode || "view" === this.editor_mode) return !1; + ("Delete" === e.key || "Backspace" === e.key && e.metaKey) && (null != this.node_selected && "INPUT" !== this.first_click.tagName && "TEXTAREA" !== this.first_click.tagName && !0 !== this.first_click.hasAttribute("contenteditable") && this.removeNodeId(this.node_selected.id), null != this.connection_selected && this.removeConnection()) + } + + zoom_enter(e, t) { + e.ctrlKey && (e.preventDefault(), e.deltaY > 0 ? this.zoom_out() : this.zoom_in()) + } + + zoom_refresh() { + this.dispatch("zoom", this.zoom), this.canvas_x = this.canvas_x / this.zoom_last_value * this.zoom, this.canvas_y = this.canvas_y / this.zoom_last_value * this.zoom, this.zoom_last_value = this.zoom, this.precanvas.style.transform = "translate(" + this.canvas_x + "px, " + this.canvas_y + "px) scale(" + this.zoom + ")" + } + + zoom_in() { + this.zoom < this.zoom_max && (this.zoom += this.zoom_value, this.zoom_refresh()) + } + + zoom_out() { + this.zoom > this.zoom_min && (this.zoom -= this.zoom_value, this.zoom_refresh()) + } + + zoom_reset() { + 1 != this.zoom && (this.zoom = 1, this.zoom_refresh()) + } + + createCurvature(e, t, n, i, s, o) { + var l = e, c = t, d = n, a = i, r = s; + switch (o) { + case"open": + if (e >= n) var h = l + Math.abs(d - l) * r, + u = d - Math.abs(d - l) * (-1 * r); else h = l + Math.abs(d - l) * r, u = d - Math.abs(d - l) * r; + return " M " + l + " " + c + " C " + h + " " + c + " " + u + " " + a + " " + d + " " + a; + case"close": + if (e >= n) h = l + Math.abs(d - l) * (-1 * r), u = d - Math.abs(d - l) * r; else h = l + Math.abs(d - l) * r, u = d - Math.abs(d - l) * r; + return " M " + l + " " + c + " C " + h + " " + c + " " + u + " " + a + " " + d + " " + a; + case"other": + if (e >= n) h = l + Math.abs(d - l) * (-1 * r), u = d - Math.abs(d - l) * (-1 * r); else h = l + Math.abs(d - l) * r, u = d - Math.abs(d - l) * r; + return " M " + l + " " + c + " C " + h + " " + c + " " + u + " " + a + " " + d + " " + a; + default: + return " M " + l + " " + c + " C " + (h = l + Math.abs(d - l) * r) + " " + c + " " + (u = d - Math.abs(d - l) * r) + " " + a + " " + d + " " + a + } + } + + drawConnection(e) { + var t = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + this.connection_ele = t; + var n = document.createElementNS("http://www.w3.org/2000/svg", "path"); + n.classList.add("main-path"), n.setAttributeNS(null, "d", ""), t.classList.add("connection"), t.appendChild(n), this.precanvas.appendChild(t); + var i = e.parentElement.parentElement.id.slice(5), + s = e.classList[1]; + this.dispatch("connectionStart", { + output_id: i, + output_class: s + }) + } + + updateConnection(e, t) { + const n = this.precanvas, i = this.zoom; + let s = n.clientWidth / (n.clientWidth * i); + s = s || 0; + let o = n.clientHeight / (n.clientHeight * i); + o = o || 0; + var l = this.connection_ele.children[0], + c = this.ele_selected.offsetWidth / 2 + (this.ele_selected.getBoundingClientRect().x - n.getBoundingClientRect().x) * s, + d = this.ele_selected.offsetHeight / 2 + (this.ele_selected.getBoundingClientRect().y - n.getBoundingClientRect().y) * o, + a = e * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)) - this.precanvas.getBoundingClientRect().x * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)), + r = t * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)) - this.precanvas.getBoundingClientRect().y * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)), + h = this.curvature, + u = this.createCurvature(c, d, a, r, h, "openclose"); + l.setAttributeNS(null, "d", u) + } + + addConnection(e, t, n, i) { + var s = this.getModuleFromNodeId(e); + if (s === this.getModuleFromNodeId(t)) { + var o = this.getNodeFromId(e), l = !1; + for (var c in o.outputs[n].connections) { + var d = o.outputs[n].connections[c]; + d.node == t && d.output == i && (l = !0) + } + if (!1 === l) { + if (this.drawflow.drawflow[s].data[e].outputs[n].connections.push({ + node: t.toString(), + output: i + }), this.drawflow.drawflow[s].data[t].inputs[i].connections.push({ + node: e.toString(), + input: n + }), this.module === s) { + var a = document.createElementNS("http://www.w3.org/2000/svg", "svg"), + r = document.createElementNS("http://www.w3.org/2000/svg", "path"); + r.classList.add("main-path"), r.setAttributeNS(null, "d", ""), a.classList.add("connection"), a.classList.add("node_in_node-" + t), a.classList.add("node_out_node-" + e), a.classList.add(n), a.classList.add(i), a.appendChild(r), this.precanvas.appendChild(a), this.updateConnectionNodes("node-" + e), this.updateConnectionNodes("node-" + t) + } + this.dispatch("connectionCreated", { + output_id: e, + input_id: t, + output_class: n, + input_class: i + }) + } + } + } + + updateConnectionNodes(e) { + const t = "node_in_" + e, n = "node_out_" + e; + this.line_path; + const i = this.container, s = this.precanvas, + o = this.curvature, l = this.createCurvature, + c = this.reroute_curvature, + d = this.reroute_curvature_start_end, + a = this.reroute_fix_curvature, r = this.reroute_width, + h = this.zoom; + let u = s.clientWidth / (s.clientWidth * h); + u = u || 0; + let p = s.clientHeight / (s.clientHeight * h); + p = p || 0; + const f = i.querySelectorAll("." + n); + Object.keys(f).map((function (t, n) { + if (null === f[t].querySelector(".point")) { + var m = i.querySelector("#" + e), + g = f[t].classList[1].replace("node_in_", ""), + _ = i.querySelector("#" + g).querySelectorAll("." + f[t].classList[4])[0], + w = _.offsetWidth / 2 + (_.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, + v = _.offsetHeight / 2 + (_.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, + y = m.querySelectorAll("." + f[t].classList[3])[0], + C = y.offsetWidth / 2 + (y.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, + x = y.offsetHeight / 2 + (y.getBoundingClientRect().y - s.getBoundingClientRect().y) * p; + const n = l(C, x, w, v, o, "openclose"); + f[t].children[0].setAttributeNS(null, "d", n) + } else { + const n = f[t].querySelectorAll(".point"); + let o = ""; + const m = []; + n.forEach((t, a) => { + if (0 === a && n.length - 1 == 0) { + var f = i.querySelector("#" + e), + g = ((x = t).getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, + _ = (x.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, + w = (L = f.querySelectorAll("." + t.parentElement.classList[3])[0]).offsetWidth / 2 + (L.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, + v = L.offsetHeight / 2 + (L.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, + y = l(w, v, g, _, d, "open"); + o += y, m.push(y); + f = t; + var C = t.parentElement.classList[1].replace("node_in_", ""), + x = (E = i.querySelector("#" + C)).querySelectorAll("." + t.parentElement.classList[4])[0]; + g = (R = E.querySelectorAll("." + t.parentElement.classList[4])[0]).offsetWidth / 2 + (R.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, _ = R.offsetHeight / 2 + (R.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, w = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, v = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, y = l(w, v, g, _, d, "close"); + o += y, m.push(y) + } else if (0 === a) { + var L; + f = i.querySelector("#" + e), g = ((x = t).getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, _ = (x.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, w = (L = f.querySelectorAll("." + t.parentElement.classList[3])[0]).offsetWidth / 2 + (L.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, v = L.offsetHeight / 2 + (L.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, y = l(w, v, g, _, d, "open"); + o += y, m.push(y); + f = t, g = ((x = n[a + 1]).getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, _ = (x.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, w = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, v = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, y = l(w, v, g, _, c, "other"); + o += y, m.push(y) + } else if (a === n.length - 1) { + var E, R; + f = t, C = t.parentElement.classList[1].replace("node_in_", ""), x = (E = i.querySelector("#" + C)).querySelectorAll("." + t.parentElement.classList[4])[0], g = (R = E.querySelectorAll("." + t.parentElement.classList[4])[0]).offsetWidth / 2 + (R.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, _ = R.offsetHeight / 2 + (R.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, w = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * (s.clientWidth / (s.clientWidth * h)) + r, v = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * (s.clientHeight / (s.clientHeight * h)) + r, y = l(w, v, g, _, d, "close"); + o += y, m.push(y) + } else { + f = t, g = ((x = n[a + 1]).getBoundingClientRect().x - s.getBoundingClientRect().x) * (s.clientWidth / (s.clientWidth * h)) + r, _ = (x.getBoundingClientRect().y - s.getBoundingClientRect().y) * (s.clientHeight / (s.clientHeight * h)) + r, w = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * (s.clientWidth / (s.clientWidth * h)) + r, v = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * (s.clientHeight / (s.clientHeight * h)) + r, y = l(w, v, g, _, c, "other"); + o += y, m.push(y) + } + }), a ? m.forEach((e, n) => { + f[t].children[n].setAttributeNS(null, "d", e) + }) : f[t].children[0].setAttributeNS(null, "d", o) + } + })); + const m = i.querySelectorAll("." + t); + Object.keys(m).map((function (t, n) { + if (null === m[t].querySelector(".point")) { + var h = i.querySelector("#" + e), + f = m[t].classList[2].replace("node_out_", ""), + g = i.querySelector("#" + f).querySelectorAll("." + m[t].classList[3])[0], + _ = g.offsetWidth / 2 + (g.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, + w = g.offsetHeight / 2 + (g.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, + v = (h = h.querySelectorAll("." + m[t].classList[4])[0]).offsetWidth / 2 + (h.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, + y = h.offsetHeight / 2 + (h.getBoundingClientRect().y - s.getBoundingClientRect().y) * p; + const n = l(_, w, v, y, o, "openclose"); + m[t].children[0].setAttributeNS(null, "d", n) + } else { + const n = m[t].querySelectorAll(".point"); + let o = ""; + const h = []; + n.forEach((t, a) => { + if (0 === a && n.length - 1 == 0) { + var f = i.querySelector("#" + e), + m = ((C = t).getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, + g = (C.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, + _ = (E = f.querySelectorAll("." + t.parentElement.classList[4])[0]).offsetWidth / 2 + (E.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, + w = E.offsetHeight / 2 + (E.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, + v = l(m, g, _, w, d, "close"); + o += v, h.push(v); + f = t; + var y = t.parentElement.classList[2].replace("node_out_", ""), + C = (L = i.querySelector("#" + y)).querySelectorAll("." + t.parentElement.classList[3])[0]; + m = (x = L.querySelectorAll("." + t.parentElement.classList[3])[0]).offsetWidth / 2 + (x.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, g = x.offsetHeight / 2 + (x.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, _ = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, w = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, v = l(m, g, _, w, d, "open"); + o += v, h.push(v) + } else if (0 === a) { + var x; + f = t, y = t.parentElement.classList[2].replace("node_out_", ""), C = (L = i.querySelector("#" + y)).querySelectorAll("." + t.parentElement.classList[3])[0], m = (x = L.querySelectorAll("." + t.parentElement.classList[3])[0]).offsetWidth / 2 + (x.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, g = x.offsetHeight / 2 + (x.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, _ = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, w = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, v = l(m, g, _, w, d, "open"); + o += v, h.push(v); + f = t, _ = ((C = n[a + 1]).getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, w = (C.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, m = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, g = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, v = l(m, g, _, w, c, "other"); + o += v, h.push(v) + } else if (a === n.length - 1) { + var L, E; + f = t, y = t.parentElement.classList[1].replace("node_in_", ""), C = (L = i.querySelector("#" + y)).querySelectorAll("." + t.parentElement.classList[4])[0], _ = (E = L.querySelectorAll("." + t.parentElement.classList[4])[0]).offsetWidth / 2 + (E.getBoundingClientRect().x - s.getBoundingClientRect().x) * u, w = E.offsetHeight / 2 + (E.getBoundingClientRect().y - s.getBoundingClientRect().y) * p, m = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, g = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, v = l(m, g, _, w, d, "close"); + o += v, h.push(v) + } else { + f = t, _ = ((C = n[a + 1]).getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, w = (C.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, m = (f.getBoundingClientRect().x - s.getBoundingClientRect().x) * u + r, g = (f.getBoundingClientRect().y - s.getBoundingClientRect().y) * p + r, v = l(m, g, _, w, c, "other"); + o += v, h.push(v) + } + }), a ? h.forEach((e, n) => { + m[t].children[n].setAttributeNS(null, "d", e) + }) : m[t].children[0].setAttributeNS(null, "d", o) + } + })) + } + + dblclick(e) { + null != this.connection_selected && this.reroute && this.createReroutePoint(this.connection_selected), "point" === e.target.classList[0] && this.removeReroutePoint(e.target) + } + + createReroutePoint(e) { + this.connection_selected.classList.remove("selected"); + const t = this.connection_selected.parentElement.classList[2].slice(9), + n = this.connection_selected.parentElement.classList[1].slice(13), + i = this.connection_selected.parentElement.classList[3], + s = this.connection_selected.parentElement.classList[4]; + this.connection_selected = null; + const o = document.createElementNS("http://www.w3.org/2000/svg", "circle"); + o.classList.add("point"); + var l = this.pos_x * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)) - this.precanvas.getBoundingClientRect().x * (this.precanvas.clientWidth / (this.precanvas.clientWidth * this.zoom)), + c = this.pos_y * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)) - this.precanvas.getBoundingClientRect().y * (this.precanvas.clientHeight / (this.precanvas.clientHeight * this.zoom)); + o.setAttributeNS(null, "cx", l), o.setAttributeNS(null, "cy", c), o.setAttributeNS(null, "r", this.reroute_width); + let d = 0; + if (this.reroute_fix_curvature) { + const t = e.parentElement.querySelectorAll(".main-path").length; + var a = document.createElementNS("http://www.w3.org/2000/svg", "path"); + if (a.classList.add("main-path"), a.setAttributeNS(null, "d", ""), e.parentElement.insertBefore(a, e.parentElement.children[t]), 1 === t) e.parentElement.appendChild(o); else { + const n = Array.from(e.parentElement.children).indexOf(e); + d = n, e.parentElement.insertBefore(o, e.parentElement.children[n + t + 1]) + } + } else e.parentElement.appendChild(o); + const r = t.slice(5), + h = this.drawflow.drawflow[this.module].data[r].outputs[i].connections.findIndex((function (e, t) { + return e.node === n && e.output === s + })); + void 0 === this.drawflow.drawflow[this.module].data[r].outputs[i].connections[h].points && (this.drawflow.drawflow[this.module].data[r].outputs[i].connections[h].points = []), this.reroute_fix_curvature ? (d > 0 || this.drawflow.drawflow[this.module].data[r].outputs[i].connections[h].points !== [] ? this.drawflow.drawflow[this.module].data[r].outputs[i].connections[h].points.splice(d, 0, { + pos_x: l, + pos_y: c + }) : this.drawflow.drawflow[this.module].data[r].outputs[i].connections[h].points.push({ + pos_x: l, + pos_y: c + }), e.parentElement.querySelectorAll(".main-path").forEach((e, t) => { + e.classList.remove("selected") + })) : this.drawflow.drawflow[this.module].data[r].outputs[i].connections[h].points.push({ + pos_x: l, + pos_y: c + }), this.dispatch("addReroute", r), this.updateConnectionNodes(t) + } + + removeReroutePoint(e) { + const t = e.parentElement.classList[2].slice(9), + n = e.parentElement.classList[1].slice(13), + i = e.parentElement.classList[3], + s = e.parentElement.classList[4]; + let o = Array.from(e.parentElement.children).indexOf(e); + const l = t.slice(5), + c = this.drawflow.drawflow[this.module].data[l].outputs[i].connections.findIndex((function (e, t) { + return e.node === n && e.output === s + })); + if (this.reroute_fix_curvature) { + const t = e.parentElement.querySelectorAll(".main-path").length; + e.parentElement.children[t - 1].remove(), o -= t, o < 0 && (o = 0) + } else o--; + this.drawflow.drawflow[this.module].data[l].outputs[i].connections[c].points.splice(o, 1), e.remove(), this.dispatch("removeReroute", l), this.updateConnectionNodes(t) + } + + registerNode(e, t, n = null, i = null) { + this.noderegister[e] = {html: t, props: n, options: i} + } + + getNodeFromId(e) { + var t = this.getModuleFromNodeId(e); + return JSON.parse(JSON.stringify(this.drawflow.drawflow[t].data[e])) + } + + getNodesFromName(e) { + var t = []; + const n = this.drawflow.drawflow; + return Object.keys(n).map((function (i, s) { + for (var o in n[i].data) n[i].data[o].name == e && t.push(n[i].data[o].id) + })), t + } + + addNode(e, t, n, i, s, o, l, c, d = !1) { + if (this.useuuid) var a = this.getUuid(); else a = this.nodeId; + const r = document.createElement("div"); + r.classList.add("parent-node"); + const h = document.createElement("div"); + h.innerHTML = "", h.setAttribute("id", "node-" + a), h.classList.add("drawflow-node"), "" != o && h.classList.add(...o.split(" ")); + const u = document.createElement("div"); + u.classList.add("inputs"); + const p = document.createElement("div"); + p.classList.add("outputs"); + const f = {}; + for (var m = 0; m < t; m++) { + const e = document.createElement("div"); + e.classList.add("input"), e.classList.add("input_" + (m + 1)), f["input_" + (m + 1)] = {connections: []}, u.appendChild(e) + } + const g = {}; + for (m = 0; m < n; m++) { + const e = document.createElement("div"); + e.classList.add("output"), e.classList.add("output_" + (m + 1)), g["output_" + (m + 1)] = {connections: []}, p.appendChild(e) + } + const _ = document.createElement("div"); + if (_.classList.add("drawflow_content_node"), !1 === d) _.innerHTML = c; else if (!0 === d) _.appendChild(this.noderegister[c].html.cloneNode(!0)); else if (3 === parseInt(this.render.version)) { + let e = this.render.h(this.noderegister[c].html, this.noderegister[c].props, this.noderegister[c].options); + e.appContext = this.parent, this.render.render(e, _) + } else { + let e = new this.render({ + parent: this.parent, + render: e => e(this.noderegister[c].html, {props: this.noderegister[c].props}), ...this.noderegister[c].options + }).$mount(); + _.appendChild(e.$el) + } + Object.entries(l).forEach((function (e, t) { + if ("object" == typeof e[1]) !function e(t, n, i) { + if (null === t) t = l[n]; else t = t[n]; + null !== t && Object.entries(t).forEach((function (n, s) { + if ("object" == typeof n[1]) e(t, n[0], i + "-" + n[0]); else for (var o = _.querySelectorAll("[df-" + i + "-" + n[0] + "]"), l = 0; l < o.length; l++) o[l].value = n[1], o[l].isContentEditable && (o[l].innerText = n[1]) + })) + }(null, e[0], e[0]); else for (var n = _.querySelectorAll("[df-" + e[0] + "]"), i = 0; i < n.length; i++) n[i].value = e[1], n[i].isContentEditable && (n[i].innerText = e[1]) + })), h.appendChild(u), h.appendChild(_), h.appendChild(p), h.style.top = s + "px", h.style.left = i + "px", r.appendChild(h), this.precanvas.appendChild(r); + var w = { + id: a, + name: e, + data: l, + class: o, + html: c, + typenode: d, + inputs: f, + outputs: g, + pos_x: i, + pos_y: s + }; + return this.drawflow.drawflow[this.module].data[a] = w, this.dispatch("nodeCreated", a), this.useuuid || this.nodeId++, a + } + + addNodeImport(e, t) { + const n = document.createElement("div"); + n.classList.add("parent-node"); + const i = document.createElement("div"); + i.innerHTML = "", i.setAttribute("id", "node-" + e.id), i.classList.add("drawflow-node"), "" != e.class && i.classList.add(...e.class.split(" ")); + const s = document.createElement("div"); + s.classList.add("inputs"); + const o = document.createElement("div"); + o.classList.add("outputs"), Object.keys(e.inputs).map((function (n, i) { + const o = document.createElement("div"); + o.classList.add("input"), o.classList.add(n), s.appendChild(o), Object.keys(e.inputs[n].connections).map((function (i, s) { + var o = document.createElementNS("http://www.w3.org/2000/svg", "svg"), + l = document.createElementNS("http://www.w3.org/2000/svg", "path"); + l.classList.add("main-path"), l.setAttributeNS(null, "d", ""), o.classList.add("connection"), o.classList.add("node_in_node-" + e.id), o.classList.add("node_out_node-" + e.inputs[n].connections[i].node), o.classList.add(e.inputs[n].connections[i].input), o.classList.add(n), o.appendChild(l), t.appendChild(o) + })) + })); + for (var l = 0; l < Object.keys(e.outputs).length; l++) { + const e = document.createElement("div"); + e.classList.add("output"), e.classList.add("output_" + (l + 1)), o.appendChild(e) + } + const c = document.createElement("div"); + if (c.classList.add("drawflow_content_node"), !1 === e.typenode) c.innerHTML = e.html; else if (!0 === e.typenode) c.appendChild(this.noderegister[e.html].html.cloneNode(!0)); else if (3 === parseInt(this.render.version)) { + let t = this.render.h(this.noderegister[e.html].html, this.noderegister[e.html].props, this.noderegister[e.html].options); + t.appContext = this.parent, this.render.render(t, c) + } else { + let t = new this.render({ + parent: this.parent, + render: t => t(this.noderegister[e.html].html, {props: this.noderegister[e.html].props}), ...this.noderegister[e.html].options + }).$mount(); + c.appendChild(t.$el) + } + Object.entries(e.data).forEach((function (t, n) { + if ("object" == typeof t[1]) !function t(n, i, s) { + if (null === n) n = e.data[i]; else n = n[i]; + null !== n && Object.entries(n).forEach((function (e, i) { + if ("object" == typeof e[1]) t(n, e[0], s + "-" + e[0]); else for (var o = c.querySelectorAll("[df-" + s + "-" + e[0] + "]"), l = 0; l < o.length; l++) o[l].value = e[1], o[l].isContentEditable && (o[l].innerText = e[1]) + })) + }(null, t[0], t[0]); else for (var i = c.querySelectorAll("[df-" + t[0] + "]"), s = 0; s < i.length; s++) i[s].value = t[1], i[s].isContentEditable && (i[s].innerText = t[1]) + })), i.appendChild(s), i.appendChild(c), i.appendChild(o), i.style.top = e.pos_y + "px", i.style.left = e.pos_x + "px", n.appendChild(i), this.precanvas.appendChild(n) + } + + addRerouteImport(e) { + const t = this.reroute_width, n = this.reroute_fix_curvature, + i = this.container; + Object.keys(e.outputs).map((function (s, o) { + Object.keys(e.outputs[s].connections).map((function (o, l) { + const c = e.outputs[s].connections[o].points; + void 0 !== c && c.forEach((l, d) => { + const a = e.outputs[s].connections[o].node, + r = e.outputs[s].connections[o].output, + h = i.querySelector(".connection.node_in_node-" + a + ".node_out_node-" + e.id + "." + s + "." + r); + if (n && 0 === d) for (var u = 0; u < c.length; u++) { + var p = document.createElementNS("http://www.w3.org/2000/svg", "path"); + p.classList.add("main-path"), p.setAttributeNS(null, "d", ""), h.appendChild(p) + } + const f = document.createElementNS("http://www.w3.org/2000/svg", "circle"); + f.classList.add("point"); + var m = l.pos_x, g = l.pos_y; + f.setAttributeNS(null, "cx", m), f.setAttributeNS(null, "cy", g), f.setAttributeNS(null, "r", t), h.appendChild(f) + }) + })) + })) + } + + updateNodeValue(e) { + for (var t = e.target.attributes, n = 0; n < t.length; n++) if (t[n].nodeName.startsWith("df-")) { + for (var i = t[n].nodeName.slice(3).split("-"), s = this.drawflow.drawflow[this.module].data[e.target.closest(".drawflow_content_node").parentElement.id.slice(5)].data, o = 0; o < i.length - 1; o += 1) null == s[i[o]] && (s[i[o]] = {}), s = s[i[o]]; + s[i[i.length - 1]] = e.target.value, e.target.isContentEditable && (s[i[i.length - 1]] = e.target.innerText), this.dispatch("nodeDataChanged", e.target.closest(".drawflow_content_node").parentElement.id.slice(5)) + } + } + + updateNodeDataFromId(e, t) { + var n = this.getModuleFromNodeId(e); + if (this.drawflow.drawflow[n].data[e].data = t, this.module === n) { + const n = this.container.querySelector("#node-" + e); + Object.entries(t).forEach((function (e, i) { + if ("object" == typeof e[1]) !function e(i, s, o) { + if (null === i) i = t[s]; else i = i[s]; + null !== i && Object.entries(i).forEach((function (t, s) { + if ("object" == typeof t[1]) e(i, t[0], o + "-" + t[0]); else for (var l = n.querySelectorAll("[df-" + o + "-" + t[0] + "]"), c = 0; c < l.length; c++) l[c].value = t[1], l[c].isContentEditable && (l[c].innerText = t[1]) + })) + }(null, e[0], e[0]); else for (var s = n.querySelectorAll("[df-" + e[0] + "]"), o = 0; o < s.length; o++) s[o].value = e[1], s[o].isContentEditable && (s[o].innerText = e[1]) + })) + } + } + + addNodeInput(e) { + var t = this.getModuleFromNodeId(e); + const n = this.getNodeFromId(e), + i = Object.keys(n.inputs).length; + if (this.module === t) { + const t = document.createElement("div"); + t.classList.add("input"), t.classList.add("input_" + (i + 1)), this.container.querySelector("#node-" + e + " .inputs").appendChild(t), this.updateConnectionNodes("node-" + e) + } + this.drawflow.drawflow[t].data[e].inputs["input_" + (i + 1)] = {connections: []} + } + + addNodeOutput(e) { + var t = this.getModuleFromNodeId(e); + const n = this.getNodeFromId(e), + i = Object.keys(n.outputs).length; + if (this.module === t) { + const t = document.createElement("div"); + t.classList.add("output"), t.classList.add("output_" + (i + 1)), this.container.querySelector("#node-" + e + " .outputs").appendChild(t), this.updateConnectionNodes("node-" + e) + } + this.drawflow.drawflow[t].data[e].outputs["output_" + (i + 1)] = {connections: []} + } + + removeNodeInput(e, t) { + var n = this.getModuleFromNodeId(e); + const i = this.getNodeFromId(e); + this.module === n && this.container.querySelector("#node-" + e + " .inputs .input." + t).remove(); + const s = []; + Object.keys(i.inputs[t].connections).map((function (n, o) { + const l = i.inputs[t].connections[o].node, + c = i.inputs[t].connections[o].input; + s.push({ + id_output: l, + id: e, + output_class: c, + input_class: t + }) + })), s.forEach((e, t) => { + this.removeSingleConnection(e.id_output, e.id, e.output_class, e.input_class) + }), delete this.drawflow.drawflow[n].data[e].inputs[t]; + const o = [], l = this.drawflow.drawflow[n].data[e].inputs; + Object.keys(l).map((function (e, t) { + o.push(l[e]) + })), this.drawflow.drawflow[n].data[e].inputs = {}; + const c = t.slice(6); + let d = []; + if (o.forEach((t, i) => { + t.connections.forEach((e, t) => { + d.push(e) + }), this.drawflow.drawflow[n].data[e].inputs["input_" + (i + 1)] = t + }), d = new Set(d.map(e => JSON.stringify(e))), d = Array.from(d).map(e => JSON.parse(e)), this.module === n) { + this.container.querySelectorAll("#node-" + e + " .inputs .input").forEach((e, t) => { + const n = e.classList[1].slice(6); + parseInt(c) < parseInt(n) && (e.classList.remove("input_" + n), e.classList.add("input_" + (n - 1))) + }) + } + d.forEach((t, i) => { + this.drawflow.drawflow[n].data[t.node].outputs[t.input].connections.forEach((i, s) => { + if (i.node == e) { + const o = i.output.slice(6); + if (parseInt(c) < parseInt(o)) { + if (this.module === n) { + const n = this.container.querySelector(".connection.node_in_node-" + e + ".node_out_node-" + t.node + "." + t.input + ".input_" + o); + n.classList.remove("input_" + o), n.classList.add("input_" + (o - 1)) + } + i.points ? this.drawflow.drawflow[n].data[t.node].outputs[t.input].connections[s] = { + node: i.node, + output: "input_" + (o - 1), + points: i.points + } : this.drawflow.drawflow[n].data[t.node].outputs[t.input].connections[s] = { + node: i.node, + output: "input_" + (o - 1) + } + } + } + }) + }), this.updateConnectionNodes("node-" + e) + } + + removeNodeOutput(e, t) { + var n = this.getModuleFromNodeId(e); + const i = this.getNodeFromId(e); + this.module === n && this.container.querySelector("#node-" + e + " .outputs .output." + t).remove(); + const s = []; + Object.keys(i.outputs[t].connections).map((function (n, o) { + const l = i.outputs[t].connections[o].node, + c = i.outputs[t].connections[o].output; + s.push({ + id: e, + id_input: l, + output_class: t, + input_class: c + }) + })), s.forEach((e, t) => { + this.removeSingleConnection(e.id, e.id_input, e.output_class, e.input_class) + }), delete this.drawflow.drawflow[n].data[e].outputs[t]; + const o = [], l = this.drawflow.drawflow[n].data[e].outputs; + Object.keys(l).map((function (e, t) { + o.push(l[e]) + })), this.drawflow.drawflow[n].data[e].outputs = {}; + const c = t.slice(7); + let d = []; + if (o.forEach((t, i) => { + t.connections.forEach((e, t) => { + d.push({node: e.node, output: e.output}) + }), this.drawflow.drawflow[n].data[e].outputs["output_" + (i + 1)] = t + }), d = new Set(d.map(e => JSON.stringify(e))), d = Array.from(d).map(e => JSON.parse(e)), this.module === n) { + this.container.querySelectorAll("#node-" + e + " .outputs .output").forEach((e, t) => { + const n = e.classList[1].slice(7); + parseInt(c) < parseInt(n) && (e.classList.remove("output_" + n), e.classList.add("output_" + (n - 1))) + }) + } + d.forEach((t, i) => { + this.drawflow.drawflow[n].data[t.node].inputs[t.output].connections.forEach((i, s) => { + if (i.node == e) { + const o = i.input.slice(7); + if (parseInt(c) < parseInt(o)) { + if (this.module === n) { + const n = this.container.querySelector(".connection.node_in_node-" + t.node + ".node_out_node-" + e + ".output_" + o + "." + t.output); + n.classList.remove("output_" + o), n.classList.remove(t.output), n.classList.add("output_" + (o - 1)), n.classList.add(t.output) + } + i.points ? this.drawflow.drawflow[n].data[t.node].inputs[t.output].connections[s] = { + node: i.node, + input: "output_" + (o - 1), + points: i.points + } : this.drawflow.drawflow[n].data[t.node].inputs[t.output].connections[s] = { + node: i.node, + input: "output_" + (o - 1) + } + } + } + }) + }), this.updateConnectionNodes("node-" + e) + } + + removeNodeId(e) { + this.removeConnectionNodeId(e); + var t = this.getModuleFromNodeId(e.slice(5)); + this.module === t && this.container.querySelector("#" + e).remove(), delete this.drawflow.drawflow[t].data[e.slice(5)], this.dispatch("nodeRemoved", e.slice(5)) + } + + removeConnection() { + if (null != this.connection_selected) { + var e = this.connection_selected.parentElement.classList; + this.connection_selected.parentElement.remove(); + var t = this.drawflow.drawflow[this.module].data[e[2].slice(14)].outputs[e[3]].connections.findIndex((function (t, n) { + return t.node === e[1].slice(13) && t.output === e[4] + })); + this.drawflow.drawflow[this.module].data[e[2].slice(14)].outputs[e[3]].connections.splice(t, 1); + var n = this.drawflow.drawflow[this.module].data[e[1].slice(13)].inputs[e[4]].connections.findIndex((function (t, n) { + return t.node === e[2].slice(14) && t.input === e[3] + })); + this.drawflow.drawflow[this.module].data[e[1].slice(13)].inputs[e[4]].connections.splice(n, 1), this.dispatch("connectionRemoved", { + output_id: e[2].slice(14), + input_id: e[1].slice(13), + output_class: e[3], + input_class: e[4] + }), this.connection_selected = null + } + } + + removeSingleConnection(e, t, n, i) { + var s = this.getModuleFromNodeId(e); + if (s === this.getModuleFromNodeId(t)) { + if (this.drawflow.drawflow[s].data[e].outputs[n].connections.findIndex((function (e, n) { + return e.node == t && e.output === i + })) > -1) { + this.module === s && this.container.querySelector(".connection.node_in_node-" + t + ".node_out_node-" + e + "." + n + "." + i).remove(); + var o = this.drawflow.drawflow[s].data[e].outputs[n].connections.findIndex((function (e, n) { + return e.node == t && e.output === i + })); + this.drawflow.drawflow[s].data[e].outputs[n].connections.splice(o, 1); + var l = this.drawflow.drawflow[s].data[t].inputs[i].connections.findIndex((function (t, i) { + return t.node == e && t.input === n + })); + return this.drawflow.drawflow[s].data[t].inputs[i].connections.splice(l, 1), this.dispatch("connectionRemoved", { + output_id: e, + input_id: t, + output_class: n, + input_class: i + }), !0 + } + return !1 + } + return !1 + } + + removeConnectionNodeId(e) { + const t = "node_in_" + e, n = "node_out_" + e, + i = this.container.querySelectorAll("." + n); + for (var s = i.length - 1; s >= 0; s--) { + var o = i[s].classList, + l = this.drawflow.drawflow[this.module].data[o[1].slice(13)].inputs[o[4]].connections.findIndex((function (e, t) { + return e.node === o[2].slice(14) && e.input === o[3] + })); + this.drawflow.drawflow[this.module].data[o[1].slice(13)].inputs[o[4]].connections.splice(l, 1); + var c = this.drawflow.drawflow[this.module].data[o[2].slice(14)].outputs[o[3]].connections.findIndex((function (e, t) { + return e.node === o[1].slice(13) && e.output === o[4] + })); + this.drawflow.drawflow[this.module].data[o[2].slice(14)].outputs[o[3]].connections.splice(c, 1), i[s].remove(), this.dispatch("connectionRemoved", { + output_id: o[2].slice(14), + input_id: o[1].slice(13), + output_class: o[3], + input_class: o[4] + }) + } + const d = this.container.querySelectorAll("." + t); + for (s = d.length - 1; s >= 0; s--) { + o = d[s].classList, c = this.drawflow.drawflow[this.module].data[o[2].slice(14)].outputs[o[3]].connections.findIndex((function (e, t) { + return e.node === o[1].slice(13) && e.output === o[4] + })); + this.drawflow.drawflow[this.module].data[o[2].slice(14)].outputs[o[3]].connections.splice(c, 1); + l = this.drawflow.drawflow[this.module].data[o[1].slice(13)].inputs[o[4]].connections.findIndex((function (e, t) { + return e.node === o[2].slice(14) && e.input === o[3] + })); + this.drawflow.drawflow[this.module].data[o[1].slice(13)].inputs[o[4]].connections.splice(l, 1), d[s].remove(), this.dispatch("connectionRemoved", { + output_id: o[2].slice(14), + input_id: o[1].slice(13), + output_class: o[3], + input_class: o[4] + }) + } + } + + getModuleFromNodeId(e) { + var t; + const n = this.drawflow.drawflow; + return Object.keys(n).map((function (i, s) { + Object.keys(n[i].data).map((function (n, s) { + n == e && (t = i) + })) + })), t + } + + addModule(e) { + this.drawflow.drawflow[e] = {data: {}}, this.dispatch("moduleCreated", e) + } + + changeModule(e) { + this.dispatch("moduleChanged", e), this.module = e, this.precanvas.innerHTML = "", this.canvas_x = 0, this.canvas_y = 0, this.pos_x = 0, this.pos_y = 0, this.mouse_x = 0, this.mouse_y = 0, this.zoom = 1, this.zoom_last_value = 1, this.precanvas.style.transform = "", this.import(this.drawflow, !1) + } + + removeModule(e) { + this.module === e && this.changeModule("Home"), delete this.drawflow.drawflow[e], this.dispatch("moduleRemoved", e) + } + + clearModuleSelected() { + this.precanvas.innerHTML = "", this.drawflow.drawflow[this.module] = {data: {}} + } + + clear() { + this.precanvas.innerHTML = "", this.drawflow = {drawflow: {Home: {data: {}}}} + } + + export() { + const e = JSON.parse(JSON.stringify(this.drawflow)); + return this.dispatch("export", e), e + } + + import(e, t = !0) { + this.clear(), this.drawflow = JSON.parse(JSON.stringify(e)), this.load(), t && this.dispatch("import", "import") + } + + on(e, t) { + return "function" != typeof t ? (console.error("The listener callback must be a function, the given type is " + typeof t), !1) : "string" != typeof e ? (console.error("The event name must be a string, the given type is " + typeof e), !1) : (void 0 === this.events[e] && (this.events[e] = {listeners: []}), void this.events[e].listeners.push(t)) + } + + removeListener(e, t) { + if (!this.events[e]) return !1; + const n = this.events[e].listeners, i = n.indexOf(t); + i > -1 && n.splice(i, 1) + } + + dispatch(e, t) { + if (void 0 === this.events[e]) return !1; + this.events[e].listeners.forEach(e => { + e(t) + }) + } + + getUuid() { + for (var e = [], t = 0; t < 36; t++) e[t] = "0123456789abcdef".substr(Math.floor(16 * Math.random()), 1); + return e[14] = "4", e[19] = "0123456789abcdef".substr(3 & e[19] | 8, 1), e[8] = e[13] = e[18] = e[23] = "-", e.join("") + } + } + }]).default +})); \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/highlight.min.js b/src/agentscope/studio/static/js_third_party/highlight.min.js new file mode 100644 index 000000000..4b0791ab2 --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/highlight.min.js @@ -0,0 +1,1213 @@ +/*! + Highlight.js v11.9.0 (git: f47103d4f1) + (c) 2006-2023 undefined and other contributors + License: BSD-3-Clause + */ + var hljs=function(){"use strict";function e(n){ + return n instanceof Map?n.clear=n.delete=n.set=()=>{ + throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ + throw Error("set is read-only") + }),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ + const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) + })),n}class n{constructor(e){ + void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} + ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ + return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") + }function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] + ;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope + ;class r{constructor(e,n){ + this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ + this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ + if(e.startsWith("language:"))return e.replace("language:","language-") + ;if(e.includes(".")){const t=e.split(".") + ;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") + }return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} + closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ + this.buffer+=``}}const s=(e={})=>{const n={children:[]} + ;return Object.assign(n,e),n};class o{constructor(){ + this.rootNode=s(),this.stack=[this.rootNode]}get top(){ + return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ + this.top.children.push(e)}openNode(e){const n=s({scope:e}) + ;this.add(n),this.stack.push(n)}closeNode(){ + if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ + for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} + walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ + return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), + n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ + "string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ + o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} + addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ + this.closeNode()}__addSublanguage(e,n){const t=e.root + ;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ + return new r(this,this.options).value()}finalize(){ + return this.closeAllNodes(),!0}}function c(e){ + return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} + function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} + function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ + const n=e[e.length-1] + ;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} + })(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} + function p(e){return RegExp(e.toString()+"|").exec("").length-1} + const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ + ;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t + ;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} + i+=a.substring(0,e.index), + a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], + "("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} + const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",v={ + begin:"\\\\[\\s\\S]",relevance:0},O={scope:"string",begin:"'",end:"'", + illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", + contains:[v]},x=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, + contains:[]},t);i.contains.push({scope:"doctag", + begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", + end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) + ;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) + ;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i + },M=x("//","$"),S=x("/\\*","\\*/"),A=x("#","$");var C=Object.freeze({ + __proto__:null,APOS_STRING_MODE:O,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ + scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:x, + C_BLOCK_COMMENT_MODE:S,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", + begin:N,relevance:0},C_NUMBER_RE:N,END_SAME_AS_BEGIN:e=>Object.assign(e,{ + "on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ + n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:A,IDENT_RE:f, + MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, + NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, + PHRASAL_WORDS_MODE:{ + begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ + },QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, + end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, + RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", + SHEBANG:(e={})=>{const n=/^#![ ]*\// + ;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, + end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, + TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, + UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ + "."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ + void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ + n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", + e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, + void 0===e.relevance&&(e.relevance=0))}function I(e,n){ + Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ + if(e.match){ + if(e.begin||e.end)throw Error("begin & end are not supported with match") + ;e.begin=e.match,delete e.match}}function B(e,n){ + void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return + ;if(e.starts)throw Error("beforeMatch cannot be used with starts") + ;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] + })),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ + relevance:0,contains:[Object.assign(t,{endsParent:!0})] + },e.relevance=0,delete t.beforeMatch + },z=["of","and","for","in","not","or","if","then","parent","list","value"],F="keyword" + ;function U(e,n,t=F){const a=Object.create(null) + ;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ + Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ + n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") + ;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ + return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ + console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},q=(e,n)=>{ + P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) + },G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} + ;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) + ;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ + e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, + delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ + _wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope + }),(e=>{if(Array.isArray(e.begin)){ + if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), + G + ;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), + G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ + if(Array.isArray(e.end)){ + if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), + G + ;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), + G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ + function n(n,t){ + return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) + }class t{constructor(){ + this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} + addRule(e,n){ + n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), + this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) + ;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" + }),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex + ;const n=this.matcherRe.exec(e);if(!n)return null + ;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] + ;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ + this.rules=[],this.multiRegexes=[], + this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ + if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t + ;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), + n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ + return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ + this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ + const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex + ;let t=n.exec(e) + ;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ + const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} + return t&&(this.regexIndex+=t.position+1, + this.regexIndex===this.count&&this.considerAll()),t}} + if(e.compilerExtensions||(e.compilerExtensions=[]), + e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") + ;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r + ;if(r.isCompiled)return o + ;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), + r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null + ;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), + l=r.keywords.$pattern, + delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=U(r.keywords,e.case_insensitive)), + o.keywordPatternRe=n(l,!0), + s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), + r.end&&(o.endRe=n(o.end)), + o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), + r.illegal&&(o.illegalRe=n(r.illegal)), + r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ + variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ + starts:e.starts?a(e.starts):null + }):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) + })),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i + ;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" + }))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" + }),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ + return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ + constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} + const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ + const a=Object.create(null),i=Object.create(null),r=[];let s=!0 + ;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ + disableAutodetect:!0,name:"Plain text",contains:[]};let p={ + ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, + languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", + cssSelector:"pre code",languages:null,__emitter:l};function _(e){ + return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" + ;"object"==typeof n?(a=e, + t=n.ignoreIllegals,i=n.language):(q("10.7.0","highlight(lang, code, ...args) has been deprecated."), + q("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), + i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};x("before:highlight",r) + ;const s=r.result?r.result:f(r.language,r.code,t) + ;return s.code=r.code,x("after:highlight",s),s}function f(e,t,i,r){ + const l=Object.create(null);function c(){if(!x.keywords)return void S.addText(A) + ;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(A),t="" + ;for(;n;){t+=A.substring(e,n.index) + ;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){ + const[e,a]=r + ;if(S.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ + const t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] + ;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(A)}var a + ;t+=A.substring(e),S.addText(t)}function d(){null!=x.subLanguage?(()=>{ + if(""===A)return;let e=null;if("string"==typeof x.subLanguage){ + if(!a[x.subLanguage])return void S.addText(A) + ;e=f(x.subLanguage,A,!0,M[x.subLanguage]),M[x.subLanguage]=e._top + }else e=E(A,x.subLanguage.length?x.subLanguage:null) + ;x.relevance>0&&(C+=e.relevance),S.__addSublanguage(e._emitter,e.language) + })():c(),A=""}function g(e,n){ + ""!==e&&(S.startScope(n),S.addText(e),S.endScope())}function u(e,n){let t=1 + ;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} + const a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(A=i,c(),A=""),t++}} + function b(e,n){ + return e.scope&&"string"==typeof e.scope&&S.openNode(w.classNameAliases[e.scope]||e.scope), + e.beginScope&&(e.beginScope._wrap?(g(A,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), + A=""):e.beginScope._multi&&(u(e.beginScope,n),A="")),x=Object.create(e,{parent:{ + value:x}}),x}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) + ;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) + ;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ + for(;e.endsParent&&e.parent;)e=e.parent;return e}} + if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ + return 0===x.matcher.regexIndex?(A+=e[0],1):(D=!0,0)}function h(e){ + const n=e[0],a=t.substring(e.index),i=m(x,e,a);if(!i)return ee;const r=x + ;x.endScope&&x.endScope._wrap?(d(), + g(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(d(), + u(x.endScope,e)):r.skip?A+=n:(r.returnEnd||r.excludeEnd||(A+=n), + d(),r.excludeEnd&&(A=n));do{ + x.scope&&S.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent + }while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} + let y={};function N(a,r){const o=r&&r[0];if(A+=a,null==o)return d(),0 + ;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ + if(A+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) + ;throw n.languageName=e,n.badRule=y.rule,n}return 1} + if(y=r,"begin"===r.type)return(e=>{ + const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] + ;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) + ;return a.skip?A+=t:(a.excludeBegin&&(A+=t), + d(),a.returnBegin||a.excludeBegin||(A=t)),b(a,e),a.returnBegin?0:t.length})(r) + ;if("illegal"===r.type&&!i){ + const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"")+'"') + ;throw e.mode=x,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} + if("illegal"===r.type&&""===o)return 1 + ;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") + ;return A+=o,o.length}const w=v(e) + ;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') + ;const O=Q(w);let k="",x=r||O;const M={},S=new p.__emitter(p);(()=>{const e=[] + ;for(let n=x;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) + ;e.forEach((e=>S.openNode(e)))})();let A="",C=0,T=0,R=0,D=!1;try{ + if(w.__emitTokens)w.__emitTokens(t,S);else{for(x.matcher.considerAll();;){ + R++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=T + ;const e=x.matcher.exec(t);if(!e)break;const n=N(t.substring(T,e.index),e) + ;T=e.index+n}N(t.substring(T))}return S.finalize(),k=S.toHTML(),{language:e, + value:k,relevance:C,illegal:!1,_emitter:S,_top:x}}catch(n){ + if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), + illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, + context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:k},_emitter:S};if(s)return{ + language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:S,_top:x} + ;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ + const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} + ;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(k).map((n=>f(n,e,!1))) + ;i.unshift(t);const r=i.sort(((e,n)=>{ + if(e.relevance!==n.relevance)return n.relevance-e.relevance + ;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 + ;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s + ;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ + let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" + ;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) + ;return n||(H(o.replace("{}",t[1])), + H("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} + return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return + ;if(x("before:highlightElement",{el:e,language:t + }),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) + ;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), + console.warn("The element with unescaped HTML:"), + console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) + ;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) + ;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t + ;e.classList.add("hljs"),e.classList.add("language-"+a) + })(e,t,r.language),e.result={language:r.language,re:r.relevance, + relevance:r.relevance},r.secondBest&&(e.secondBest={ + language:r.secondBest.language,relevance:r.secondBest.relevance + }),x("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){ + "loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):N=!0 + }function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} + function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ + i[e.toLowerCase()]=n}))}function k(e){const n=v(e) + ;return n&&!n.disableAutodetect}function x(e,n){const t=e;r.forEach((e=>{ + e[t]&&e[t](n)}))} + "undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ + N&&w()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:w, + highlightElement:y, + highlightBlock:e=>(q("10.7.0","highlightBlock will be removed entirely in v12.0"), + q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, + initHighlighting:()=>{ + w(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, + initHighlightingOnLoad:()=>{ + w(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") + },registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ + if(K("Language definition for '{}' could not be registered.".replace("{}",e)), + !s)throw n;K(n),i=c} + i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&O(i.aliases,{ + languageName:e})},unregisterLanguage:e=>{delete a[e] + ;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, + listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:O, + autoDetection:k,inherit:Y,addPlugin:e=>{(e=>{ + e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ + e["before:highlightBlock"](Object.assign({block:n.el},n)) + }),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ + e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, + removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ + s=!1},t.safeMode=()=>{s=!0},t.versionString="11.9.0",t.regex={concat:b, + lookahead:d,either:m,optional:u,anyNumberOfTimes:g} + ;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t + },te=ne({});te.newInstance=()=>ne({});var ae=te;const ie=e=>({IMPORTANT:{ + scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ + scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, + FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, + ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", + contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ + scope:"number", + begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", + relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} + }),re=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],se=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],oe=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],le=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],ce=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),de=oe.concat(le) + ;var ge="[0-9](_*[0-9])*",ue=`\\.(${ge})`,be="[0-9a-fA-F](_*[0-9a-fA-F])*",me={ + className:"number",variants:[{ + begin:`(\\b(${ge})((${ue})|\\.)?|(${ue}))[eE][+-]?(${ge})[fFdD]?\\b`},{ + begin:`\\b(${ge})((${ue})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ + begin:`(${ue})[fFdD]?\\b`},{begin:`\\b(${ge})[fFdD]\\b`},{ + begin:`\\b0[xX]((${be})\\.?|(${be})?\\.(${be}))[pP][+-]?(${ge})[fFdD]?\\b`},{ + begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${be})[lL]?\\b`},{ + begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], + relevance:0};function pe(e,n,t){return-1===t?"":e.replace(n,(a=>pe(e,n,t-1)))} + const _e="[A-Za-z$_][0-9A-Za-z$_]*",he=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],fe=["true","false","null","undefined","NaN","Infinity"],Ee=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],ye=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ne=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ve=[].concat(Ne,Ee,ye) + ;function Oe(e){const n=e.regex,t=_e,a={begin:/<[A-Za-z0-9\\._:-]+/, + end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ + const t=e[0].length+e.index,a=e.input[t] + ;if("<"===a||","===a)return void n.ignoreMatch();let i + ;">"===a&&(((e,{after:n})=>{const t="",M={ + match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(x)], + keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} + ;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ + PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, + contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ + label:"use_strict",className:"meta",relevance:10, + begin:/^\s*['"]use (strict|asm)['"]/ + },e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ + className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ + begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", + keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ + className:"function",begin:x,returnBegin:!0,end:"\\s*=>",contains:[{ + className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ + className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, + excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0},{match:/\s+/, + relevance:0},{variants:[{begin:"<>",end:""},{ + match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, + "on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ + begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},N,{ + beginKeywords:"while if switch catch for"},{ + begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", + returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, + className:"title.function"})]},{match:/\.\.\./,relevance:0},O,{match:"\\$"+t, + relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, + contains:[f]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, + className:"variable.constant"},E,k,{match:/\$[(.]/}]}} + const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Me=["init","self"].map(ke),Se=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ce=["false","nil","true"],Te=["assignment","associativity","higherThan","left","lowerThan","none","right"],Re=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],De=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Ie=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Le=m(Ie,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Be=b(Ie,Le,"*"),$e=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),ze=m($e,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b($e,ze,"*"),Ue=b(/[A-Z]/,ze,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Pe=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] + ;var Ke=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ + begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} + ;Object.assign(t,{className:"variable",variants:[{ + begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ + className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},r={ + begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, + end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/, + contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(s);const o={begin:/\$?\(\(/, + end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] + },l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 + }),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, + contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ + name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, + keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], + literal:["true","false"], + built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] + },contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{ + match:/\\"/},{className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}, + grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] + }),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ + className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ + match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ + begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ + begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", + end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ + begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ + className:"number",variants:[{begin:"\\b(0b[01']+)"},{ + begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" + },{ + begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" + }],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ + keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" + },contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ + className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ + className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 + },g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ + keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], + type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], + literal:"true false NULL", + built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" + },b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ + begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], + keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, + contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ + begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, + keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ + begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], + relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, + keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, + end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] + }]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, + disableAutodetect:!0,illegal:"=]/,contains:[{ + beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, + strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ + contains:[{begin:/\\\n/}] + }),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ + className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ + begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ + begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", + end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ + begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ + className:"number",variants:[{begin:"\\b(0b[01']+)"},{ + begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" + },{ + begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" + }],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ + keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" + },contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ + className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ + className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 + },g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ + type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], + keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], + literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], + _type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] + },b={className:"function.dispatch",relevance:0,keywords:{ + _hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] + }, + begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) + },m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ + begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], + keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u, + contains:m.concat(["self"]),relevance:0}]),relevance:0},_={className:"function", + begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, + keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ + begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ + begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ + className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, + contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, + relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] + },s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", + aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ + match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], + className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ + keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), + built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], + literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ + begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ + begin:"\\b(0b[01']+)"},{ + begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ + begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" + }],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] + },r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, + keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, + end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ + },e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ + begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, + contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) + ;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], + o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ + illegal:/\n/})];const g={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] + },u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t] + },b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ + begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], + keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, + contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ + begin:"\x3c!--|--\x3e"},{begin:""}]}] + }),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", + end:"$",keywords:{ + keyword:"if else elif endif define undef warning error line region endregion pragma checksum" + }},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, + illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" + },t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", + relevance:0,end:/[{;=]/,illegal:/[^\s:]/, + contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ + beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, + contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", + begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ + className:"string",begin:/"/,end:/"/}]},{ + beginKeywords:"new return throw await else",relevance:0},{className:"function", + begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, + end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ + beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", + relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, + contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", + begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, + contains:[g,a,e.C_BLOCK_COMMENT_MODE] + },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ + const n=e.regex,t=ie(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ + name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ + keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, + contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ + },t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 + },{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 + },t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ + begin:":("+oe.join("|")+")"},{begin:":(:)?("+le.join("|")+")"}] + },t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b"},{ + begin:/:/,end:/[;}{]/, + contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ + begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" + },contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, + excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", + relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ + },{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ + $pattern:/[a-z-]+/,keyword:"and or not only",attribute:se.join(" ")},contains:[{ + begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ + className:"selector-tag",begin:"\\b("+re.join("|")+")\\b"}]}},grmr_diff:e=>{ + const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ + className:"meta",relevance:10, + match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) + },{className:"comment",variants:[{ + begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), + end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ + className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, + end:/$/}]}},grmr_go:e=>{const n={ + keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], + type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], + literal:["true","false","iota","nil"], + built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] + };return{name:"Go",aliases:["golang"],keywords:n,illegal:"{const n=e.regex;return{name:"GraphQL",aliases:["gql"], + case_insensitive:!0,disableAutodetect:!1,keywords:{ + keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], + literal:["true","false","null"]}, + contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ + scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", + begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, + end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ + scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), + relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{const n=e.regex,t={ + className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ + begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{begin:/;/,end:/$/},{begin:/#/, + end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ + begin:/\$\{(.*?)\}/}]},r={className:"literal", + begin:/\bon|off|true|false|yes|no\b/},s={className:"string", + contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ + begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] + },o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 + },l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ + name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, + contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ + begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), + className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ + const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+pe("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ + keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"], + literal:["false","true","null"], + type:["char","boolean","long","float","int","byte","short","double"], + built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ + begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, + end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} + ;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, + contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, + relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ + begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 + },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, + className:"string",contains:[e.BACKSLASH_ESCAPE] + },e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ + match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ + 1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ + begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", + 3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", + 3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ + beginKeywords:"new throw return else",relevance:0},{ + begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ + 2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, + end:/\)/,keywords:i,relevance:0, + contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,me,e.C_BLOCK_COMMENT_MODE] + },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},me,r]}},grmr_javascript:Oe, + grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", + beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{ + className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ + match:/[{}[\],:]/,className:"punctuation",relevance:0 + },e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], + illegal:"\\S"}},grmr_kotlin:e=>{const n={ + keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", + built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", + literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" + },a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ + className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", + variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", + illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, + contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ + className:"meta", + begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" + },o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, + end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] + },l=me,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ + variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, + contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], + {name:"Kotlin",aliases:["kt","kts"],keywords:n, + contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", + begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", + begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", + begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", + returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ + begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, + contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, + keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, + endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, + endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 + },e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{ + begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ + 3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, + illegal:"extends implements",contains:[{ + beginKeywords:"public protected internal private constructor" + },e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, + excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, + excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", + end:"$",illegal:"\n"},l]}},grmr_less:e=>{ + const n=ie(e),t=de,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ + className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, + relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", + attribute:se.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, + relevance:0} + ;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ + begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", + excludeEnd:!0} + },n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ + className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 + },n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ + begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, + contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", + returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ + },n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b", + end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] + },m={className:"keyword", + begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", + starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ + className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a + }],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ + begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, + returnEnd:!0,illegal:"[<='$\"]",relevance:0, + contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ + begin:"\\b("+re.join("|")+")\\b",className:"selector-tag" + },n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ + className:"selector-pseudo",begin:":("+oe.join("|")+")"},{ + className:"selector-pseudo",begin:":(:)?("+le.join("|")+")"},{begin:/\(/, + end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ + begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} + ;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), + {name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, + grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] + },i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 + })];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, + literal:"true false nil", + keyword:"and break do else elseif end for goto if in local not or repeat return then until while", + built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" + },contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", + contains:[e.inherit(e.TITLE_MODE,{ + begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", + begin:"\\(",endsWithParent:!0,contains:i}].concat(i) + },e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", + begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ + className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", + contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ + const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ + variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ + begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, + relevance:2},{ + begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), + relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ + begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ + },{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, + returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", + excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", + end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], + variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] + },i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ + begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] + }),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) + ;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) + })),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ + className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ + begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", + contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", + end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, + end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ + begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ + begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", + contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ + begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ + className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ + className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_objectivec:e=>{ + const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, + keyword:["@interface","@class","@protocol","@implementation"]};return{ + name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], + keywords:{"variable.language":["this","super"],$pattern:n, + keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], + literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], + built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], + type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] + },illegal:"/,end:/$/,illegal:"\\n" + },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", + begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, + contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, + relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ + $pattern:/[\w.]+/, + keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" + },i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, + end:/\}/},s={variants:[{begin:/\$\d/},{ + begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") + },{begin:/[$%@][^\s\w{]/,relevance:0}] + },o=[e.BACKSLASH_ESCAPE,i,s],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{ + const r="\\1"===i?i:n.concat(i,a) + ;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) + },d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ + endsWithParent:!0}),r,{className:"string",contains:o,variants:[{ + begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", + end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ + begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", + relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", + contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", + contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ + begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", + begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", + relevance:0},{ + begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", + keywords:"split return print reverse grep",relevance:0, + contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ + begin:c("s|tr|y",n.either(...l,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{ + begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")}],relevance:2},{ + className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ + begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...l,{capture:!0 + }),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ + begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", + end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ + begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", + subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] + }];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a, + contains:g}},grmr_php:e=>{ + const n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ + scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ + begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null + }),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ + illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ + begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, + contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ + n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ + n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ + begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ + begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ + begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ + begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" + }],relevance:0 + },g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ + keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ + n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) + })),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ + match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ + 1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ + match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" + }},{match:[/::/,/class/],scope:{2:"variable.language"}},{ + match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", + 3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], + scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", + 3:"variable.language"}}]},E={scope:"attr", + match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, + begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] + },N={relevance:0, + match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], + scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(N) + ;const w=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, + keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, + endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ + begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, + contains:["self",...w]},...w,{scope:"meta",match:i}] + },e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ + scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, + keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, + contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ + begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ + begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,N,f,{ + match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ + scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, + excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" + },e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", + begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, + contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"class",variants:[{ + beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", + illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ + beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ + beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, + contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ + beginKeywords:"use",relevance:0,end:";",contains:[{ + match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} + },grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{ + begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*", + end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0 + },e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null, + skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null, + contains:null,skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text", + aliases:["text","txt"],disableAutodetect:!0}),grmr_python:e=>{ + const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ + $pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, + built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], + literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], + type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] + },r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, + end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ + className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ + begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, + contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ + begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, + contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ + begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, + contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, + end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([uU]|[rR])'/,end:/'/, + relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ + begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, + end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, + contains:[e.BACKSLASH_ESCAPE,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, + contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] + },c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ + className:"number",relevance:0,variants:[{ + begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ + begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ + begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` + },{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` + }]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, + contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ + className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, + end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, + contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ + name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, + illegal:/(<\/|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", + relevance:0},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{ + 1:"keyword",3:"title.function"},contains:[m]},{variants:[{ + match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], + scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ + className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, + grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", + starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ + begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ + const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) + ;return{name:"R",keywords:{$pattern:t, + keyword:"function if in break next repeat else for while", + literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", + built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" + },contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, + starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), + endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ + scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 + }]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] + }),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], + variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ + }),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ + }),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ + }),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ + }),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ + }),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', + relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ + 1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, + match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ + 2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, + match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ + match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", + contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ + const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ + "variable.constant":["__FILE__","__LINE__","__ENCODING__"], + "variable.language":["self","super"], + keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], + built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], + literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ + begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] + }),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 + }),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, + end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], + variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ + begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ + begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, + end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ + begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ + begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ + begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ + begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ + begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), + contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, + contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", + relevance:0,variants:[{ + begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ + begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" + },{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ + begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ + begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ + className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, + keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ + match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", + 4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ + 2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ + 1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, + className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ + match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ + begin:e.IDENT_RE+"::"},{className:"symbol", + begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", + begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", + begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ + className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, + relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", + keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], + illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ + begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", + end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) + ;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} + },{className:"meta.prompt", + begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", + starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", + aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, + contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, + grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0, + begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) + },a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] + ;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r, + keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], + literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t]}}, + grmr_scss:e=>{const n=ie(e),t=le,a=oe,i="@[a-z-]+",r={className:"variable", + begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", + case_insensitive:!0,illegal:"[=/|']", + contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ + className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ + className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 + },n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", + begin:"\\b("+re.join("|")+")\\b",relevance:0},{className:"selector-pseudo", + begin:":("+a.join("|")+")"},{className:"selector-pseudo", + begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, + contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", + begin:"\\b("+ce.join("|")+")\\b"},{ + begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" + },{begin:/:/,end:/[;}{]/,relevance:0, + contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] + },{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ + begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, + keyword:"and or not only",attribute:se.join(" ")},contains:[{begin:i, + className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" + },r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] + },n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", + aliases:["console","shellsession"],contains:[{className:"meta.prompt", + begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, + subLanguage:"bash"}}]}),grmr_sql:e=>{ + const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ + begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} + ;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ + $pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t + ;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) + })(l,{when:e=>e.length<3}),literal:a,type:i, + built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] + },contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, + keyword:l.concat(s),literal:a,type:i}},{className:"type", + begin:n.either("double precision","large object","with timezone","without timezone") + },c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", + variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, + contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ + className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, + relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 + },t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ + match:[/\./,m(...xe,...Me)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), + relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ + className:"keyword", + match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Se).map(ke),...Me)}]},l={ + $pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Re),literal:Ce},c=[i,r,o],g=[{ + match:b(/\./,m(...De)),relevance:0},{className:"built_in", + match:b(/\b/,m(...De),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ + className:"operator",relevance:0,variants:[{match:Be},{match:`\\.(\\.|${Le})+`}] + }],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, + variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ + match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ + },{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ + match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] + }),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) + }),N=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ + }),w=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),N(e)] + }),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),N(e)]}),O={ + className:"string", + variants:[w(),w("#"),w("##"),w("###"),v(),v("#"),v("##"),v("###")] + },k=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, + contains:[e.BACKSLASH_ESCAPE]}],x={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, + contains:k},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, + contains:[...k,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},S={ + scope:"regexp",variants:[M("###"),M("##"),M("#"),x]},A={match:b(/`/,Fe,/`/) + },C=[A,{className:"variable",match:/\$\d+/},{className:"variable", + match:`\\$${ze}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ + contains:[{begin:/\(/,end:/\)/,keywords:Pe,contains:[...p,f,O]}]}},{ + scope:"keyword",match:b(/@/,m(...je))},{scope:"meta",match:b(/@/,Fe)}],R={ + match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", + match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,ze,"+") + },{className:"type",match:Ue,relevance:0},{match:/[?!]+/,relevance:0},{ + match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(Ue)),relevance:0}]},D={ + begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) + ;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ + match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 + },...a,S,...c,...g,...p,f,O,...C,...T,R]},L={begin://, + keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, + contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, + relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", + match:Fe}]},...a,...c,...p,f,O,...T,R,I],endsParent:!0,illegal:/["']/},$={ + match:[/(func|macro)/,/\s+/,m(A.match,Fe,Be)],className:{1:"keyword", + 3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},z={ + match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, + contains:[L,B,n],illegal:/\[|%/},F={match:[/operator/,/\s+/,Be],className:{ + 1:"keyword",3:"title"}},U={begin:[/precedencegroup/,/\s+/,Ue],className:{ + 1:"keyword",3:"title"},contains:[R],keywords:[...Te,...Ce],end:/}/} + ;for(const e of O.variants){const n=e.contains.find((e=>"interpol"===e.label)) + ;n.keywords=l;const t=[...c,...g,...p,f,O,...C];n.contains=[...t,{begin:/\(/, + end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, + contains:[...a,$,z,{beginKeywords:"struct protocol class extension enum actor", + end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ + className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] + },F,U,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 + },S,...c,...g,...p,f,O,...C,...T,R,I]}},grmr_typescript:e=>{ + const n=Oe(e),t=_e,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ + beginKeywords:"namespace",end:/\{/,excludeEnd:!0, + contains:[n.exports.CLASS_REFERENCE]},r={beginKeywords:"interface",end:/\{/, + excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a}, + contains:[n.exports.CLASS_REFERENCE]},s={$pattern:_e, + keyword:he.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), + literal:fe,built_in:ve.concat(a),"variable.language":we},o={className:"meta", + begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) + ;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} + ;return Object.assign(n.keywords,s), + n.exports.PARAMS_CONTAINS.push(o),n.contains=n.contains.concat([o,i,r]), + l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, + begin:/^\s*['"]use strict['"]/ + }),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ + name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ + const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ + className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ + begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ + begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] + },o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] + }),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) + ;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, + classNameAliases:{label:"symbol"},keywords:{ + keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", + built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", + type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", + literal:"true false nothing"}, + illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ + className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, + end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, + variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ + },{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ + begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ + className:"label",begin:/^\w+:/},o,l,{className:"meta", + begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, + end:/$/,keywords:{ + keyword:"const disable else elseif enable end externalsource if region then"}, + contains:[l]}]}},grmr_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) + ;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, + keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] + },contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], + className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ + match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ + begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", + 3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, + className:"type"},{className:"keyword", + match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ + },{className:"number",relevance:0, + match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ + }]}},grmr_xml:e=>{ + const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ + className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, + contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] + },r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ + className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ + endsWithParent:!0,illegal:/`]+/}]}]}]};return{ + name:"HTML, XML", + aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], + case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ + className:"meta",begin://,contains:[i,r,o,s]}]}] + },e.COMMENT(//,{relevance:10}),{begin://, + relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, + relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", + begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ + end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", + begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ + end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ + className:"tag",begin:/<>|<\/>/},{className:"tag", + begin:n.concat(//,/>/,/\s/)))), + end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ + className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ + className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} + },grmr_yaml:e=>{ + const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ + className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ + },{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", + variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ + variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ + end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, + end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", + contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ + begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ + begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", + relevance:10},{className:"string", + begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ + begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, + relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", + begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t + },{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", + begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", + relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ + className:"number", + begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" + },{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] + ;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, + aliases:["yml"],contains:l}}});const He=ae;for(const e of Object.keys(Ke)){ + const n=e.replace("grmr_","").replace("_","-");He.registerLanguage(n,Ke[e])} + return He}() + ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); diff --git a/src/agentscope/studio/static/js_third_party/jquery.min.js b/src/agentscope/studio/static/js_third_party/jquery.min.js new file mode 100644 index 000000000..d467083b6 --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 015?"\u2026"+e.slice(n-15,n):e.slice(0,n),a=o+15":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;const a=function(e){return"ordgroup"===e.type||"color"===e.type?1===e.body.length?a(e.body[0]):e:"font"===e.type?a(e.body):e};var l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(i,(e=>s[e]))},hyphenate:function(e){return e.replace(o,"-$1").toLowerCase()},getBaseElem:a,isCharacterBox:function(e){const t=a(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){const t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}};const h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function c(e){if(e.default)return e.default;const t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class m{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(const t in h)if(h.hasOwnProperty(t)){const r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:c(r)}}reportNonstrict(e,t,r){let o=this.strict;if("function"==typeof o&&(o=o(e,t,r)),o&&"ignore"!==o){if(!0===o||"error"===o)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===o?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+o+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){let n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))}isTrusted(e){if(e.url&&!e.protocol){const t=l.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}const t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)}}class p{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return u[d[this.id]]}sub(){return u[g[this.id]]}fracNum(){return u[f[this.id]]}fracDen(){return u[b[this.id]]}cramp(){return u[y[this.id]]}text(){return u[x[this.id]]}isTight(){return this.size>=2}}const u=[new p(0,0,!1),new p(1,0,!0),new p(2,1,!1),new p(3,1,!0),new p(4,2,!1),new p(5,2,!0),new p(6,3,!1),new p(7,3,!0)],d=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],f=[2,3,4,5,6,7,6,7],b=[3,3,5,5,7,7,7,7],y=[1,1,3,3,5,5,7,7],x=[0,1,2,3,2,3,2,3];var w={DISPLAY:u[0],TEXT:u[2],SCRIPT:u[4],SCRIPTSCRIPT:u[6]};const v=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];const k=[];function S(e){for(let t=0;t=k[t]&&e<=k[t+1])return!0;return!1}v.forEach((e=>e.blocks.forEach((e=>k.push(...e)))));const M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class A{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createDocumentFragment();for(let t=0;te.toText())).join("")}}var T={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}};const B={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},C={"\xc5":"A","\xd0":"D","\xde":"o","\xe5":"a","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function N(e,t,r){if(!T[t])throw new Error("Font metrics not found for font: "+t+".");let n=e.charCodeAt(0),o=T[t][n];if(!o&&e[0]in C&&(n=C[e[0]].charCodeAt(0),o=T[t][n]),o||"text"!==r||S(n)&&(o=T[t][77]),o)return{depth:o[0],height:o[1],italic:o[2],skew:o[3],width:o[4]}}const q={};const I=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],R=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],H=function(e,t){return t.size<2?e:I[e-1][t.size-1]};class O{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||O.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=R[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){const t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(const r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new O(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:H(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:R[e-1]})}havingBaseStyle(e){e=e||this.style.text();const t=H(O.BASESIZE,e);return this.size===t&&this.textSize===O.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){let e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==O.BASESIZE?["sizing","reset-size"+this.size,"size"+O.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){let t;if(t=e>=5?0:e>=3?1:2,!q[t]){const e=q[t]={cssEmPerMu:B.quad[t]/18};for(const r in B)B.hasOwnProperty(r)&&(e[r]=B[r][t])}return q[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}O.BASESIZE=6;var E=O;const L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},V=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},P=function(e,t){let r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{let o;if(o=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=o.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=o.fontMetrics().quad}o!==t&&(r*=o.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},F=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((e=>e)).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");const e=t.getColor();e&&(this.style.color=e)}},Y=function(e){const t=document.createElement(e);t.className=G(this.classes);for(const e in this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);for(const e in this.attributes)this.attributes.hasOwnProperty(e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e",t};class W{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return l.contains(this.classes,e)}toNode(){return Y.call(this,"span")}toMarkup(){return X.call(this,"span")}}class _{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return l.contains(this.classes,e)}toNode(){return Y.call(this,"a")}toMarkup(){return X.call(this,"a")}}class j{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(const t in this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){let e=''+l.escape(this.alt)+'=n[0]&&e<=n[1])return r.name}}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=$[this.text])}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createTextNode(this.text);let t=null;this.italic>0&&(t=document.createElement("span"),t.style.marginRight=F(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=G(this.classes));for(const e in this.style)this.style.hasOwnProperty(e)&&(t=t||document.createElement("span"),t.style[e]=this.style[e]);return t?(t.appendChild(e),t):e}toMarkup(){let e=!1,t="0&&(r+="margin-right:"+this.italic+"em;");for(const e in this.style)this.style.hasOwnProperty(e)&&(r+=l.hyphenate(e)+":"+this.style[e]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');const n=l.escape(this.text);return e?(t+=">",t+=n,t+="
    ",t):n}}class K{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(let t=0;t':''}}class Q{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){const e=document.createElementNS("http://www.w3.org/2000/svg","line");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){let e="","\\gt",!0),se(ie,le,ye,"\u2208","\\in",!0),se(ie,le,ye,"\ue020","\\@not"),se(ie,le,ye,"\u2282","\\subset",!0),se(ie,le,ye,"\u2283","\\supset",!0),se(ie,le,ye,"\u2286","\\subseteq",!0),se(ie,le,ye,"\u2287","\\supseteq",!0),se(ie,he,ye,"\u2288","\\nsubseteq",!0),se(ie,he,ye,"\u2289","\\nsupseteq",!0),se(ie,le,ye,"\u22a8","\\models"),se(ie,le,ye,"\u2190","\\leftarrow",!0),se(ie,le,ye,"\u2264","\\le"),se(ie,le,ye,"\u2264","\\leq",!0),se(ie,le,ye,"<","\\lt",!0),se(ie,le,ye,"\u2192","\\rightarrow",!0),se(ie,le,ye,"\u2192","\\to"),se(ie,he,ye,"\u2271","\\ngeq",!0),se(ie,he,ye,"\u2270","\\nleq",!0),se(ie,le,xe,"\xa0","\\ "),se(ie,le,xe,"\xa0","\\space"),se(ie,le,xe,"\xa0","\\nobreakspace"),se(ae,le,xe,"\xa0","\\ "),se(ae,le,xe,"\xa0"," "),se(ae,le,xe,"\xa0","\\space"),se(ae,le,xe,"\xa0","\\nobreakspace"),se(ie,le,xe,null,"\\nobreak"),se(ie,le,xe,null,"\\allowbreak"),se(ie,le,be,",",","),se(ie,le,be,";",";"),se(ie,he,me,"\u22bc","\\barwedge",!0),se(ie,he,me,"\u22bb","\\veebar",!0),se(ie,le,me,"\u2299","\\odot",!0),se(ie,le,me,"\u2295","\\oplus",!0),se(ie,le,me,"\u2297","\\otimes",!0),se(ie,le,we,"\u2202","\\partial",!0),se(ie,le,me,"\u2298","\\oslash",!0),se(ie,he,me,"\u229a","\\circledcirc",!0),se(ie,he,me,"\u22a1","\\boxdot",!0),se(ie,le,me,"\u25b3","\\bigtriangleup"),se(ie,le,me,"\u25bd","\\bigtriangledown"),se(ie,le,me,"\u2020","\\dagger"),se(ie,le,me,"\u22c4","\\diamond"),se(ie,le,me,"\u22c6","\\star"),se(ie,le,me,"\u25c3","\\triangleleft"),se(ie,le,me,"\u25b9","\\triangleright"),se(ie,le,fe,"{","\\{"),se(ae,le,we,"{","\\{"),se(ae,le,we,"{","\\textbraceleft"),se(ie,le,pe,"}","\\}"),se(ae,le,we,"}","\\}"),se(ae,le,we,"}","\\textbraceright"),se(ie,le,fe,"{","\\lbrace"),se(ie,le,pe,"}","\\rbrace"),se(ie,le,fe,"[","\\lbrack",!0),se(ae,le,we,"[","\\lbrack",!0),se(ie,le,pe,"]","\\rbrack",!0),se(ae,le,we,"]","\\rbrack",!0),se(ie,le,fe,"(","\\lparen",!0),se(ie,le,pe,")","\\rparen",!0),se(ae,le,we,"<","\\textless",!0),se(ae,le,we,">","\\textgreater",!0),se(ie,le,fe,"\u230a","\\lfloor",!0),se(ie,le,pe,"\u230b","\\rfloor",!0),se(ie,le,fe,"\u2308","\\lceil",!0),se(ie,le,pe,"\u2309","\\rceil",!0),se(ie,le,we,"\\","\\backslash"),se(ie,le,we,"\u2223","|"),se(ie,le,we,"\u2223","\\vert"),se(ae,le,we,"|","\\textbar",!0),se(ie,le,we,"\u2225","\\|"),se(ie,le,we,"\u2225","\\Vert"),se(ae,le,we,"\u2225","\\textbardbl"),se(ae,le,we,"~","\\textasciitilde"),se(ae,le,we,"\\","\\textbackslash"),se(ae,le,we,"^","\\textasciicircum"),se(ie,le,ye,"\u2191","\\uparrow",!0),se(ie,le,ye,"\u21d1","\\Uparrow",!0),se(ie,le,ye,"\u2193","\\downarrow",!0),se(ie,le,ye,"\u21d3","\\Downarrow",!0),se(ie,le,ye,"\u2195","\\updownarrow",!0),se(ie,le,ye,"\u21d5","\\Updownarrow",!0),se(ie,le,ge,"\u2210","\\coprod"),se(ie,le,ge,"\u22c1","\\bigvee"),se(ie,le,ge,"\u22c0","\\bigwedge"),se(ie,le,ge,"\u2a04","\\biguplus"),se(ie,le,ge,"\u22c2","\\bigcap"),se(ie,le,ge,"\u22c3","\\bigcup"),se(ie,le,ge,"\u222b","\\int"),se(ie,le,ge,"\u222b","\\intop"),se(ie,le,ge,"\u222c","\\iint"),se(ie,le,ge,"\u222d","\\iiint"),se(ie,le,ge,"\u220f","\\prod"),se(ie,le,ge,"\u2211","\\sum"),se(ie,le,ge,"\u2a02","\\bigotimes"),se(ie,le,ge,"\u2a01","\\bigoplus"),se(ie,le,ge,"\u2a00","\\bigodot"),se(ie,le,ge,"\u222e","\\oint"),se(ie,le,ge,"\u222f","\\oiint"),se(ie,le,ge,"\u2230","\\oiiint"),se(ie,le,ge,"\u2a06","\\bigsqcup"),se(ie,le,ge,"\u222b","\\smallint"),se(ae,le,ue,"\u2026","\\textellipsis"),se(ie,le,ue,"\u2026","\\mathellipsis"),se(ae,le,ue,"\u2026","\\ldots",!0),se(ie,le,ue,"\u2026","\\ldots",!0),se(ie,le,ue,"\u22ef","\\@cdots",!0),se(ie,le,ue,"\u22f1","\\ddots",!0),se(ie,le,we,"\u22ee","\\varvdots"),se(ie,le,ce,"\u02ca","\\acute"),se(ie,le,ce,"\u02cb","\\grave"),se(ie,le,ce,"\xa8","\\ddot"),se(ie,le,ce,"~","\\tilde"),se(ie,le,ce,"\u02c9","\\bar"),se(ie,le,ce,"\u02d8","\\breve"),se(ie,le,ce,"\u02c7","\\check"),se(ie,le,ce,"^","\\hat"),se(ie,le,ce,"\u20d7","\\vec"),se(ie,le,ce,"\u02d9","\\dot"),se(ie,le,ce,"\u02da","\\mathring"),se(ie,le,de,"\ue131","\\@imath"),se(ie,le,de,"\ue237","\\@jmath"),se(ie,le,we,"\u0131","\u0131"),se(ie,le,we,"\u0237","\u0237"),se(ae,le,we,"\u0131","\\i",!0),se(ae,le,we,"\u0237","\\j",!0),se(ae,le,we,"\xdf","\\ss",!0),se(ae,le,we,"\xe6","\\ae",!0),se(ae,le,we,"\u0153","\\oe",!0),se(ae,le,we,"\xf8","\\o",!0),se(ae,le,we,"\xc6","\\AE",!0),se(ae,le,we,"\u0152","\\OE",!0),se(ae,le,we,"\xd8","\\O",!0),se(ae,le,ce,"\u02ca","\\'"),se(ae,le,ce,"\u02cb","\\`"),se(ae,le,ce,"\u02c6","\\^"),se(ae,le,ce,"\u02dc","\\~"),se(ae,le,ce,"\u02c9","\\="),se(ae,le,ce,"\u02d8","\\u"),se(ae,le,ce,"\u02d9","\\."),se(ae,le,ce,"\xb8","\\c"),se(ae,le,ce,"\u02da","\\r"),se(ae,le,ce,"\u02c7","\\v"),se(ae,le,ce,"\xa8",'\\"'),se(ae,le,ce,"\u02dd","\\H"),se(ae,le,ce,"\u25ef","\\textcircled");const ve={"--":!0,"---":!0,"``":!0,"''":!0};se(ae,le,we,"\u2013","--",!0),se(ae,le,we,"\u2013","\\textendash"),se(ae,le,we,"\u2014","---",!0),se(ae,le,we,"\u2014","\\textemdash"),se(ae,le,we,"\u2018","`",!0),se(ae,le,we,"\u2018","\\textquoteleft"),se(ae,le,we,"\u2019","'",!0),se(ae,le,we,"\u2019","\\textquoteright"),se(ae,le,we,"\u201c","``",!0),se(ae,le,we,"\u201c","\\textquotedblleft"),se(ae,le,we,"\u201d","''",!0),se(ae,le,we,"\u201d","\\textquotedblright"),se(ie,le,we,"\xb0","\\degree",!0),se(ae,le,we,"\xb0","\\degree"),se(ae,le,we,"\xb0","\\textdegree",!0),se(ie,le,we,"\xa3","\\pounds"),se(ie,le,we,"\xa3","\\mathsterling",!0),se(ae,le,we,"\xa3","\\pounds"),se(ae,le,we,"\xa3","\\textsterling",!0),se(ie,he,we,"\u2720","\\maltese"),se(ae,he,we,"\u2720","\\maltese");const ke='0123456789/@."';for(let e=0;e{if(G(e.classes)!==G(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){const t=e.classes[0];if("mbin"===t||"mord"===t)return!1}for(const r in e.style)if(e.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;for(const r in t.style)if(t.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;return!0},Ie=function(e){let t=0,r=0,n=0;for(let o=0;ot&&(t=s.height),s.depth>r&&(r=s.depth),s.maxFontSize>n&&(n=s.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Re=function(e,t,r,n){const o=new W(e,t,r,n);return Ie(o),o},He=(e,t,r,n)=>new W(e,t,r,n),Oe=function(e){const t=new A(e);return Ie(t),t},Ee=function(e,t,r){let n,o="";switch(e){case"amsrm":o="AMS";break;case"textrm":o="Main";break;case"textsf":o="SansSerif";break;case"texttt":o="Typewriter";break;default:o=e}return n="textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular",o+"-"+n},Le={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},De={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]};var Ve={fontMap:Le,makeSymbol:Ne,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ce(e,"Main-Bold",t).metrics?Ne(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===oe[t][e].font?Ne(e,"Main-Regular",t,r,n):Ne(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Re,makeSvgSpan:He,makeLineSpan:function(e,t,r){const n=Re([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=F(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){const o=new _(e,t,r,n);return Ie(o),o},makeFragment:Oe,wrapFragment:function(e,t){return e instanceof A?Re([],[e],t):e},makeVList:function(e,t){const{children:r,depth:n}=function(e){if("individualShift"===e.positionType){const t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth;let o=n;for(let e=1;e0)return Ne(s,h,o,t,i.concat(c));if(l){let e,n;if("boldsymbol"===l){const t=function(e,t,r,n,o){return"textord"!==o&&Ce(e,"Math-BoldItalic",t).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(s,o,0,0,r);e=t.fontName,n=[t.fontClass]}else a?(e=Le[l].fontName,n=[l]):(e=Ee(l,t.fontWeight,t.fontShape),n=[l,t.fontWeight,t.fontShape]);if(Ce(s,e,o).metrics)return Ne(s,e,o,t,i.concat(n));if(ve.hasOwnProperty(s)&&"Typewriter"===e.slice(0,10)){const r=[];for(let a=0;a{const r=Re(["mspace"],[],t),n=P(e,t);return r.style.marginRight=F(n),r},staticSvg:function(e,t){const[r,n,o]=De[e],s=new J(r),i=new K([s],{width:F(n),height:F(o),style:"width:"+F(n),viewBox:"0 0 "+1e3*n+" "+1e3*o,preserveAspectRatio:"xMinYMin"}),a=He(["overlay"],[i],t);return a.height=o,a.style.height=F(o),a.style.width=F(n),a},svgData:De,tryCombineChars:e=>{for(let t=0;t{const r=t.classes[0],n=e.classes[0];"mbin"===r&&l.contains(et,n)?t.classes[0]="mord":"mbin"===n&&l.contains(Qe,r)&&(e.classes[0]="mord")}),{node:i},a,h),ot(o,((e,t)=>{const r=at(t),n=at(e),o=r&&n?e.hasClass("mtight")?Ye[r][n]:Ue[r][n]:null;if(o)return Ve.makeGlue(o,s)}),{node:i},a,h),o},ot=function(e,t,r,n,o){n&&e.push(n);let s=0;for(;sr=>{e.splice(t+1,0,r),s++})(s)}n&&e.pop()},st=function(e){return e instanceof A||e instanceof _||e instanceof W&&e.hasClass("enclosing")?e:null},it=function(e,t){const r=st(e);if(r){const e=r.children;if(e.length){if("right"===t)return it(e[e.length-1],"right");if("left"===t)return it(e[0],"left")}}return e},at=function(e,t){return e?(t&&(e=it(e,t)),rt[e.classes[0]]||null):null},lt=function(e,t){const r=["nulldelimiter"].concat(e.baseSizingClasses());return Je(t.concat(r))},ht=function(e,t,r){if(!e)return Je();if(We[e.type]){let n=We[e.type](e,t);if(r&&t.size!==r.size){n=Je(t.sizingClasses(r),[n],t);const e=t.sizeMultiplier/r.sizeMultiplier;n.height*=e,n.depth*=e}return n}throw new n("Got group of unknown type: '"+e.type+"'")};function ct(e,t){const r=Je(["base"],e,t),n=Je(["strut"]);return n.style.height=F(r.height+r.depth),r.depth&&(n.style.verticalAlign=F(-r.depth)),r.children.unshift(n),r}function mt(e,t){let r=null;1===e.length&&"tag"===e[0].type&&(r=e[0].tag,e=e[0].body);const n=nt(e,t,"root");let o;2===n.length&&n[1].hasClass("tag")&&(o=n.pop());const s=[];let i,a=[];for(let e=0;e0&&(s.push(ct(a,t)),a=[]),s.push(n[e]));a.length>0&&s.push(ct(a,t)),r?(i=ct(nt(r,t,!0)),i.classes=["tag"],s.push(i)):o&&s.push(o);const l=Je(["katex-html"],s);if(l.setAttribute("aria-hidden","true"),i){const e=i.children[0];e.style.height=F(l.height+l.depth),l.depth&&(e.style.verticalAlign=F(-l.depth))}return l}function pt(e){return new A(e)}class ut{constructor(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){const e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(let t=0;t0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(let t=0;t",e}toText(){return this.children.map((e=>e.toText())).join("")}}class dt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return l.escape(this.toText())}toText(){return this.text}}var gt={MathNode:ut,TextNode:dt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}toNode(){if(this.character)return document.createTextNode(this.character);{const e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",F(this.width)),e}}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},newDocumentFragment:pt};const ft=function(e,t,r){return!oe[t][e]||!oe[t][e].replace||55349===e.charCodeAt(0)||ve.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=oe[t][e].replace),new gt.TextNode(e)},bt=function(e){return 1===e.length?e[0]:new gt.MathNode("mrow",e)},yt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";const r=t.font;if(!r||"mathnormal"===r)return null;const n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";let o=e.text;if(l.contains(["\\imath","\\jmath"],o))return null;oe[n][o]&&oe[n][o].replace&&(o=oe[n][o].replace);return N(o,Ve.fontMap[r].fontName,n)?Ve.fontMap[r].variant:null},xt=function(e,t,r){if(1===e.length){const n=vt(e[0],t);return r&&n instanceof ut&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}const n=[];let o;for(let r=0;r0&&(e.text=e.text.slice(0,1)+"\u0338"+e.text.slice(1),n.pop())}}}n.push(s),o=s}return n},wt=function(e,t,r){return bt(xt(e,t,r))},vt=function(e,t){if(!e)return new gt.MathNode("mrow");if(_e[e.type]){return _e[e.type](e,t)}throw new n("Got group of unknown type: '"+e.type+"'")};function kt(e,t,r,n,o){const s=xt(e,r);let i;i=1===s.length&&s[0]instanceof ut&&l.contains(["mrow","mtable"],s[0].type)?s[0]:new gt.MathNode("mrow",s);const a=new gt.MathNode("annotation",[new gt.TextNode(t)]);a.setAttribute("encoding","application/x-tex");const h=new gt.MathNode("semantics",[i,a]),c=new gt.MathNode("math",[h]);c.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&c.setAttribute("display","block");const m=o?"katex":"katex-mathml";return Ve.makeSpan([m],[c])}const St=function(e){return new E({style:e.displayMode?w.DISPLAY:w.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Mt=function(e,t){if(t.displayMode){const r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Ve.makeSpan(r,[e])}return e},zt=function(e,t,r){const n=St(r);let o;if("mathml"===r.output)return kt(e,t,n,r.displayMode,!0);if("html"===r.output){const t=mt(e,n);o=Ve.makeSpan(["katex"],[t])}else{const s=kt(e,t,n,r.displayMode,!1),i=mt(e,n);o=Ve.makeSpan(["katex"],[s,i])}return Mt(o,r)};const At={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Tt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]};var Bt=function(e,t,r,n,o){let s;const i=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(s=Ve.makeSpan(["stretchy",t],[],o),"fbox"===t){const e=o.color&&o.getColor();e&&(s.style.borderColor=e)}}else{const e=[];/^[bx]cancel$/.test(t)&&e.push(new Q({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&e.push(new Q({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));const r=new K(e,{width:"100%",height:F(i)});s=Ve.makeSvgSpan([],[r],o)}return s.height=i,s.style.height=F(i),s},Ct=function(e){const t=new gt.MathNode("mo",[new gt.TextNode(At[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Nt=function(e,t){const{span:r,minWidth:n,height:o}=function(){let r=4e5;const n=e.label.slice(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){const s="ordgroup"===(o=e.base).type?o.body.length:1;let i,a,l;if(s>5)"widehat"===n||"widecheck"===n?(i=420,r=2364,l=.42,a=n+"4"):(i=312,r=2340,l=.34,a="tilde4");else{const e=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][e],i=[0,239,300,360,420][e],l=[0,.24,.3,.3,.36,.42][e],a=n+e):(r=[0,600,1033,2339,2340][e],i=[0,260,286,306,312][e],l=[0,.26,.286,.3,.306,.34][e],a="tilde"+e)}const h=new J(a),c=new K([h],{width:"100%",height:F(l),viewBox:"0 0 "+r+" "+i,preserveAspectRatio:"none"});return{span:Ve.makeSvgSpan([],[c],t),minWidth:0,height:l}}{const e=[],o=Tt[n],[s,i,a]=o,l=a/1e3,h=s.length;let c,m;if(1===h){c=["hide-tail"],m=[o[3]]}else if(2===h)c=["halfarrow-left","halfarrow-right"],m=["xMinYMin","xMaxYMin"];else{if(3!==h)throw new Error("Correct katexImagesData or update code here to support\n "+h+" children.");c=["brace-left","brace-center","brace-right"],m=["xMinYMin","xMidYMin","xMaxYMin"]}for(let n=0;n0&&(r.style.minWidth=F(n)),r};function qt(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function It(e){const t=Rt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Rt(e){return e&&("atom"===e.type||re.hasOwnProperty(e.type))?e:null}const Ht=(e,t)=>{let r,n,o;e&&"supsub"===e.type?(n=qt(e.base,"accent"),r=n.base,e.base=r,o=function(e){if(e instanceof W)return e;throw new Error("Expected span but got "+String(e)+".")}(ht(e,t)),e.base=n):(n=qt(e,"accent"),r=n.base);const s=ht(r,t.havingCrampedStyle());let i=0;if(n.isShifty&&l.isCharacterBox(r)){const e=l.getBaseElem(r);i=ee(ht(e,t.havingCrampedStyle())).skew}const a="\\c"===n.label;let h,c=a?s.height+s.depth:Math.min(s.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Nt(n,t),h=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:i>0?{width:"calc(100% - "+F(2*i)+")",marginLeft:F(2*i)}:void 0}]},t);else{let e,r;"\\vec"===n.label?(e=Ve.staticSvg("vec",t),r=Ve.svgData.vec[1]):(e=Ve.makeOrd({mode:n.mode,text:n.label},t,"textord"),e=ee(e),e.italic=0,r=e.width,a&&(c+=e.depth)),h=Ve.makeSpan(["accent-body"],[e]);const o="\\textcircled"===n.label;o&&(h.classes.push("accent-full"),c=s.height);let l=i;o||(l-=r/2),h.style.left=F(l),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}const m=Ve.makeSpan(["mord","accent"],[h],t);return o?(o.children[0]=m,o.height=Math.max(m.height,o.height),o.classes[0]="mord",o):m},Ot=(e,t)=>{const r=e.isStretchy?Ct(e.label):new gt.MathNode("mo",[ft(e.label,e.mode)]),n=new gt.MathNode("mover",[vt(e.base,t),r]);return n.setAttribute("accent","true"),n},Et=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((e=>"\\"+e)).join("|"));je({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{const r=Ze(t[0]),n=!Et.test(e.funcName),o=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:o,base:r}},htmlBuilder:Ht,mathmlBuilder:Ot}),je({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{const r=t[0];let n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ht,mathmlBuilder:Ot}),je({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:o}},htmlBuilder:(e,t)=>{const r=ht(e.base,t),n=Nt(e,t),o="\\utilde"===e.label?.12:0,s=Ve.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:o},{type:"elem",elem:r}]},t);return Ve.makeSpan(["mord","accentunder"],[s],t)},mathmlBuilder:(e,t)=>{const r=Ct(e.label),n=new gt.MathNode("munder",[vt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});const Lt=e=>{const t=new gt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};je({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){let{parser:n,funcName:o}=e;return{type:"xArrow",mode:n.mode,label:o,body:t[0],below:r[0]}},htmlBuilder(e,t){const r=t.style;let n=t.havingStyle(r.sup());const o=Ve.wrapFragment(ht(e.body,n,t),t),s="\\x"===e.label.slice(0,2)?"x":"cd";let i;o.classes.push(s+"-arrow-pad"),e.below&&(n=t.havingStyle(r.sub()),i=Ve.wrapFragment(ht(e.below,n,t),t),i.classes.push(s+"-arrow-pad"));const a=Nt(e,t),l=-t.fontMetrics().axisHeight+.5*a.height;let h,c=-t.fontMetrics().axisHeight-.5*a.height-.111;if((o.depth>.25||"\\xleftequilibrium"===e.label)&&(c-=o.depth),i){const e=-t.fontMetrics().axisHeight+i.height+.5*a.height+.111;h=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:c},{type:"elem",elem:a,shift:l},{type:"elem",elem:i,shift:e}]},t)}else h=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:c},{type:"elem",elem:a,shift:l}]},t);return h.children[0].children[0].children[1].classes.push("svg-align"),Ve.makeSpan(["mrel","x-arrow"],[h],t)},mathmlBuilder(e,t){const r=Ct(e.label);let n;if(r.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){const o=Lt(vt(e.body,t));if(e.below){const s=Lt(vt(e.below,t));n=new gt.MathNode("munderover",[r,s,o])}else n=new gt.MathNode("mover",[r,o])}else if(e.below){const o=Lt(vt(e.below,t));n=new gt.MathNode("munder",[r,o])}else n=Lt(),n=new gt.MathNode("mover",[r,n]);return n}});const Dt=Ve.makeSpan;function Vt(e,t){const r=nt(e.body,t,!0);return Dt([e.mclass],r,t)}function Pt(e,t){let r;const n=xt(e.body,t);return"minner"===e.mclass?r=new gt.MathNode("mpadded",n):"mord"===e.mclass?e.isCharacterBox?(r=n[0],r.type="mi"):r=new gt.MathNode("mi",n):(e.isCharacterBox?(r=n[0],r.type="mo"):r=new gt.MathNode("mo",n),"mbin"===e.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"===e.mclass||"mclose"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0em"):"minner"===e.mclass&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}je({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:Ke(o),isCharacterBox:l.isCharacterBox(o)}},htmlBuilder:Vt,mathmlBuilder:Pt});const Ft=e=>{const t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};je({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){let{parser:r}=e;return{type:"mclass",mode:r.mode,mclass:Ft(t[0]),body:Ke(t[1]),isCharacterBox:l.isCharacterBox(t[1])}}}),je({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){let{parser:r,funcName:n}=e;const o=t[1],s=t[0];let i;i="\\stackrel"!==n?Ft(o):"mrel";const a={type:"op",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:Ke(o)},h={type:"supsub",mode:s.mode,base:a,sup:"\\underset"===n?null:s,sub:"\\underset"===n?s:null};return{type:"mclass",mode:r.mode,mclass:i,body:[h],isCharacterBox:l.isCharacterBox(h)}},htmlBuilder:Vt,mathmlBuilder:Pt}),je({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"pmb",mode:r.mode,mclass:Ft(t[0]),body:Ke(t[0])}},htmlBuilder(e,t){const r=nt(e.body,t,!0),n=Ve.makeSpan([e.mclass],r,t);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(e,t){const r=xt(e.body,t),n=new gt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});const Gt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Ut=e=>"textord"===e.type&&"@"===e.text;function Yt(e,t,r){const n=Gt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":{const e={type:"atom",text:n,mode:"math",family:"rel"},o={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[e],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[o],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{const e={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[e],[])}default:return{type:"textord",text:" ",mode:"math"}}}je({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder(e,t){const r=t.havingStyle(t.style.sup()),n=Ve.wrapFragment(ht(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=F(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(e,t){let r=new gt.MathNode("mrow",[vt(e.label,t)]);return r=new gt.MathNode("mpadded",[r]),r.setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new gt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),je({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){let{parser:r}=e;return{type:"cdlabelparent",mode:r.mode,fragment:t[0]}},htmlBuilder(e,t){const r=Ve.wrapFragment(ht(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(e,t){return new gt.MathNode("mrow",[vt(e.fragment,t)])}}),je({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;const o=qt(t[0],"ordgroup").body;let s="";for(let e=0;e=1114111)throw new n("\\@char with invalid code point "+s);return a<=65535?i=String.fromCharCode(a):(a-=65536,i=String.fromCharCode(55296+(a>>10),56320+(1023&a))),{type:"textord",mode:r.mode,text:i}}});const Xt=(e,t)=>{const r=nt(e.body,t.withColor(e.color),!1);return Ve.makeFragment(r)},Wt=(e,t)=>{const r=xt(e.body,t.withColor(e.color)),n=new gt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};je({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){let{parser:r}=e;const n=qt(t[0],"color-token").color,o=t[1];return{type:"color",mode:r.mode,color:n,body:Ke(o)}},htmlBuilder:Xt,mathmlBuilder:Wt}),je({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){let{parser:r,breakOnTokenText:n}=e;const o=qt(t[0],"color-token").color;r.gullet.macros.set("\\current@color",o);const s=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:o,body:s}},htmlBuilder:Xt,mathmlBuilder:Wt}),je({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){let{parser:n}=e;const o="["===n.gullet.future().text?n.parseSizeGroup(!0):null,s=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:s,size:o&&qt(o,"size").value}},htmlBuilder(e,t){const r=Ve.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=F(P(e.size,t)))),r},mathmlBuilder(e,t){const r=new gt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",F(P(e.size,t)))),r}});const _t={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},jt=e=>{const t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},$t=(e,t,r,n)=>{let o=e.gullet.macros.get(r.text);null==o&&(r.noexpand=!0,o={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,o,n)};je({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){let{parser:t,funcName:r}=e;t.consumeSpaces();const o=t.fetch();if(_t[o.text])return"\\global"!==r&&"\\\\globallong"!==r||(o.text=_t[o.text]),qt(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",o)}}),je({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e,o=t.gullet.popToken();const s=o.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(s))throw new n("Expected a control sequence",o);let i,a=0;const l=[[]];for(;"{"!==t.gullet.future().text;)if(o=t.gullet.popToken(),"#"===o.text){if("{"===t.gullet.future().text){i=t.gullet.future(),l[a].push("{");break}if(o=t.gullet.popToken(),!/^[1-9]$/.test(o.text))throw new n('Invalid argument number "'+o.text+'"');if(parseInt(o.text)!==a+1)throw new n('Argument number "'+o.text+'" out of order');a++,l.push([])}else{if("EOF"===o.text)throw new n("Expected a macro definition");l[a].push(o.text)}let{tokens:h}=t.gullet.consumeArg();return i&&h.unshift(i),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h),h.reverse()),t.gullet.macros.set(s,{tokens:h,numArgs:a,delimiters:l},r===_t[r]),{type:"internal",mode:t.mode}}}),je({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e;const n=jt(t.gullet.popToken());t.gullet.consumeSpaces();const o=(e=>{let t=e.gullet.popToken();return"="===t.text&&(t=e.gullet.popToken()," "===t.text&&(t=e.gullet.popToken())),t})(t);return $t(t,n,o,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),je({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e;const n=jt(t.gullet.popToken()),o=t.gullet.popToken(),s=t.gullet.popToken();return $t(t,n,s,"\\\\globalfuture"===r),t.gullet.pushToken(s),t.gullet.pushToken(o),{type:"internal",mode:t.mode}}});const Zt=function(e,t,r){const n=N(oe.math[e]&&oe.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},Kt=function(e,t,r,n){const o=r.havingBaseStyle(t),s=Ve.makeSpan(n.concat(o.sizingClasses(r)),[e],r),i=o.sizeMultiplier/r.sizeMultiplier;return s.height*=i,s.depth*=i,s.maxFontSize=o.sizeMultiplier,s},Jt=function(e,t,r){const n=t.havingBaseStyle(r),o=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=F(o),e.height-=o,e.depth+=o},Qt=function(e,t,r,n,o,s){const i=function(e,t,r,n){return Ve.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,o,n),a=Kt(Ve.makeSpan(["delimsizing","size"+t],[i],n),w.TEXT,n,s);return r&&Jt(a,n,w.TEXT),a},er=function(e,t,r){let n;n="Size1-Regular"===t?"delim-size1":"delim-size4";return{type:"elem",elem:Ve.makeSpan(["delimsizinginner",n],[Ve.makeSpan([],[Ve.makeSymbol(e,t,r)])])}},tr=function(e,t,r){const n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],o=new J("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),s=new K([o],{width:F(n),height:F(t),style:"width:"+F(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),i=Ve.makeSvgSpan([],[s],r);return i.height=t,i.style.height=F(t),i.style.width=F(n),{type:"elem",elem:i}},rr={type:"kern",size:-.008},nr=["|","\\lvert","\\rvert","\\vert"],or=["\\|","\\lVert","\\rVert","\\Vert"],sr=function(e,t,r,n,o,s){let i,a,h,c,m="",p=0;i=h=c=e,a=null;let u="Size1-Regular";"\\uparrow"===e?h=c="\u23d0":"\\Uparrow"===e?h=c="\u2016":"\\downarrow"===e?i=h="\u23d0":"\\Downarrow"===e?i=h="\u2016":"\\updownarrow"===e?(i="\\uparrow",h="\u23d0",c="\\downarrow"):"\\Updownarrow"===e?(i="\\Uparrow",h="\u2016",c="\\Downarrow"):l.contains(nr,e)?(h="\u2223",m="vert",p=333):l.contains(or,e)?(h="\u2225",m="doublevert",p=556):"["===e||"\\lbrack"===e?(i="\u23a1",h="\u23a2",c="\u23a3",u="Size4-Regular",m="lbrack",p=667):"]"===e||"\\rbrack"===e?(i="\u23a4",h="\u23a5",c="\u23a6",u="Size4-Regular",m="rbrack",p=667):"\\lfloor"===e||"\u230a"===e?(h=i="\u23a2",c="\u23a3",u="Size4-Regular",m="lfloor",p=667):"\\lceil"===e||"\u2308"===e?(i="\u23a1",h=c="\u23a2",u="Size4-Regular",m="lceil",p=667):"\\rfloor"===e||"\u230b"===e?(h=i="\u23a5",c="\u23a6",u="Size4-Regular",m="rfloor",p=667):"\\rceil"===e||"\u2309"===e?(i="\u23a4",h=c="\u23a5",u="Size4-Regular",m="rceil",p=667):"("===e||"\\lparen"===e?(i="\u239b",h="\u239c",c="\u239d",u="Size4-Regular",m="lparen",p=875):")"===e||"\\rparen"===e?(i="\u239e",h="\u239f",c="\u23a0",u="Size4-Regular",m="rparen",p=875):"\\{"===e||"\\lbrace"===e?(i="\u23a7",a="\u23a8",c="\u23a9",h="\u23aa",u="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(i="\u23ab",a="\u23ac",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(i="\u23a7",c="\u23a9",h="\u23aa",u="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(i="\u23ab",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(i="\u23a7",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(i="\u23ab",c="\u23a9",h="\u23aa",u="Size4-Regular");const d=Zt(i,u,o),g=d.height+d.depth,f=Zt(h,u,o),b=f.height+f.depth,y=Zt(c,u,o),x=y.height+y.depth;let v=0,k=1;if(null!==a){const e=Zt(a,u,o);v=e.height+e.depth,k=2}const S=g+x+v,M=S+Math.max(0,Math.ceil((t-S)/(k*b)))*k*b;let z=n.fontMetrics().axisHeight;r&&(z*=n.sizeMultiplier);const A=M/2-z,T=[];if(m.length>0){const e=M-g-x,t=Math.round(1e3*M),r=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw new Error("Unknown stretchy delimiter.")}}(m,Math.round(1e3*e)),o=new J(m,r),s=(p/1e3).toFixed(3)+"em",i=(t/1e3).toFixed(3)+"em",a=new K([o],{width:s,height:i,viewBox:"0 0 "+p+" "+t}),l=Ve.makeSvgSpan([],[a],n);l.height=t/1e3,l.style.width=s,l.style.height=i,T.push({type:"elem",elem:l})}else{if(T.push(er(c,u,o)),T.push(rr),null===a){const e=M-g-x+.016;T.push(tr(h,e,n))}else{const e=(M-g-x-v)/2+.016;T.push(tr(h,e,n)),T.push(rr),T.push(er(a,u,o)),T.push(rr),T.push(tr(h,e,n))}T.push(rr),T.push(er(i,u,o))}const B=n.havingBaseStyle(w.TEXT),C=Ve.makeVList({positionType:"bottom",positionData:A,children:T},B);return Kt(Ve.makeSpan(["delimsizing","mult"],[C],B),w.TEXT,n,s)},ir=.08,ar=function(e,t,r,n,o){const s=function(e,t,r){t*=1e3;let n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),i=new J(e,s),a=new K([i],{width:"400em",height:F(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Ve.makeSvgSpan(["hide-tail"],[a],o)},lr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],hr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],cr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],mr=[0,1.2,1.8,2.4,3],pr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],ur=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],dr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],gr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},fr=function(e,t,r,n){for(let o=Math.min(2,3-n.style.size);ot)return r[o]}return r[r.length-1]},br=function(e,t,r,n,o,s){let i;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),i=l.contains(cr,e)?pr:l.contains(lr,e)?dr:ur;const a=fr(e,t,i,n);return"small"===a.type?function(e,t,r,n,o,s){const i=Ve.makeSymbol(e,"Main-Regular",o,n),a=Kt(i,t,n,s);return r&&Jt(a,n,t),a}(e,a.style,r,n,o,s):"large"===a.type?Qt(e,a.size,r,n,o,s):sr(e,t,r,n,o,s)};var yr={sqrtImage:function(e,t){const r=t.havingBaseSizing(),n=fr("\\surd",e*r.sizeMultiplier,dr,r);let o=r.sizeMultiplier;const s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness);let i,a,l=0,h=0,c=0;return"small"===n.type?(c=1e3+1e3*s+80,e<1?o=1:e<1.4&&(o=.7),l=(1+s+ir)/o,h=(1+s)/o,i=ar("sqrtMain",l,c,s,t),i.style.minWidth="0.853em",a=.833/o):"large"===n.type?(c=1080*mr[n.size],h=(mr[n.size]+s)/o,l=(mr[n.size]+s+ir)/o,i=ar("sqrtSize"+n.size,l,c,s,t),i.style.minWidth="1.02em",a=1/o):(l=e+s+ir,h=e+s,c=Math.floor(1e3*e+s)+80,i=ar("sqrtTall",l,c,s,t),i.style.minWidth="0.742em",a=1.056),i.height=h,i.style.height=F(l),{span:i,advanceWidth:a,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,o,s){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(lr,e)||l.contains(cr,e))return Qt(e,t,!1,r,o,s);if(l.contains(hr,e))return sr(e,mr[t],!1,r,o,s);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:mr,customSizedDelim:br,leftRightDelim:function(e,t,r,n,o,s){const i=n.fontMetrics().axisHeight*n.sizeMultiplier,a=5/n.fontMetrics().ptPerEm,l=Math.max(t-i,r+i),h=Math.max(l/500*901,2*l-a);return br(e,h,!0,n,o,s)}};const xr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},wr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function vr(e,t){const r=Rt(e);if(r&&l.contains(wr,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function kr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}je({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{const r=vr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:xr[e.funcName].size,mclass:xr[e.funcName].mclass,delim:r.text}},htmlBuilder:(e,t)=>"."===e.delim?Ve.makeSpan([e.mclass]):yr.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{const t=[];"."!==e.delim&&t.push(ft(e.delim,e.mode));const r=new gt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");const n=F(yr.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),je({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:vr(t[0],e).text,color:r}}}),je({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=vr(t[0],e),n=e.parser;++n.leftrightDepth;const o=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);const s=qt(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:o,left:r.text,right:s.delim,rightColor:s.color}},htmlBuilder:(e,t)=>{kr(e);const r=nt(e.body,t,!0,["mopen","mclose"]);let n,o,s=0,i=0,a=!1;for(let e=0;e{kr(e);const r=xt(e.body,t);if("."!==e.left){const t=new gt.MathNode("mo",[ft(e.left,e.mode)]);t.setAttribute("fence","true"),r.unshift(t)}if("."!==e.right){const t=new gt.MathNode("mo",[ft(e.right,e.mode)]);t.setAttribute("fence","true"),e.rightColor&&t.setAttribute("mathcolor",e.rightColor),r.push(t)}return bt(r)}}),je({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=vr(t[0],e);if(!e.parser.leftrightDepth)throw new n("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:(e,t)=>{let r;if("."===e.delim)r=lt(t,[]);else{r=yr.sizedDelim(e.delim,1,t,e.mode,[]);const n={delim:e.delim,options:t};r.isMiddle=n}return r},mathmlBuilder:(e,t)=>{const r="\\vert"===e.delim||"|"===e.delim?ft("|","text"):ft(e.delim,e.mode),n=new gt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n}});const Sr=(e,t)=>{const r=Ve.wrapFragment(ht(e.body,t),t),n=e.label.slice(1);let o,s=t.sizeMultiplier,i=0;const a=l.isCharacterBox(e.body);if("sout"===n)o=Ve.makeSpan(["stretchy","sout"]),o.height=t.fontMetrics().defaultRuleThickness/s,i=-.5*t.fontMetrics().xHeight;else if("phase"===n){const e=P({number:.6,unit:"pt"},t),n=P({number:.35,unit:"ex"},t);s/=t.havingBaseSizing().sizeMultiplier;const a=r.height+r.depth+e+n;r.style.paddingLeft=F(a/2+e);const l=Math.floor(1e3*a*s),c="M400000 "+(h=l)+" H0 L"+h/2+" 0 l65 45 L145 "+(h-80)+" H400000z",m=new K([new J("phase",c)],{width:"400em",height:F(l/1e3),viewBox:"0 0 400000 "+l,preserveAspectRatio:"xMinYMin slice"});o=Ve.makeSvgSpan(["hide-tail"],[m],t),o.style.height=F(a),i=r.depth+e+n}else{/cancel/.test(n)?a||r.classes.push("cancel-pad"):"angl"===n?r.classes.push("anglpad"):r.classes.push("boxpad");let s=0,l=0,h=0;/box/.test(n)?(h=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),s=t.fontMetrics().fboxsep+("colorbox"===n?0:h),l=s):"angl"===n?(h=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness),s=4*h,l=Math.max(0,.25-r.depth)):(s=a?.2:0,l=s),o=Bt(r,n,s,l,t),/fbox|boxed|fcolorbox/.test(n)?(o.style.borderStyle="solid",o.style.borderWidth=F(h)):"angl"===n&&.049!==h&&(o.style.borderTopWidth=F(h),o.style.borderRightWidth=F(h)),i=r.depth+l,e.backgroundColor&&(o.style.backgroundColor=e.backgroundColor,e.borderColor&&(o.style.borderColor=e.borderColor))}var h;let c;if(e.backgroundColor)c=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:i},{type:"elem",elem:r,shift:0}]},t);else{const e=/cancel|phase/.test(n)?["svg-align"]:[];c=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:o,shift:i,wrapperClasses:e}]},t)}return/cancel/.test(n)&&(c.height=r.height,c.depth=r.depth),/cancel/.test(n)&&!a?Ve.makeSpan(["mord","cancel-lap"],[c],t):Ve.makeSpan(["mord"],[c],t)},Mr=(e,t)=>{let r=0;const n=new gt.MathNode(e.label.indexOf("colorbox")>-1?"mpadded":"menclose",[vt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){const r=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+r+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};je({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){let{parser:n,funcName:o}=e;const s=qt(t[0],"color-token").color,i=t[1];return{type:"enclose",mode:n.mode,label:o,backgroundColor:s,body:i}},htmlBuilder:Sr,mathmlBuilder:Mr}),je({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(e,t,r){let{parser:n,funcName:o}=e;const s=qt(t[0],"color-token").color,i=qt(t[1],"color-token").color,a=t[2];return{type:"enclose",mode:n.mode,label:o,backgroundColor:i,borderColor:s,body:a}},htmlBuilder:Sr,mathmlBuilder:Mr}),je({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\fbox",body:t[0]}}}),je({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"enclose",mode:r.mode,label:n,body:o}},htmlBuilder:Sr,mathmlBuilder:Mr}),je({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(e,t){let{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\angl",body:t[0]}}});const zr={};function Ar(e){let{type:t,names:r,props:n,handler:o,htmlBuilder:s,mathmlBuilder:i}=e;const a={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:o};for(let e=0;e{if(!e.parser.settings.displayMode)throw new n("{"+e.envName+"} can be used only in display mode.")};function Rr(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function Hr(e,t,r){let{hskipBeforeAndAfter:o,addJot:s,cols:i,arraystretch:a,colSeparationType:l,autoTag:h,singleRow:c,emptySingleRow:m,maxNumCols:p,leqno:u}=t;if(e.gullet.beginGroup(),c||e.gullet.macros.set("\\cr","\\\\\\relax"),!a){const t=e.gullet.expandMacroAsText("\\arraystretch");if(null==t)a=1;else if(a=parseFloat(t),!a||a<0)throw new n("Invalid \\arraystretch: "+t)}e.gullet.beginGroup();let d=[];const g=[d],f=[],b=[],y=null!=h?[]:void 0;function x(){h&&e.gullet.macros.set("\\@eqnsw","1",!0)}function w(){y&&(e.gullet.macros.get("\\df@tag")?(y.push(e.subparse([new Nr("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):y.push(Boolean(h)&&"1"===e.gullet.macros.get("\\@eqnsw")))}for(x(),b.push(qr(e));;){let t=e.parseExpression(!1,c?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup(),t={type:"ordgroup",mode:e.mode,body:t},r&&(t={type:"styling",mode:e.mode,style:r,body:[t]}),d.push(t);const o=e.fetch().text;if("&"===o){if(p&&d.length===p){if(c||l)throw new n("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else{if("\\end"===o){w(),1===d.length&&"styling"===t.type&&0===t.body[0].body.length&&(g.length>1||!m)&&g.pop(),b.length0&&(x+=.25),c.push({pos:x,isDashed:e[t]})}for(v(i[0]),r=0;r0&&(p+=y,le)))for(r=0;r=a)continue;(o>0||e.hskipBeforeAndAfter)&&(i=l.deflt(c.pregap,u),0!==i&&(z=Ve.makeSpan(["arraycolsep"],[]),z.style.width=F(i),M.push(z)));let d=[];for(r=0;r0){const e=Ve.makeLineSpan("hline",t,m),r=Ve.makeLineSpan("hdashline",t,m),n=[{type:"elem",elem:h,shift:0}];for(;c.length>0;){const t=c.pop(),o=t.pos-k;t.isDashed?n.push({type:"elem",elem:r,shift:o}):n.push({type:"elem",elem:e,shift:o})}h=Ve.makeVList({positionType:"individualShift",children:n},t)}if(0===T.length)return Ve.makeSpan(["mord"],[h],t);{let e=Ve.makeVList({positionType:"individualShift",children:T},t);return e=Ve.makeSpan(["tag"],[e],t),Ve.makeFragment([h,e])}},Lr={c:"center ",l:"left ",r:"right "},Dr=function(e,t){const r=[],n=new gt.MathNode("mtd",[],["mtr-glue"]),o=new gt.MathNode("mtd",[],["mml-eqn-num"]);for(let s=0;s0){const t=e.cols;let r="",n=!1,o=0,i=t.length;"separator"===t[0].type&&(a+="top ",o=1),"separator"===t[t.length-1].type&&(a+="bottom ",i-=1);for(let e=o;e0?"left ":"",a+=c[c.length-1].length>0?"right ":"";for(let e=1;e-1?"alignat":"align",s="split"===e.envName,i=Hr(e.parser,{cols:r,addJot:!0,autoTag:s?void 0:Rr(e.envName),emptySingleRow:!0,colSeparationType:o,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display");let a,l=0;const h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){let e="";for(let r=0;r0&&c&&(n=1),r[e]={type:"align",align:t,pregap:n,postgap:0}}return i.colSeparationType=c?"align":"alignat",i};Ar({type:"array",names:["array","darray"],props:{numArgs:1},handler(e,t){const r=(Rt(t[0])?[t[0]]:qt(t[0],"ordgroup").body).map((function(e){const t=It(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),o={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Hr(e.parser,o,Or(e.envName))},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(e){const t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")];let r="c";const o={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){const t=e.parser;if(t.consumeSpaces(),"["===t.fetch().text){if(t.consume(),t.consumeSpaces(),r=t.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",t.nextToken);t.consume(),t.consumeSpaces(),t.expect("]"),t.consume(),o.cols=[{type:"align",align:r}]}}const s=Hr(e.parser,o,Or(e.envName)),i=Math.max(0,...s.body.map((e=>e.length)));return s.cols=new Array(i).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[s],left:t[0],right:t[1],rightColor:void 0}:s},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){const t=Hr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){const r=(Rt(t[0])?[t[0]]:qt(t[0],"ordgroup").body).map((function(e){const t=It(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");let o={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if(o=Hr(e.parser,o,"script"),o.body.length>0&&o.body[0].length>1)throw new n("{subarray} can contain only one column");return o},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){const t=Hr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Or(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Vr,htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){l.contains(["gather","gather*"],e.envName)&&Ir(e);const t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Rr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Hr(e.parser,t,"display")},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Vr,htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){Ir(e);const t={autoTag:Rr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Hr(e.parser,t,"display")},htmlBuilder:Er,mathmlBuilder:Dr}),Ar({type:"array",names:["CD"],props:{numArgs:0},handler(e){return Ir(e),function(e){const t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();const r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}let r=[];const o=[r];for(let a=0;a-1);else{if(!("<>AV".indexOf(o)>-1))throw new n('Expected one of "<>AV=|." after @',l[t]);for(let e=0;e<2;e++){let r=!0;for(let h=t+1;h{const r=e.font,n=t.withFont(r);return ht(e.body,n)},Gr=(e,t)=>{const r=e.font,n=t.withFont(r);return vt(e.body,n)},Ur={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};je({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=Ze(t[0]);let s=n;return s in Ur&&(s=Ur[s]),{type:"font",mode:r.mode,font:s.slice(1),body:o}},htmlBuilder:Fr,mathmlBuilder:Gr}),je({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{let{parser:r}=e;const n=t[0],o=l.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:Ft(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:o}}}),je({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{let{parser:r,funcName:n,breakOnTokenText:o}=e;const{mode:s}=r,i=r.parseExpression(!0,o);return{type:"font",mode:s,font:"math"+n.slice(1),body:{type:"ordgroup",mode:r.mode,body:i}}},htmlBuilder:Fr,mathmlBuilder:Gr});const Yr=(e,t)=>{let r=t;return"display"===e?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===e&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===e?r=w.SCRIPT:"scriptscript"===e&&(r=w.SCRIPTSCRIPT),r},Xr=(e,t)=>{const r=Yr(e.size,t.style),n=r.fracNum(),o=r.fracDen();let s;s=t.havingStyle(n);const i=ht(e.numer,s,t);if(e.continued){const e=8.5/t.fontMetrics().ptPerEm,r=3.5/t.fontMetrics().ptPerEm;i.height=i.height0?3*c:7*c,u=t.fontMetrics().denom1):(h>0?(m=t.fontMetrics().num2,p=c):(m=t.fontMetrics().num3,p=3*c),u=t.fontMetrics().denom2),l){const e=t.fontMetrics().axisHeight;m-i.depth-(e+.5*h){let r=new gt.MathNode("mfrac",[vt(e.numer,t),vt(e.denom,t)]);if(e.hasBarLine){if(e.barSize){const n=P(e.barSize,t);r.setAttribute("linethickness",F(n))}}else r.setAttribute("linethickness","0px");const n=Yr(e.size,t.style);if(n.size!==t.style.size){r=new gt.MathNode("mstyle",[r]);const e=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",e),r.setAttribute("scriptlevel","0")}if(null!=e.leftDelim||null!=e.rightDelim){const t=[];if(null!=e.leftDelim){const r=new gt.MathNode("mo",[new gt.TextNode(e.leftDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}if(t.push(r),null!=e.rightDelim){const r=new gt.MathNode("mo",[new gt.TextNode(e.rightDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}return bt(t)}return r};je({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=t[1];let i,a=null,l=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":i=!0;break;case"\\\\atopfrac":i=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":i=!1,a="(",l=")";break;case"\\\\bracefrac":i=!1,a="\\{",l="\\}";break;case"\\\\brackfrac":i=!1,a="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:r.mode,continued:!1,numer:o,denom:s,hasBarLine:i,leftDelim:a,rightDelim:l,size:h,barSize:null}},htmlBuilder:Xr,mathmlBuilder:Wr}),je({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=t[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:o,denom:s,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),je({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){let t,{parser:r,funcName:n,token:o}=e;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:o}}});const _r=["display","text","script","scriptscript"],jr=function(e){let t=null;return e.length>0&&(t=e,t="."===t?null:t),t};je({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){let{parser:r}=e;const n=t[4],o=t[5],s=Ze(t[0]),i="atom"===s.type&&"open"===s.family?jr(s.text):null,a=Ze(t[1]),l="atom"===a.type&&"close"===a.family?jr(a.text):null,h=qt(t[2],"size");let c,m=null;h.isBlank?c=!0:(m=h.value,c=m.number>0);let p="auto",u=t[3];if("ordgroup"===u.type){if(u.body.length>0){const e=qt(u.body[0],"textord");p=_r[Number(e.text)]}}else u=qt(u,"textord"),p=_r[Number(u.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:o,continued:!1,hasBarLine:c,barSize:m,leftDelim:i,rightDelim:l,size:p}},htmlBuilder:Xr,mathmlBuilder:Wr}),je({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(e,t){let{parser:r,funcName:n,token:o}=e;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:qt(t[0],"size").value,token:o}}}),je({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(qt(t[1],"infix").size),i=t[2],a=s.number>0;return{type:"genfrac",mode:r.mode,numer:o,denom:i,continued:!1,hasBarLine:a,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Xr,mathmlBuilder:Wr});const $r=(e,t)=>{const r=t.style;let n,o;"supsub"===e.type?(n=e.sup?ht(e.sup,t.havingStyle(r.sup()),t):ht(e.sub,t.havingStyle(r.sub()),t),o=qt(e.base,"horizBrace")):o=qt(e,"horizBrace");const s=ht(o.base,t.havingBaseStyle(w.DISPLAY)),i=Nt(o,t);let a;if(o.isOver?(a=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:i}]},t),a.children[0].children[0].children[1].classes.push("svg-align")):(a=Ve.makeVList({positionType:"bottom",positionData:s.depth+.1+i.height,children:[{type:"elem",elem:i},{type:"kern",size:.1},{type:"elem",elem:s}]},t),a.children[0].children[0].children[0].classes.push("svg-align")),n){const e=Ve.makeSpan(["mord",o.isOver?"mover":"munder"],[a],t);a=o.isOver?Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.2},{type:"elem",elem:n}]},t):Ve.makeVList({positionType:"bottom",positionData:e.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:e}]},t)}return Ve.makeSpan(["mord",o.isOver?"mover":"munder"],[a],t)};je({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:$r,mathmlBuilder:(e,t)=>{const r=Ct(e.label);return new gt.MathNode(e.isOver?"mover":"munder",[vt(e.base,t),r])}}),je({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[1],o=qt(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:o})?{type:"href",mode:r.mode,href:o,body:Ke(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{const r=nt(e.body,t,!1);return Ve.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{let r=wt(e.body,t);return r instanceof ut||(r=new ut("mrow",[r])),r.setAttribute("href",e.href),r}}),je({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=qt(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");const o=[];for(let e=0;e{let{parser:r,funcName:o,token:s}=e;const i=qt(t[0],"raw").string,a=t[1];let l;r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");const h={};switch(o){case"\\htmlClass":h.class=i,l={command:"\\htmlClass",class:i};break;case"\\htmlId":h.id=i,l={command:"\\htmlId",id:i};break;case"\\htmlStyle":h.style=i,l={command:"\\htmlStyle",style:i};break;case"\\htmlData":{const e=i.split(",");for(let t=0;t{const r=nt(e.body,t,!1),n=["enclosing"];e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/));const o=Ve.makeSpan(n,r,t);for(const t in e.attributes)"class"!==t&&e.attributes.hasOwnProperty(t)&&o.setAttribute(t,e.attributes[t]);return o},mathmlBuilder:(e,t)=>wt(e.body,t)}),je({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;return{type:"htmlmathml",mode:r.mode,html:Ke(t[0]),mathml:Ke(t[1])}},htmlBuilder:(e,t)=>{const r=nt(e.html,t,!1);return Ve.makeFragment(r)},mathmlBuilder:(e,t)=>wt(e.mathml,t)});const Zr=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};{const t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new n("Invalid size: '"+e+"' in \\includegraphics");const r={number:+(t[1]+t[2]),unit:t[3]};if(!V(r))throw new n("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r}};je({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{let{parser:o}=e,s={number:0,unit:"em"},i={number:.9,unit:"em"},a={number:0,unit:"em"},l="";if(r[0]){const e=qt(r[0],"raw").string.split(",");for(let t=0;t{const r=P(e.height,t);let n=0;e.totalheight.number>0&&(n=P(e.totalheight,t)-r);let o=0;e.width.number>0&&(o=P(e.width,t));const s={height:F(r+n)};o>0&&(s.width=F(o)),n>0&&(s.verticalAlign=F(-n));const i=new j(e.src,e.alt,s);return i.height=r,i.depth=n,i},mathmlBuilder:(e,t)=>{const r=new gt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);const n=P(e.height,t);let o=0;if(e.totalheight.number>0&&(o=P(e.totalheight,t)-n,r.setAttribute("valign",F(-o))),r.setAttribute("height",F(n+o)),e.width.number>0){const n=P(e.width,t);r.setAttribute("width",F(n))}return r.setAttribute("src",e.src),r}}),je({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=qt(t[0],"size");if(r.settings.strict){const e="m"===n[1],t="mu"===o.value.unit;e?(t||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+o.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):t&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:o.value}},htmlBuilder(e,t){return Ve.makeGlue(e.dimension,t)},mathmlBuilder(e,t){const r=P(e.dimension,t);return new gt.SpaceNode(r)}}),je({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:o}},htmlBuilder:(e,t)=>{let r;"clap"===e.alignment?(r=Ve.makeSpan([],[ht(e.body,t)]),r=Ve.makeSpan(["inner"],[r],t)):r=Ve.makeSpan(["inner"],[ht(e.body,t)]);const n=Ve.makeSpan(["fix"],[]);let o=Ve.makeSpan([e.alignment],[r,n],t);const s=Ve.makeSpan(["strut"]);return s.style.height=F(o.height+o.depth),o.depth&&(s.style.verticalAlign=F(-o.depth)),o.children.unshift(s),o=Ve.makeSpan(["thinbox"],[o],t),Ve.makeSpan(["mord","vbox"],[o],t)},mathmlBuilder:(e,t)=>{const r=new gt.MathNode("mpadded",[vt(e.body,t)]);if("rlap"!==e.alignment){const t="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",t+"width")}return r.setAttribute("width","0px"),r}}),je({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){let{funcName:r,parser:n}=e;const o=n.mode;n.switchMode("math");const s="\\("===r?"\\)":"$",i=n.parseExpression(!1,s);return n.expect(s),n.switchMode(o),{type:"styling",mode:n.mode,style:"text",body:i}}}),je({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new n("Mismatched "+e.funcName)}});const Kr=(e,t)=>{switch(t.style.size){case w.DISPLAY.size:return e.display;case w.TEXT.size:return e.text;case w.SCRIPT.size:return e.script;case w.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};je({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>{let{parser:r}=e;return{type:"mathchoice",mode:r.mode,display:Ke(t[0]),text:Ke(t[1]),script:Ke(t[2]),scriptscript:Ke(t[3])}},htmlBuilder:(e,t)=>{const r=Kr(e,t),n=nt(r,t,!1);return Ve.makeFragment(n)},mathmlBuilder:(e,t)=>{const r=Kr(e,t);return wt(r,t)}});const Jr=(e,t,r,n,o,s,i)=>{e=Ve.makeSpan([],[e]);const a=r&&l.isCharacterBox(r);let h,c,m;if(t){const e=ht(t,n.havingStyle(o.sup()),n);c={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-e.depth)}}if(r){const e=ht(r,n.havingStyle(o.sub()),n);h={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-e.height)}}if(c&&h){const t=n.fontMetrics().bigOpSpacing5+h.elem.height+h.elem.depth+h.kern+e.depth+i;m=Ve.makeVList({positionType:"bottom",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:F(-s)},{type:"kern",size:h.kern},{type:"elem",elem:e},{type:"kern",size:c.kern},{type:"elem",elem:c.elem,marginLeft:F(s)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(h){const t=e.height-i;m=Ve.makeVList({positionType:"top",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:F(-s)},{type:"kern",size:h.kern},{type:"elem",elem:e}]},n)}else{if(!c)return e;{const t=e.depth+i;m=Ve.makeVList({positionType:"bottom",positionData:t,children:[{type:"elem",elem:e},{type:"kern",size:c.kern},{type:"elem",elem:c.elem,marginLeft:F(s)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}}const p=[m];if(h&&0!==s&&!a){const e=Ve.makeSpan(["mspace"],[],n);e.style.marginRight=F(s),p.unshift(e)}return Ve.makeSpan(["mop","op-limits"],p,n)},Qr=["\\smallint"],en=(e,t)=>{let r,n,o,s=!1;"supsub"===e.type?(r=e.sup,n=e.sub,o=qt(e.base,"op"),s=!0):o=qt(e,"op");const i=t.style;let a,h=!1;if(i.size===w.DISPLAY.size&&o.symbol&&!l.contains(Qr,o.name)&&(h=!0),o.symbol){const e=h?"Size2-Regular":"Size1-Regular";let r="";if("\\oiint"!==o.name&&"\\oiiint"!==o.name||(r=o.name.slice(1),o.name="oiint"===r?"\\iint":"\\iiint"),a=Ve.makeSymbol(o.name,e,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),r.length>0){const e=a.italic,n=Ve.staticSvg(r+"Size"+(h?"2":"1"),t);a=Ve.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:n,shift:h?.08:0}]},t),o.name="\\"+r,a.classes.unshift("mop"),a.italic=e}}else if(o.body){const e=nt(o.body,t,!0);1===e.length&&e[0]instanceof Z?(a=e[0],a.classes[0]="mop"):a=Ve.makeSpan(["mop"],e,t)}else{const e=[];for(let r=1;r{let r;if(e.symbol)r=new ut("mo",[ft(e.name,e.mode)]),l.contains(Qr,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new ut("mo",xt(e.body,t));else{r=new ut("mi",[new dt(e.name.slice(1))]);const t=new ut("mo",[ft("\u2061","text")]);r=e.parentIsSupSub?new ut("mrow",[r,t]):pt([r,t])}return r},rn={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};je({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:(e,t)=>{let{parser:r,funcName:n}=e,o=n;return 1===o.length&&(o=rn[o]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:o}},htmlBuilder:en,mathmlBuilder:tn}),je({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Ke(n)}},htmlBuilder:en,mathmlBuilder:tn});const nn={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};je({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:en,mathmlBuilder:tn}),je({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:en,mathmlBuilder:tn}),je({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e,n=r;return 1===n.length&&(n=nn[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:en,mathmlBuilder:tn});const on=(e,t)=>{let r,n,o,s,i=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,o=qt(e.base,"operatorname"),i=!0):o=qt(e,"operatorname"),o.body.length>0){const e=o.body.map((e=>{const t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),r=nt(e,t.withFont("mathrm"),!0);for(let e=0;e{let{parser:r,funcName:n}=e;const o=t[0];return{type:"operatorname",mode:r.mode,body:Ke(o),alwaysHandleSupSub:"\\operatornamewithlimits"===n,limits:!1,parentIsSupSub:!1}},htmlBuilder:on,mathmlBuilder:(e,t)=>{let r=xt(e.body,t.withFont("mathrm")),n=!0;for(let e=0;ee.toText())).join("");r=[new gt.TextNode(e)]}const o=new gt.MathNode("mi",r);o.setAttribute("mathvariant","normal");const s=new gt.MathNode("mo",[ft("\u2061","text")]);return e.parentIsSupSub?new gt.MathNode("mrow",[o,s]):gt.newDocumentFragment([o,s])}}),Br("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),$e({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?Ve.makeFragment(nt(e.body,t,!1)):Ve.makeSpan(["mord"],nt(e.body,t,!0),t)},mathmlBuilder(e,t){return wt(e.body,t,!0)}}),je({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){let{parser:r}=e;const n=t[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(e,t){const r=ht(e.body,t.havingCrampedStyle()),n=Ve.makeLineSpan("overline-line",t),o=t.fontMetrics().defaultRuleThickness,s=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*o},{type:"elem",elem:n},{type:"kern",size:o}]},t);return Ve.makeSpan(["mord","overline"],[s],t)},mathmlBuilder(e,t){const r=new gt.MathNode("mo",[new gt.TextNode("\u203e")]);r.setAttribute("stretchy","true");const n=new gt.MathNode("mover",[vt(e.body,t),r]);return n.setAttribute("accent","true"),n}}),je({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"phantom",mode:r.mode,body:Ke(n)}},htmlBuilder:(e,t)=>{const r=nt(e.body,t.withPhantom(),!1);return Ve.makeFragment(r)},mathmlBuilder:(e,t)=>{const r=xt(e.body,t);return new gt.MathNode("mphantom",r)}}),je({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"hphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{let r=Ve.makeSpan([],[ht(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(let e=0;e{const r=xt(Ke(e.body),t),n=new gt.MathNode("mphantom",r),o=new gt.MathNode("mpadded",[n]);return o.setAttribute("height","0px"),o.setAttribute("depth","0px"),o}}),je({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"vphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{const r=Ve.makeSpan(["inner"],[ht(e.body,t.withPhantom())]),n=Ve.makeSpan(["fix"],[]);return Ve.makeSpan(["mord","rlap"],[r,n],t)},mathmlBuilder:(e,t)=>{const r=xt(Ke(e.body),t),n=new gt.MathNode("mphantom",r),o=new gt.MathNode("mpadded",[n]);return o.setAttribute("width","0px"),o}}),je({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){let{parser:r}=e;const n=qt(t[0],"size").value,o=t[1];return{type:"raisebox",mode:r.mode,dy:n,body:o}},htmlBuilder(e,t){const r=ht(e.body,t),n=P(e.dy,t);return Ve.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){const r=new gt.MathNode("mpadded",[vt(e.body,t)]),n=e.dy.number+e.dy.unit;return r.setAttribute("voffset",n),r}}),je({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(e){let{parser:t}=e;return{type:"internal",mode:t.mode}}}),je({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(e,t,r){let{parser:n}=e;const o=r[0],s=qt(t[0],"size"),i=qt(t[1],"size");return{type:"rule",mode:n.mode,shift:o&&qt(o,"size").value,width:s.value,height:i.value}},htmlBuilder(e,t){const r=Ve.makeSpan(["mord","rule"],[],t),n=P(e.width,t),o=P(e.height,t),s=e.shift?P(e.shift,t):0;return r.style.borderRightWidth=F(n),r.style.borderTopWidth=F(o),r.style.bottom=F(s),r.width=n,r.height=o+s,r.depth=-s,r.maxFontSize=1.125*o*t.sizeMultiplier,r},mathmlBuilder(e,t){const r=P(e.width,t),n=P(e.height,t),o=e.shift?P(e.shift,t):0,s=t.color&&t.getColor()||"black",i=new gt.MathNode("mspace");i.setAttribute("mathbackground",s),i.setAttribute("width",F(r)),i.setAttribute("height",F(n));const a=new gt.MathNode("mpadded",[i]);return o>=0?a.setAttribute("height",F(o)):(a.setAttribute("height",F(o)),a.setAttribute("depth",F(-o))),a.setAttribute("voffset",F(o)),a}});const an=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];je({type:"sizing",names:an,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{let{breakOnTokenText:r,funcName:n,parser:o}=e;const s=o.parseExpression(!1,r);return{type:"sizing",mode:o.mode,size:an.indexOf(n)+1,body:s}},htmlBuilder:(e,t)=>{const r=t.havingSize(e.size);return sn(e.body,r,t)},mathmlBuilder:(e,t)=>{const r=t.havingSize(e.size),n=xt(e.body,r),o=new gt.MathNode("mstyle",n);return o.setAttribute("mathsize",F(r.sizeMultiplier)),o}}),je({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{let{parser:n}=e,o=!1,s=!1;const i=r[0]&&qt(r[0],"ordgroup");if(i){let e="";for(let t=0;t{const r=Ve.makeSpan([],[ht(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(let e=0;e{const r=new gt.MathNode("mpadded",[vt(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),je({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){let{parser:n}=e;const o=r[0],s=t[0];return{type:"sqrt",mode:n.mode,body:s,index:o}},htmlBuilder(e,t){let r=ht(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=Ve.wrapFragment(r,t);const n=t.fontMetrics().defaultRuleThickness;let o=n;t.style.idr.height+r.depth+s&&(s=(s+c-r.height-r.depth)/2);const m=a.height-r.height-s-l;r.style.paddingLeft=F(h);const p=Ve.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+m)},{type:"elem",elem:a},{type:"kern",size:l}]},t);if(e.index){const r=t.havingStyle(w.SCRIPTSCRIPT),n=ht(e.index,r,t),o=.6*(p.height-p.depth),s=Ve.makeVList({positionType:"shift",positionData:-o,children:[{type:"elem",elem:n}]},t),i=Ve.makeSpan(["root"],[s]);return Ve.makeSpan(["mord","sqrt"],[i,p],t)}return Ve.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){const{body:r,index:n}=e;return n?new gt.MathNode("mroot",[vt(r,t),vt(n,t)]):new gt.MathNode("msqrt",[vt(r,t)])}});const ln={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};je({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){let{breakOnTokenText:r,funcName:n,parser:o}=e;const s=o.parseExpression(!0,r),i=n.slice(1,n.length-5);return{type:"styling",mode:o.mode,style:i,body:s}},htmlBuilder(e,t){const r=ln[e.style],n=t.havingStyle(r).withFont("");return sn(e.body,n,t)},mathmlBuilder(e,t){const r=ln[e.style],n=t.havingStyle(r),o=xt(e.body,n),s=new gt.MathNode("mstyle",o),i={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return s.setAttribute("scriptlevel",i[0]),s.setAttribute("displaystyle",i[1]),s}});$e({type:"supsub",htmlBuilder(e,t){const r=function(e,t){const r=e.base;if(r)return"op"===r.type?r.limits&&(t.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?en:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===w.DISPLAY.size||r.limits)?on:null:"accent"===r.type?l.isCharacterBox(r.base)?Ht:null:"horizBrace"===r.type&&!e.sub===r.isOver?$r:null;return null}(e,t);if(r)return r(e,t);const{base:n,sup:o,sub:s}=e,i=ht(n,t);let a,h;const c=t.fontMetrics();let m=0,p=0;const u=n&&l.isCharacterBox(n);if(o){const e=t.havingStyle(t.style.sup());a=ht(o,e,t),u||(m=i.height-e.fontMetrics().supDrop*e.sizeMultiplier/t.sizeMultiplier)}if(s){const e=t.havingStyle(t.style.sub());h=ht(s,e,t),u||(p=i.depth+e.fontMetrics().subDrop*e.sizeMultiplier/t.sizeMultiplier)}let d;d=t.style===w.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;const g=t.sizeMultiplier,f=F(.5/c.ptPerEm/g);let b,y=null;if(h){const t=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(i instanceof Z||t)&&(y=F(-i.italic))}if(a&&h){m=Math.max(m,d,a.depth+.25*c.xHeight),p=Math.max(p,c.sub2);const e=4*c.defaultRuleThickness;if(m-a.depth-(h.height-p)0&&(m+=t,p-=t)}const r=[{type:"elem",elem:h,shift:p,marginRight:f,marginLeft:y},{type:"elem",elem:a,shift:-m,marginRight:f}];b=Ve.makeVList({positionType:"individualShift",children:r},t)}else if(h){p=Math.max(p,c.sub1,h.height-.8*c.xHeight);const e=[{type:"elem",elem:h,marginLeft:y,marginRight:f}];b=Ve.makeVList({positionType:"shift",positionData:p,children:e},t)}else{if(!a)throw new Error("supsub must have either sup or sub.");m=Math.max(m,d,a.depth+.25*c.xHeight),b=Ve.makeVList({positionType:"shift",positionData:-m,children:[{type:"elem",elem:a,marginRight:f}]},t)}const x=at(i,"right")||"mord";return Ve.makeSpan([x],[i,Ve.makeSpan(["msupsub"],[b])],t)},mathmlBuilder(e,t){let r,n,o=!1;e.base&&"horizBrace"===e.base.type&&(n=!!e.sup,n===e.base.isOver&&(o=!0,r=e.base.isOver)),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);const s=[vt(e.base,t)];let i;if(e.sub&&s.push(vt(e.sub,t)),e.sup&&s.push(vt(e.sup,t)),o)i=r?"mover":"munder";else if(e.sub)if(e.sup){const r=e.base;i=r&&"op"===r.type&&r.limits&&t.style===w.DISPLAY||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(t.style===w.DISPLAY||r.limits)?"munderover":"msubsup"}else{const r=e.base;i=r&&"op"===r.type&&r.limits&&(t.style===w.DISPLAY||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.style===w.DISPLAY)?"munder":"msub"}else{const r=e.base;i=r&&"op"===r.type&&r.limits&&(t.style===w.DISPLAY||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.style===w.DISPLAY)?"mover":"msup"}return new gt.MathNode(i,s)}}),$e({type:"atom",htmlBuilder(e,t){return Ve.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder(e,t){const r=new gt.MathNode("mo",[ft(e.text,e.mode)]);if("bin"===e.family){const n=yt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});const hn={mi:"italic",mn:"normal",mtext:"normal"};$e({type:"mathord",htmlBuilder(e,t){return Ve.makeOrd(e,t,"mathord")},mathmlBuilder(e,t){const r=new gt.MathNode("mi",[ft(e.text,e.mode,t)]),n=yt(e,t)||"italic";return n!==hn[r.type]&&r.setAttribute("mathvariant",n),r}}),$e({type:"textord",htmlBuilder(e,t){return Ve.makeOrd(e,t,"textord")},mathmlBuilder(e,t){const r=ft(e.text,e.mode,t),n=yt(e,t)||"normal";let o;return o="text"===e.mode?new gt.MathNode("mtext",[r]):/[0-9]/.test(e.text)?new gt.MathNode("mn",[r]):"\\prime"===e.text?new gt.MathNode("mo",[r]):new gt.MathNode("mi",[r]),n!==hn[o.type]&&o.setAttribute("mathvariant",n),o}});const cn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},mn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};$e({type:"spacing",htmlBuilder(e,t){if(mn.hasOwnProperty(e.text)){const r=mn[e.text].className||"";if("text"===e.mode){const n=Ve.makeOrd(e,t,"textord");return n.classes.push(r),n}return Ve.makeSpan(["mspace",r],[Ve.mathsym(e.text,e.mode,t)],t)}if(cn.hasOwnProperty(e.text))return Ve.makeSpan(["mspace",cn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder(e,t){let r;if(!mn.hasOwnProperty(e.text)){if(cn.hasOwnProperty(e.text))return new gt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return r=new gt.MathNode("mtext",[new gt.TextNode("\xa0")]),r}});const pn=()=>{const e=new gt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};$e({type:"tag",mathmlBuilder(e,t){const r=new gt.MathNode("mtable",[new gt.MathNode("mtr",[pn(),new gt.MathNode("mtd",[wt(e.body,t)]),pn(),new gt.MathNode("mtd",[wt(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});const un={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},dn={"\\textbf":"textbf","\\textmd":"textmd"},gn={"\\textit":"textit","\\textup":"textup"},fn=(e,t)=>{const r=e.font;return r?un[r]?t.withTextFontFamily(un[r]):dn[r]?t.withTextFontWeight(dn[r]):t.withTextFontShape(gn[r]):t};je({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"text",mode:r.mode,body:Ke(o),font:n}},htmlBuilder(e,t){const r=fn(e,t),n=nt(e.body,r,!0);return Ve.makeSpan(["mord","text"],n,r)},mathmlBuilder(e,t){const r=fn(e,t);return wt(e.body,r)}}),je({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"underline",mode:r.mode,body:t[0]}},htmlBuilder(e,t){const r=ht(e.body,t),n=Ve.makeLineSpan("underline-line",t),o=t.fontMetrics().defaultRuleThickness,s=Ve.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:o},{type:"elem",elem:n},{type:"kern",size:3*o},{type:"elem",elem:r}]},t);return Ve.makeSpan(["mord","underline"],[s],t)},mathmlBuilder(e,t){const r=new gt.MathNode("mo",[new gt.TextNode("\u203e")]);r.setAttribute("stretchy","true");const n=new gt.MathNode("munder",[vt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),je({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){let{parser:r}=e;return{type:"vcenter",mode:r.mode,body:t[0]}},htmlBuilder(e,t){const r=ht(e.body,t),n=t.fontMetrics().axisHeight,o=.5*(r.height-n-(r.depth+n));return Ve.makeVList({positionType:"shift",positionData:o,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return new gt.MathNode("mpadded",[vt(e.body,t)],["vcenter"])}}),je({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){const r=bn(e),n=[],o=t.havingStyle(t.style.text());for(let t=0;te.body.replace(/ /g,e.star?"\u2423":"\xa0");var yn=Xe;const xn="[ \r\n\t]",wn="(\\\\[a-zA-Z@]+)"+xn+"*",vn="[\u0300-\u036f]",kn=new RegExp(vn+"+$"),Sn="("+xn+"+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff]"+vn+"*|[\ud800-\udbff][\udc00-\udfff]"+vn+"*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|"+wn+"|\\\\[^\ud800-\udfff])";class Mn{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(Sn,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){const e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new Nr("EOF",new Cr(this,t,t));const r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new n("Unexpected character: '"+e[t]+"'",new Nr(e[t],new Cr(this,t,t+1)));const o=r[6]||r[3]||(r[2]?"\\ ":" ");if(14===this.catcodes[o]){const t=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===t?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=t+1,this.lex()}return new Nr(o,new Cr(this,t,this.tokenRegex.lastIndex))}}class zn{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new n("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");const e=this.undefStack.pop();for(const t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,r){if(void 0===r&&(r=!1),r){for(let t=0;t0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{const t=this.undefStack[this.undefStack.length-1];t&&!t.hasOwnProperty(e)&&(t[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t}}var An=Tr;Br("\\noexpand",(function(e){const t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Br("\\expandafter",(function(e){const t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Br("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Br("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Br("\\@ifnextchar",(function(e){const t=e.consumeArgs(3);e.consumeSpaces();const r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Br("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Br("\\TextOrMath",(function(e){const t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));const Tn={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Br("\\char",(function(e){let t,r=e.popToken(),o="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if(r=e.popToken(),"\\"===r.text[0])o=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");o=r.text.charCodeAt(0)}else t=10;if(t){if(o=Tn[r.text],null==o||o>=t)throw new n("Invalid base-"+t+" digit "+r.text);let s;for(;null!=(s=Tn[e.future().text])&&s{let o=e.consumeArg().tokens;if(1!==o.length)throw new n("\\newcommand's first argument must be a macro name");const s=o[0].text,i=e.isDefined(s);if(i&&!t)throw new n("\\newcommand{"+s+"} attempting to redefine "+s+"; use \\renewcommand");if(!i&&!r)throw new n("\\renewcommand{"+s+"} when command "+s+" does not yet exist; use \\newcommand");let a=0;if(o=e.consumeArg().tokens,1===o.length&&"["===o[0].text){let t="",r=e.expandNextToken();for(;"]"!==r.text&&"EOF"!==r.text;)t+=r.text,r=e.expandNextToken();if(!t.match(/^\s*[0-9]+\s*$/))throw new n("Invalid number of arguments: "+t);a=parseInt(t),o=e.consumeArg().tokens}return e.macros.set(s,{tokens:o,numArgs:a}),""};Br("\\newcommand",(e=>Bn(e,!1,!0))),Br("\\renewcommand",(e=>Bn(e,!0,!1))),Br("\\providecommand",(e=>Bn(e,!0,!0))),Br("\\message",(e=>{const t=e.consumeArgs(1)[0];return console.log(t.reverse().map((e=>e.text)).join("")),""})),Br("\\errmessage",(e=>{const t=e.consumeArgs(1)[0];return console.error(t.reverse().map((e=>e.text)).join("")),""})),Br("\\show",(e=>{const t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),yn[r],oe.math[r],oe.text[r]),""})),Br("\\bgroup","{"),Br("\\egroup","}"),Br("~","\\nobreakspace"),Br("\\lq","`"),Br("\\rq","'"),Br("\\aa","\\r a"),Br("\\AA","\\r A"),Br("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),Br("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),Br("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),Br("\u212c","\\mathscr{B}"),Br("\u2130","\\mathscr{E}"),Br("\u2131","\\mathscr{F}"),Br("\u210b","\\mathscr{H}"),Br("\u2110","\\mathscr{I}"),Br("\u2112","\\mathscr{L}"),Br("\u2133","\\mathscr{M}"),Br("\u211b","\\mathscr{R}"),Br("\u212d","\\mathfrak{C}"),Br("\u210c","\\mathfrak{H}"),Br("\u2128","\\mathfrak{Z}"),Br("\\Bbbk","\\Bbb{k}"),Br("\xb7","\\cdotp"),Br("\\llap","\\mathllap{\\textrm{#1}}"),Br("\\rlap","\\mathrlap{\\textrm{#1}}"),Br("\\clap","\\mathclap{\\textrm{#1}}"),Br("\\mathstrut","\\vphantom{(}"),Br("\\underbar","\\underline{\\text{#1}}"),Br("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),Br("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),Br("\\ne","\\neq"),Br("\u2260","\\neq"),Br("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),Br("\u2209","\\notin"),Br("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),Br("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),Br("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),Br("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),Br("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),Br("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),Br("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),Br("\u27c2","\\perp"),Br("\u203c","\\mathclose{!\\mkern-0.8mu!}"),Br("\u220c","\\notni"),Br("\u231c","\\ulcorner"),Br("\u231d","\\urcorner"),Br("\u231e","\\llcorner"),Br("\u231f","\\lrcorner"),Br("\xa9","\\copyright"),Br("\xae","\\textregistered"),Br("\ufe0f","\\textregistered"),Br("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),Br("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),Br("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),Br("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),Br("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),Br("\u22ee","\\vdots"),Br("\\varGamma","\\mathit{\\Gamma}"),Br("\\varDelta","\\mathit{\\Delta}"),Br("\\varTheta","\\mathit{\\Theta}"),Br("\\varLambda","\\mathit{\\Lambda}"),Br("\\varXi","\\mathit{\\Xi}"),Br("\\varPi","\\mathit{\\Pi}"),Br("\\varSigma","\\mathit{\\Sigma}"),Br("\\varUpsilon","\\mathit{\\Upsilon}"),Br("\\varPhi","\\mathit{\\Phi}"),Br("\\varPsi","\\mathit{\\Psi}"),Br("\\varOmega","\\mathit{\\Omega}"),Br("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),Br("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),Br("\\boxed","\\fbox{$\\displaystyle{#1}$}"),Br("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),Br("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),Br("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");const Cn={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Br("\\dots",(function(e){let t="\\dotso";const r=e.expandAfterFuture().text;return r in Cn?t=Cn[r]:("\\not"===r.slice(0,4)||r in oe.math&&l.contains(["bin","rel"],oe.math[r].group))&&(t="\\dotsb"),t}));const Nn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Br("\\dotso",(function(e){return e.future().text in Nn?"\\ldots\\,":"\\ldots"})),Br("\\dotsc",(function(e){const t=e.future().text;return t in Nn&&","!==t?"\\ldots\\,":"\\ldots"})),Br("\\cdots",(function(e){return e.future().text in Nn?"\\@cdots\\,":"\\@cdots"})),Br("\\dotsb","\\cdots"),Br("\\dotsm","\\cdots"),Br("\\dotsi","\\!\\cdots"),Br("\\dotsx","\\ldots\\,"),Br("\\DOTSI","\\relax"),Br("\\DOTSB","\\relax"),Br("\\DOTSX","\\relax"),Br("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Br("\\,","\\tmspace+{3mu}{.1667em}"),Br("\\thinspace","\\,"),Br("\\>","\\mskip{4mu}"),Br("\\:","\\tmspace+{4mu}{.2222em}"),Br("\\medspace","\\:"),Br("\\;","\\tmspace+{5mu}{.2777em}"),Br("\\thickspace","\\;"),Br("\\!","\\tmspace-{3mu}{.1667em}"),Br("\\negthinspace","\\!"),Br("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Br("\\negthickspace","\\tmspace-{5mu}{.277em}"),Br("\\enspace","\\kern.5em "),Br("\\enskip","\\hskip.5em\\relax"),Br("\\quad","\\hskip1em\\relax"),Br("\\qquad","\\hskip2em\\relax"),Br("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Br("\\tag@paren","\\tag@literal{({#1})}"),Br("\\tag@literal",(e=>{if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Br("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Br("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Br("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Br("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Br("\\newline","\\\\\\relax"),Br("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");const qn=F(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Br("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+qn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Br("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+qn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Br("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Br("\\@hspace","\\hskip #1\\relax"),Br("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Br("\\ordinarycolon",":"),Br("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Br("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Br("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Br("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Br("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Br("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Br("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Br("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Br("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Br("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Br("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Br("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Br("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Br("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Br("\u2237","\\dblcolon"),Br("\u2239","\\eqcolon"),Br("\u2254","\\coloneqq"),Br("\u2255","\\eqqcolon"),Br("\u2a74","\\Coloneqq"),Br("\\ratio","\\vcentcolon"),Br("\\coloncolon","\\dblcolon"),Br("\\colonequals","\\coloneqq"),Br("\\coloncolonequals","\\Coloneqq"),Br("\\equalscolon","\\eqqcolon"),Br("\\equalscoloncolon","\\Eqqcolon"),Br("\\colonminus","\\coloneq"),Br("\\coloncolonminus","\\Coloneq"),Br("\\minuscolon","\\eqcolon"),Br("\\minuscoloncolon","\\Eqcolon"),Br("\\coloncolonapprox","\\Colonapprox"),Br("\\coloncolonsim","\\Colonsim"),Br("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Br("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Br("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Br("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Br("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Br("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Br("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Br("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Br("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Br("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Br("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Br("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Br("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Br("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Br("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Br("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Br("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Br("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Br("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Br("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Br("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Br("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Br("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Br("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Br("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Br("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Br("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Br("\\imath","\\html@mathml{\\@imath}{\u0131}"),Br("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Br("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Br("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Br("\u27e6","\\llbracket"),Br("\u27e7","\\rrbracket"),Br("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Br("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Br("\u2983","\\lBrace"),Br("\u2984","\\rBrace"),Br("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Br("\u29b5","\\minuso"),Br("\\darr","\\downarrow"),Br("\\dArr","\\Downarrow"),Br("\\Darr","\\Downarrow"),Br("\\lang","\\langle"),Br("\\rang","\\rangle"),Br("\\uarr","\\uparrow"),Br("\\uArr","\\Uparrow"),Br("\\Uarr","\\Uparrow"),Br("\\N","\\mathbb{N}"),Br("\\R","\\mathbb{R}"),Br("\\Z","\\mathbb{Z}"),Br("\\alef","\\aleph"),Br("\\alefsym","\\aleph"),Br("\\Alpha","\\mathrm{A}"),Br("\\Beta","\\mathrm{B}"),Br("\\bull","\\bullet"),Br("\\Chi","\\mathrm{X}"),Br("\\clubs","\\clubsuit"),Br("\\cnums","\\mathbb{C}"),Br("\\Complex","\\mathbb{C}"),Br("\\Dagger","\\ddagger"),Br("\\diamonds","\\diamondsuit"),Br("\\empty","\\emptyset"),Br("\\Epsilon","\\mathrm{E}"),Br("\\Eta","\\mathrm{H}"),Br("\\exist","\\exists"),Br("\\harr","\\leftrightarrow"),Br("\\hArr","\\Leftrightarrow"),Br("\\Harr","\\Leftrightarrow"),Br("\\hearts","\\heartsuit"),Br("\\image","\\Im"),Br("\\infin","\\infty"),Br("\\Iota","\\mathrm{I}"),Br("\\isin","\\in"),Br("\\Kappa","\\mathrm{K}"),Br("\\larr","\\leftarrow"),Br("\\lArr","\\Leftarrow"),Br("\\Larr","\\Leftarrow"),Br("\\lrarr","\\leftrightarrow"),Br("\\lrArr","\\Leftrightarrow"),Br("\\Lrarr","\\Leftrightarrow"),Br("\\Mu","\\mathrm{M}"),Br("\\natnums","\\mathbb{N}"),Br("\\Nu","\\mathrm{N}"),Br("\\Omicron","\\mathrm{O}"),Br("\\plusmn","\\pm"),Br("\\rarr","\\rightarrow"),Br("\\rArr","\\Rightarrow"),Br("\\Rarr","\\Rightarrow"),Br("\\real","\\Re"),Br("\\reals","\\mathbb{R}"),Br("\\Reals","\\mathbb{R}"),Br("\\Rho","\\mathrm{P}"),Br("\\sdot","\\cdot"),Br("\\sect","\\S"),Br("\\spades","\\spadesuit"),Br("\\sub","\\subset"),Br("\\sube","\\subseteq"),Br("\\supe","\\supseteq"),Br("\\Tau","\\mathrm{T}"),Br("\\thetasym","\\vartheta"),Br("\\weierp","\\wp"),Br("\\Zeta","\\mathrm{Z}"),Br("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Br("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Br("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Br("\\bra","\\mathinner{\\langle{#1}|}"),Br("\\ket","\\mathinner{|{#1}\\rangle}"),Br("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Br("\\Bra","\\left\\langle#1\\right|"),Br("\\Ket","\\left|#1\\right\\rangle");const In=e=>t=>{const r=t.consumeArg().tokens,n=t.consumeArg().tokens,o=t.consumeArg().tokens,s=t.consumeArg().tokens,i=t.macros.get("|"),a=t.macros.get("\\|");t.macros.beginGroup();const l=t=>r=>{e&&(r.macros.set("|",i),o.length&&r.macros.set("\\|",a));let s=t;if(!t&&o.length){"|"===r.future().text&&(r.popToken(),s=!0)}return{tokens:s?o:n,numArgs:0}};t.macros.set("|",l(!1)),o.length&&t.macros.set("\\|",l(!0));const h=t.consumeArg().tokens,c=t.expandTokens([...s,...h,...r]);return t.macros.endGroup(),{tokens:c.reverse(),numArgs:0}};Br("\\bra@ket",In(!1)),Br("\\bra@set",In(!0)),Br("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),Br("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),Br("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),Br("\\angln","{\\angl n}"),Br("\\blue","\\textcolor{##6495ed}{#1}"),Br("\\orange","\\textcolor{##ffa500}{#1}"),Br("\\pink","\\textcolor{##ff00af}{#1}"),Br("\\red","\\textcolor{##df0030}{#1}"),Br("\\green","\\textcolor{##28ae7b}{#1}"),Br("\\gray","\\textcolor{gray}{#1}"),Br("\\purple","\\textcolor{##9d38bd}{#1}"),Br("\\blueA","\\textcolor{##ccfaff}{#1}"),Br("\\blueB","\\textcolor{##80f6ff}{#1}"),Br("\\blueC","\\textcolor{##63d9ea}{#1}"),Br("\\blueD","\\textcolor{##11accd}{#1}"),Br("\\blueE","\\textcolor{##0c7f99}{#1}"),Br("\\tealA","\\textcolor{##94fff5}{#1}"),Br("\\tealB","\\textcolor{##26edd5}{#1}"),Br("\\tealC","\\textcolor{##01d1c1}{#1}"),Br("\\tealD","\\textcolor{##01a995}{#1}"),Br("\\tealE","\\textcolor{##208170}{#1}"),Br("\\greenA","\\textcolor{##b6ffb0}{#1}"),Br("\\greenB","\\textcolor{##8af281}{#1}"),Br("\\greenC","\\textcolor{##74cf70}{#1}"),Br("\\greenD","\\textcolor{##1fab54}{#1}"),Br("\\greenE","\\textcolor{##0d923f}{#1}"),Br("\\goldA","\\textcolor{##ffd0a9}{#1}"),Br("\\goldB","\\textcolor{##ffbb71}{#1}"),Br("\\goldC","\\textcolor{##ff9c39}{#1}"),Br("\\goldD","\\textcolor{##e07d10}{#1}"),Br("\\goldE","\\textcolor{##a75a05}{#1}"),Br("\\redA","\\textcolor{##fca9a9}{#1}"),Br("\\redB","\\textcolor{##ff8482}{#1}"),Br("\\redC","\\textcolor{##f9685d}{#1}"),Br("\\redD","\\textcolor{##e84d39}{#1}"),Br("\\redE","\\textcolor{##bc2612}{#1}"),Br("\\maroonA","\\textcolor{##ffbde0}{#1}"),Br("\\maroonB","\\textcolor{##ff92c6}{#1}"),Br("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Br("\\maroonD","\\textcolor{##ca337c}{#1}"),Br("\\maroonE","\\textcolor{##9e034e}{#1}"),Br("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Br("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Br("\\purpleC","\\textcolor{##aa87ff}{#1}"),Br("\\purpleD","\\textcolor{##7854ab}{#1}"),Br("\\purpleE","\\textcolor{##543b78}{#1}"),Br("\\mintA","\\textcolor{##f5f9e8}{#1}"),Br("\\mintB","\\textcolor{##edf2df}{#1}"),Br("\\mintC","\\textcolor{##e0e5cc}{#1}"),Br("\\grayA","\\textcolor{##f6f7f7}{#1}"),Br("\\grayB","\\textcolor{##f0f1f2}{#1}"),Br("\\grayC","\\textcolor{##e3e5e6}{#1}"),Br("\\grayD","\\textcolor{##d6d8da}{#1}"),Br("\\grayE","\\textcolor{##babec2}{#1}"),Br("\\grayF","\\textcolor{##888d93}{#1}"),Br("\\grayG","\\textcolor{##626569}{#1}"),Br("\\grayH","\\textcolor{##3b3e40}{#1}"),Br("\\grayI","\\textcolor{##21242c}{#1}"),Br("\\kaBlue","\\textcolor{##314453}{#1}"),Br("\\kaGreen","\\textcolor{##71B307}{#1}");const Rn={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class Hn{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new zn(An,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Mn(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),({tokens:n,end:r}=this.consumeArg(["]"]))}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new Nr("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}}consumeArg(e){const t=[],r=e&&e.length>0;r||this.consumeSpaces();const o=this.future();let s,i=0,a=0;do{if(s=this.popToken(),t.push(s),"{"===s.text)++i;else if("}"===s.text){if(--i,-1===i)throw new n("Extra }",s)}else if("EOF"===s.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[a]:"}")+"'",s);if(e&&r)if((0===i||1===i&&"{"===e[a])&&s.text===e[a]){if(++a,a===e.length){t.splice(-a,a);break}}else a=0}while(0!==i||r);return"{"===o.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:o,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");const r=t[0];for(let e=0;ethis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){const t=this.popToken(),r=t.text,o=t.noexpand?null:this._getExpansion(r);if(null==o||e&&o.unexpandable){if(e&&null==o&&"\\"===r[0]&&!this.isDefined(r))throw new n("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);let s=o.tokens;const i=this.consumeArgs(o.numArgs,o.delimiters);if(o.numArgs){s=s.slice();for(let e=s.length-1;e>=0;--e){let t=s[e];if("#"===t.text){if(0===e)throw new n("Incomplete placeholder at end of macro body",t);if(t=s[--e],"#"===t.text)s.splice(e+1,1);else{if(!/^[1-9]$/.test(t.text))throw new n("Not a valid argument number",t);s.splice(e,2,...i[+t.text-1])}}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(!1===this.expandOnce()){const e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Nr(e)]):void 0}expandTokens(e){const t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){const e=this.stack.pop();e.treatAsRelax&&(e.noexpand=!1,e.treatAsRelax=!1),t.push(e)}return this.countExpansion(t.length),t}expandMacroAsText(e){const t=this.expandMacro(e);return t?t.map((e=>e.text)).join(""):t}_getExpansion(e){const t=this.macros.get(e);if(null==t)return t;if(1===e.length){const t=this.lexer.catcodes[e];if(null!=t&&13!==t)return}const r="function"==typeof t?t(this):t;if("string"==typeof r){let e=0;if(-1!==r.indexOf("#")){const t=r.replace(/##/g,"");for(;-1!==t.indexOf("#"+(e+1));)++e}const t=new Mn(r,this.settings),n=[];let o=t.lex();for(;"EOF"!==o.text;)n.push(o),o=t.lex();n.reverse();return{tokens:n,numArgs:e}}return r}isDefined(e){return this.macros.has(e)||yn.hasOwnProperty(e)||oe.math.hasOwnProperty(e)||oe.text.hasOwnProperty(e)||Rn.hasOwnProperty(e)}isExpandable(e){const t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:yn.hasOwnProperty(e)&&!yn[e].primitive}}const On=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,En=Object.freeze({"\u208a":"+","\u208b":"-","\u208c":"=","\u208d":"(","\u208e":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1d62":"i","\u2c7c":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209a":"p","\u1d63":"r","\u209b":"s","\u209c":"t","\u1d64":"u","\u1d65":"v","\u2093":"x","\u1d66":"\u03b2","\u1d67":"\u03b3","\u1d68":"\u03c1","\u1d69":"\u03d5","\u1d6a":"\u03c7","\u207a":"+","\u207b":"-","\u207c":"=","\u207d":"(","\u207e":")","\u2070":"0","\xb9":"1","\xb2":"2","\xb3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1d2c":"A","\u1d2e":"B","\u1d30":"D","\u1d31":"E","\u1d33":"G","\u1d34":"H","\u1d35":"I","\u1d36":"J","\u1d37":"K","\u1d38":"L","\u1d39":"M","\u1d3a":"N","\u1d3c":"O","\u1d3e":"P","\u1d3f":"R","\u1d40":"T","\u1d41":"U","\u2c7d":"V","\u1d42":"W","\u1d43":"a","\u1d47":"b","\u1d9c":"c","\u1d48":"d","\u1d49":"e","\u1da0":"f","\u1d4d":"g","\u02b0":"h","\u2071":"i","\u02b2":"j","\u1d4f":"k","\u02e1":"l","\u1d50":"m","\u207f":"n","\u1d52":"o","\u1d56":"p","\u02b3":"r","\u02e2":"s","\u1d57":"t","\u1d58":"u","\u1d5b":"v","\u02b7":"w","\u02e3":"x","\u02b8":"y","\u1dbb":"z","\u1d5d":"\u03b2","\u1d5e":"\u03b3","\u1d5f":"\u03b4","\u1d60":"\u03d5","\u1d61":"\u03c7","\u1dbf":"\u03b8"}),Ln={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Dn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"};class Vn{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Hn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{const e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){const t=this.nextToken;this.consume(),this.gullet.pushToken(new Nr("}")),this.gullet.pushTokens(e);const r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r}parseExpression(e,t){const r=[];for(;;){"math"===this.mode&&this.consumeSpaces();const n=this.fetch();if(-1!==Vn.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&yn[n.text]&&yn[n.text].infix)break;const o=this.parseAtom(t);if(!o)break;"internal"!==o.type&&r.push(o)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(e){let t,r=-1;for(let o=0;o=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);const r=oe[this.mode][t].group,n=Cr.range(e);let s;if(te.hasOwnProperty(r)){const e=r;s={type:"atom",mode:this.mode,family:e,loc:n,text:t}}else s={type:r,mode:this.mode,loc:n,text:t};o=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),o={type:"textord",mode:"text",loc:Cr.range(e),text:t}}if(this.consume(),r)for(let t=0;t katex.renderToString(token.text, { ...options, displayMode: token.displayMode }) + (newlineAfter ? '\n' : ''); + } + + function inlineKatex(options, renderer) { + return { + name: 'inlineKatex', + level: 'inline', + start(src) { + let index; + let indexSrc = src; + + while (indexSrc) { + index = indexSrc.indexOf('$'); + if (index === -1) { + return; + } + + if (index === 0 || indexSrc.charAt(index - 1) === ' ') { + const possibleKatex = indexSrc.substring(index); + + if (possibleKatex.match(inlineRule)) { + return index; + } + } + + indexSrc = indexSrc.substring(index + 1).replace(/^\$+/, ''); + } + }, + tokenizer(src, tokens) { + const match = src.match(inlineRule); + if (match) { + return { + type: 'inlineKatex', + raw: match[0], + text: match[2].trim(), + displayMode: match[1].length === 2 + }; + } + }, + renderer + }; + } + + function blockKatex(options, renderer) { + return { + name: 'blockKatex', + level: 'block', + tokenizer(src, tokens) { + const match = src.match(blockRule); + if (match) { + return { + type: 'blockKatex', + raw: match[0], + text: match[2].trim(), + displayMode: match[1].length === 2 + }; + } + }, + renderer + }; + } + + return index; + + })); diff --git a/src/agentscope/studio/static/js_third_party/marked.min.js b/src/agentscope/studio/static/js_third_party/marked.min.js new file mode 100644 index 000000000..4748098a3 --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/marked.min.js @@ -0,0 +1,6 @@ +/** + * marked v12.0.2 - a markdown parser + * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,(function(e){"use strict";function t(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function n(t){e.defaults=t}e.defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};const s=/[&<>"']/,r=new RegExp(s.source,"g"),i=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,l=new RegExp(i.source,"g"),o={"&":"&","<":"<",">":">",'"':""","'":"'"},a=e=>o[e];function c(e,t){if(t){if(s.test(e))return e.replace(r,a)}else if(i.test(e))return e.replace(l,a);return e}const h=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function p(e){return e.replace(h,((e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}const u=/(^|[^\[])\^/g;function k(e,t){let n="string"==typeof e?e:e.source;t=t||"";const s={replace:(e,t)=>{let r="string"==typeof t?t:t.source;return r=r.replace(u,"$1"),n=n.replace(e,r),s},getRegex:()=>new RegExp(n,t)};return s}function g(e){try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return null}return e}const f={exec:()=>null};function d(e,t){const n=e.replace(/\|/g,((e,t,n)=>{let s=!1,r=t;for(;--r>=0&&"\\"===n[r];)s=!s;return s?"|":" |"})).split(/ \|/);let s=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:x(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t){const n=e.match(/^(\s+)(?:```)/);if(null===n)return t;const s=n[1];return t.split("\n").map((e=>{const t=e.match(/^\s+/);if(null===t)return e;const[n]=t;return n.length>=s.length?e.slice(s.length):e})).join("\n")}(e,t[3]||"");return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){const t=x(e,"#");this.options.pedantic?e=t.trim():t&&!/ $/.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){let e=t[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,"\n $1");e=x(e.replace(/^ *>[ \t]?/gm,""),"\n");const n=this.lexer.state.top;this.lexer.state.top=!0;const s=this.lexer.blockTokens(e);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:s,text:e}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim();const s=n.length>1,r={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");const i=new RegExp(`^( {0,3}${n})((?:[\t ][^\\n]*)?(?:\\n|$))`);let l="",o="",a=!1;for(;e;){let n=!1;if(!(t=i.exec(e)))break;if(this.rules.block.hr.test(e))break;l=t[0],e=e.substring(l.length);let s=t[2].split("\n",1)[0].replace(/^\t+/,(e=>" ".repeat(3*e.length))),c=e.split("\n",1)[0],h=0;this.options.pedantic?(h=2,o=s.trimStart()):(h=t[2].search(/[^ ]/),h=h>4?1:h,o=s.slice(h),h+=t[1].length);let p=!1;if(!s&&/^ *$/.test(c)&&(l+=c+"\n",e=e.substring(c.length+1),n=!0),!n){const t=new RegExp(`^ {0,${Math.min(3,h-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),n=new RegExp(`^ {0,${Math.min(3,h-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),r=new RegExp(`^ {0,${Math.min(3,h-1)}}(?:\`\`\`|~~~)`),i=new RegExp(`^ {0,${Math.min(3,h-1)}}#`);for(;e;){const a=e.split("\n",1)[0];if(c=a,this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),r.test(c))break;if(i.test(c))break;if(t.test(c))break;if(n.test(e))break;if(c.search(/[^ ]/)>=h||!c.trim())o+="\n"+c.slice(h);else{if(p)break;if(s.search(/[^ ]/)>=4)break;if(r.test(s))break;if(i.test(s))break;if(n.test(s))break;o+="\n"+c}p||c.trim()||(p=!0),l+=a+"\n",e=e.substring(a.length+1),s=c.slice(h)}}r.loose||(a?r.loose=!0:/\n *\n *$/.test(l)&&(a=!0));let u,k=null;this.options.gfm&&(k=/^\[[ xX]\] /.exec(o),k&&(u="[ ] "!==k[0],o=o.replace(/^\[[ xX]\] +/,""))),r.items.push({type:"list_item",raw:l,task:!!k,checked:u,loose:!1,text:o,tokens:[]}),r.raw+=l}r.items[r.items.length-1].raw=l.trimEnd(),r.items[r.items.length-1].text=o.trimEnd(),r.raw=r.raw.trimEnd();for(let e=0;e"space"===e.type)),n=t.length>0&&t.some((e=>/\n.*\n/.test(e.raw)));r.loose=n}if(r.loose)for(let e=0;e$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:s}}}table(e){const t=this.rules.block.table.exec(e);if(!t)return;if(!/[:|]/.test(t[2]))return;const n=d(t[1]),s=t[2].replace(/^\||\| *$/g,"").split("|"),r=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[],i={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===s.length){for(const e of s)/^ *-+: *$/.test(e)?i.align.push("right"):/^ *:-+: *$/.test(e)?i.align.push("center"):/^ *:-+ *$/.test(e)?i.align.push("left"):i.align.push(null);for(const e of n)i.header.push({text:e,tokens:this.lexer.inline(e)});for(const e of r)i.rows.push(d(e,i.header.length).map((e=>({text:e,tokens:this.lexer.inline(e)}))));return i}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const e="\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:c(t[1])}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;const t=x(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let s=0;s-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],s="";if(this.options.pedantic){const e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],s=e[3])}else s=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^$/.test(e)?n.slice(1):n.slice(1,-1)),b(t,{href:n?n.replace(this.rules.inline.anyPunctuation,"$1"):n,title:s?s.replace(this.rules.inline.anyPunctuation,"$1"):s},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const e=t[(n[2]||n[1]).replace(/\s+/g," ").toLowerCase()];if(!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return b(n,e,n[0],this.lexer)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s)return;if(s[3]&&n.match(/[\p{L}\p{N}]/u))return;if(!(s[1]||s[2]||"")||!n||this.rules.inline.punctuation.exec(n)){const n=[...s[0]].length-1;let r,i,l=n,o=0;const a="*"===s[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(a.lastIndex=0,t=t.slice(-1*e.length+n);null!=(s=a.exec(t));){if(r=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!r)continue;if(i=[...r].length,s[3]||s[4]){l+=i;continue}if((s[5]||s[6])&&n%3&&!((n+i)%3)){o+=i;continue}if(l-=i,l>0)continue;i=Math.min(i,i+l+o);const t=[...s[0]][0].length,a=e.slice(0,n+s.index+t+i);if(Math.min(n,i)%2){const e=a.slice(1,-1);return{type:"em",raw:a,text:e,tokens:this.lexer.inlineTokens(e)}}const c=a.slice(2,-2);return{type:"strong",raw:a,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g," ");const n=/[^ ]/.test(e),s=/^ /.test(e)&&/ $/.test(e);return n&&s&&(e=e.substring(1,e.length-1)),e=c(e,!0),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=c(t[1]),n="mailto:"+e):(e=c(t[1]),n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=c(t[0]),n="mailto:"+e;else{let s;do{s=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??""}while(s!==t[0]);e=c(t[0]),n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){let e;return e=this.lexer.state.inRawBlock?t[0]:c(t[0]),{type:"text",raw:t[0],text:e}}}}const m=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,y=/(?:[*+-]|\d{1,9}[.)])/,$=k(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,y).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),z=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,T=/(?!\s*\])(?:\\.|[^\[\]\\])+/,R=k(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",T).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),_=k(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,y).getRegex(),A="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",S=/|$))/,I=k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",S).replace("tag",A).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),E=k(z).replace("hr",m).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",A).getRegex(),q={blockquote:k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",E).getRegex(),code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,def:R,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:m,html:I,lheading:$,list:_,newline:/^(?: *(?:\n|$))+/,paragraph:E,table:f,text:/^[^\n]+/},Z=k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",m).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",A).getRegex(),L={...q,table:Z,paragraph:k(z).replace("hr",m).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Z).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",A).getRegex()},P={...q,html:k("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",S).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:f,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:k(z).replace("hr",m).replace("heading"," *#{1,6} *[^\n]").replace("lheading",$).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Q=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,v=/^( {2,}|\\)\n(?!\s*$)/,B="\\p{P}\\p{S}",C=k(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,B).getRegex(),M=k(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,B).getRegex(),O=k("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,B).getRegex(),D=k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,B).getRegex(),j=k(/\\([punct])/,"gu").replace(/punct/g,B).getRegex(),H=k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),U=k(S).replace("(?:--\x3e|$)","--\x3e").getRegex(),X=k("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",U).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),F=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,N=k(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",F).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),G=k(/^!?\[(label)\]\[(ref)\]/).replace("label",F).replace("ref",T).getRegex(),J=k(/^!?\[(ref)\](?:\[\])?/).replace("ref",T).getRegex(),K={_backpedal:f,anyPunctuation:j,autolink:H,blockSkip:/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,br:v,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:f,emStrongLDelim:M,emStrongRDelimAst:O,emStrongRDelimUnd:D,escape:Q,link:N,nolink:J,punctuation:C,reflink:G,reflinkSearch:k("reflink|nolink(?!\\()","g").replace("reflink",G).replace("nolink",J).getRegex(),tag:X,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\t+" ".repeat(n.length)));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((s=>!!(n=s.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.space(e))e=e.substring(n.raw.length),1===n.raw.length&&t.length>0?t[t.length-1].raw+="\n":t.push(n);else if(n=this.tokenizer.code(e))e=e.substring(n.raw.length),s=t[t.length-1],!s||"paragraph"!==s.type&&"text"!==s.type?t.push(n):(s.raw+="\n"+n.raw,s.text+="\n"+n.text,this.inlineQueue[this.inlineQueue.length-1].src=s.text);else if(n=this.tokenizer.fences(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.heading(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.hr(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.blockquote(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.list(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.html(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.def(e))e=e.substring(n.raw.length),s=t[t.length-1],!s||"paragraph"!==s.type&&"text"!==s.type?this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title}):(s.raw+="\n"+n.raw,s.text+="\n"+n.raw,this.inlineQueue[this.inlineQueue.length-1].src=s.text);else if(n=this.tokenizer.table(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.lheading(e))e=e.substring(n.raw.length),t.push(n);else{if(r=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let s;this.options.extensions.startBlock.forEach((e=>{s=e.call({lexer:this},n),"number"==typeof s&&s>=0&&(t=Math.min(t,s))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(this.state.top&&(n=this.tokenizer.paragraph(r)))s=t[t.length-1],i&&"paragraph"===s.type?(s.raw+="\n"+n.raw,s.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=s.text):t.push(n),i=r.length!==e.length,e=e.substring(n.raw.length);else if(n=this.tokenizer.text(e))e=e.substring(n.raw.length),s=t[t.length-1],s&&"text"===s.type?(s.raw+="\n"+n.raw,s.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=s.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,s,r,i,l,o,a=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(a));)e.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(a));)a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.anyPunctuation.exec(a));)a=a.slice(0,i.index)+"++"+a.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(l||(o=""),l=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((s=>!!(n=s.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),s=t[t.length-1],s&&"text"===n.type&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),s=t[t.length-1],s&&"text"===n.type&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,a,o))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e))){if(r=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let s;this.options.extensions.startInline.forEach((e=>{s=e.call({lexer:this},n),"number"==typeof s&&s>=0&&(t=Math.min(t,s))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(r))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(o=n.raw.slice(-1)),l=!0,s=t[t.length-1],s&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(n.raw.length),t.push(n);return t}}class se{options;constructor(t){this.options=t||e.defaults}code(e,t,n){const s=(t||"").match(/^\S*/)?.[0];return e=e.replace(/\n$/,"")+"\n",s?'
    '+(n?e:c(e,!0))+"
    \n":"
    "+(n?e:c(e,!0))+"
    \n"}blockquote(e){return`
    \n${e}
    \n`}html(e,t){return e}heading(e,t,n){return`${e}\n`}hr(){return"
    \n"}list(e,t,n){const s=t?"ol":"ul";return"<"+s+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"}listitem(e,t,n){return`
  • ${e}
  • \n`}checkbox(e){return"'}paragraph(e){return`

    ${e}

    \n`}table(e,t){return t&&(t=`${t}`),"\n\n"+e+"\n"+t+"
    \n"}tablerow(e){return`\n${e}\n`}tablecell(e,t){const n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`\n`}strong(e){return`${e}`}em(e){return`${e}`}codespan(e){return`${e}`}br(){return"
    "}del(e){return`${e}`}link(e,t,n){const s=g(e);if(null===s)return n;let r='
    ",r}image(e,t,n){const s=g(e);if(null===s)return n;let r=`${n}0&&"paragraph"===n.tokens[0].type?(n.tokens[0].text=e+" "+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&"text"===n.tokens[0].tokens[0].type&&(n.tokens[0].tokens[0].text=e+" "+n.tokens[0].tokens[0].text)):n.tokens.unshift({type:"text",text:e+" "}):o+=e+" "}o+=this.parse(n.tokens,i),l+=this.renderer.listitem(o,r,!!s)}n+=this.renderer.list(l,t,s);continue}case"html":{const e=r;n+=this.renderer.html(e.text,e.block);continue}case"paragraph":{const e=r;n+=this.renderer.paragraph(this.parseInline(e.tokens));continue}case"text":{let i=r,l=i.tokens?this.parseInline(i.tokens):i.text;for(;s+1{const r=e[s].flat(1/0);n=n.concat(this.walkTokens(r,t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{const n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){const n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let s=e.renderer.apply(this,t);return!1===s&&(s=n.apply(this,t)),s}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");const n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){const t=this.defaults.renderer||new se(this.defaults);for(const n in e.renderer){if(!(n in t))throw new Error(`renderer '${n}' does not exist`);if("options"===n)continue;const s=n,r=e.renderer[s],i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){const t=this.defaults.tokenizer||new w(this.defaults);for(const n in e.tokenizer){if(!(n in t))throw new Error(`tokenizer '${n}' does not exist`);if(["options","rules","lexer"].includes(n))continue;const s=n,r=e.tokenizer[s],i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){const t=this.defaults.hooks||new le;for(const n in e.hooks){if(!(n in t))throw new Error(`hook '${n}' does not exist`);if("options"===n)continue;const s=n,r=e.hooks[s],i=t[s];le.passThroughHooks.has(n)?t[s]=e=>{if(this.defaults.async)return Promise.resolve(r.call(t,e)).then((e=>i.call(t,e)));const n=r.call(t,e);return i.call(t,n)}:t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){const t=this.defaults.walkTokens,s=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(s.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ne.lex(e,t??this.defaults)}parser(e,t){return ie.parse(e,t??this.defaults)}#e(e,t){return(n,s)=>{const r={...s},i={...this.defaults,...r};!0===this.defaults.async&&!1===r.async&&(i.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),i.async=!0);const l=this.#t(!!i.silent,!!i.async);if(null==n)return l(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof n)return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(i.hooks&&(i.hooks.options=i),i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(n):n).then((t=>e(t,i))).then((e=>i.hooks?i.hooks.processAllTokens(e):e)).then((e=>i.walkTokens?Promise.all(this.walkTokens(e,i.walkTokens)).then((()=>e)):e)).then((e=>t(e,i))).then((e=>i.hooks?i.hooks.postprocess(e):e)).catch(l);try{i.hooks&&(n=i.hooks.preprocess(n));let s=e(n,i);i.hooks&&(s=i.hooks.processAllTokens(s)),i.walkTokens&&this.walkTokens(s,i.walkTokens);let r=t(s,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return l(e)}}}#t(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="

    An error occurred:

    "+c(n.message+"",!0)+"
    ";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}}const ae=new oe;function ce(e,t){return ae.parse(e,t)}ce.options=ce.setOptions=function(e){return ae.setOptions(e),ce.defaults=ae.defaults,n(ce.defaults),ce},ce.getDefaults=t,ce.defaults=e.defaults,ce.use=function(...e){return ae.use(...e),ce.defaults=ae.defaults,n(ce.defaults),ce},ce.walkTokens=function(e,t){return ae.walkTokens(e,t)},ce.parseInline=ae.parseInline,ce.Parser=ie,ce.parser=ie.parse,ce.Renderer=se,ce.TextRenderer=re,ce.Lexer=ne,ce.lexer=ne.lex,ce.Tokenizer=w,ce.Hooks=le,ce.parse=ce;const he=ce.options,pe=ce.setOptions,ue=ce.use,ke=ce.walkTokens,ge=ce.parseInline,fe=ce,de=ie.parse,xe=ne.lex;e.Hooks=le,e.Lexer=ne,e.Marked=oe,e.Parser=ie,e.Renderer=se,e.TextRenderer=re,e.Tokenizer=w,e.getDefaults=t,e.lexer=xe,e.marked=ce,e.options=he,e.parse=fe,e.parseInline=ge,e.parser=de,e.setOptions=pe,e.use=ue,e.walkTokens=ke})); \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/micromodal.min.js b/src/agentscope/studio/static/js_third_party/micromodal.min.js new file mode 100644 index 000000000..95563af4e --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/micromodal.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).MicroModal=t()}(this,(function(){"use strict";function e(e,t){for(var o=0;oe.length)&&(t=e.length);for(var o=0,n=new Array(t);o0&&this.registerTriggers.apply(this,t(a)),this.onClick=this.onClick.bind(this),this.onKeydown=this.onKeydown.bind(this)}var i,a,r;return i=o,(a=[{key:"registerTriggers",value:function(){for(var e=this,t=arguments.length,o=new Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:null;if(this.activeElement=document.activeElement,this.modal.setAttribute("aria-hidden","false"),this.modal.classList.add(this.config.openClass),this.scrollBehaviour("disable"),this.addEventListeners(),this.config.awaitOpenAnimation){var o=function t(){e.modal.removeEventListener("animationend",t,!1),e.setFocusToFirstNode()};this.modal.addEventListener("animationend",o,!1)}else this.setFocusToFirstNode();this.config.onShow(this.modal,this.activeElement,t)}},{key:"closeModal",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=this.modal;if(this.modal.setAttribute("aria-hidden","true"),this.removeEventListeners(),this.scrollBehaviour("enable"),this.activeElement&&this.activeElement.focus&&this.activeElement.focus(),this.config.onClose(this.modal,this.activeElement,e),this.config.awaitCloseAnimation){var o=this.config.openClass;this.modal.addEventListener("animationend",(function e(){t.classList.remove(o),t.removeEventListener("animationend",e,!1)}),!1)}else t.classList.remove(this.config.openClass)}},{key:"closeModalById",value:function(e){this.modal=document.getElementById(e),this.modal&&this.closeModal()}},{key:"scrollBehaviour",value:function(e){if(this.config.disableScroll){var t=document.querySelector("body");switch(e){case"enable":Object.assign(t.style,{overflow:""});break;case"disable":Object.assign(t.style,{overflow:"hidden"})}}}},{key:"addEventListeners",value:function(){this.modal.addEventListener("touchstart",this.onClick),this.modal.addEventListener("click",this.onClick),document.addEventListener("keydown",this.onKeydown)}},{key:"removeEventListeners",value:function(){this.modal.removeEventListener("touchstart",this.onClick),this.modal.removeEventListener("click",this.onClick),document.removeEventListener("keydown",this.onKeydown)}},{key:"onClick",value:function(e){(e.target.hasAttribute(this.config.closeTrigger)||e.target.parentNode.hasAttribute(this.config.closeTrigger))&&(e.preventDefault(),e.stopPropagation(),this.closeModal(e))}},{key:"onKeydown",value:function(e){27===e.keyCode&&this.closeModal(e),9===e.keyCode&&this.retainFocus(e)}},{key:"getFocusableNodes",value:function(){var e=this.modal.querySelectorAll(n);return Array.apply(void 0,t(e))}},{key:"setFocusToFirstNode",value:function(){var e=this;if(!this.config.disableFocus){var t=this.getFocusableNodes();if(0!==t.length){var o=t.filter((function(t){return!t.hasAttribute(e.config.closeTrigger)}));o.length>0&&o[0].focus(),0===o.length&&t[0].focus()}}}},{key:"retainFocus",value:function(e){var t=this.getFocusableNodes();if(0!==t.length)if(t=t.filter((function(e){return null!==e.offsetParent})),this.modal.contains(document.activeElement)){var o=t.indexOf(document.activeElement);e.shiftKey&&0===o&&(t[t.length-1].focus(),e.preventDefault()),!e.shiftKey&&t.length>0&&o===t.length-1&&(t[0].focus(),e.preventDefault())}else t[0].focus()}}])&&e(i.prototype,a),r&&e(i,r),o}(),a=null,r=function(e){if(!document.getElementById(e))return console.warn("MicroModal: ❗Seems like you have missed %c'".concat(e,"'"),"background-color: #f8f9fa;color: #50596c;font-weight: bold;","ID somewhere in your code. Refer example below to resolve it."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",'')),!1},s=function(e,t){if(function(e){e.length<=0&&(console.warn("MicroModal: ❗Please specify at least one %c'micromodal-trigger'","background-color: #f8f9fa;color: #50596c;font-weight: bold;","data attribute."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",'
    '))}(e),!t)return!0;for(var o in t)r(o);return!0},{init:function(e){var o=Object.assign({},{openTrigger:"data-micromodal-trigger"},e),n=t(document.querySelectorAll("[".concat(o.openTrigger,"]"))),r=function(e,t){var o=[];return e.forEach((function(e){var n=e.attributes[t].value;void 0===o[n]&&(o[n]=[]),o[n].push(e)})),o}(n,o.openTrigger);if(!0!==o.debugMode||!1!==s(n,r))for(var l in r){var c=r[l];o.targetModal=l,o.triggers=t(c),a=new i(o)}},show:function(e,t){var o=t||{};o.targetModal=e,!0===o.debugMode&&!1===r(e)||(a&&a.removeEventListeners(),(a=new i(o)).showModal())},close:function(e){e?a.closeModalById(e):a.closeModal()}});return"undefined"!=typeof window&&(window.MicroModal=l),l})); \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/monaco-editor.loader.js b/src/agentscope/studio/static/js_third_party/monaco-editor.loader.js new file mode 100644 index 000000000..4b486e29e --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/monaco-editor.loader.js @@ -0,0 +1,11 @@ +"use strict";/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.49.0(383fdf3fc0e1e1a024068b8d0fd4f3dcbae74d04) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/const _amdLoaderGlobal=this,_commonjsGlobal=typeof global=="object"?global:{};var AMDLoader;(function(u){u.global=_amdLoaderGlobal;class y{get isWindows(){return this._detect(),this._isWindows}get isNode(){return this._detect(),this._isNode}get isElectronRenderer(){return this._detect(),this._isElectronRenderer}get isWebWorker(){return this._detect(),this._isWebWorker}get isElectronNodeIntegrationWebWorker(){return this._detect(),this._isElectronNodeIntegrationWebWorker}constructor(){this._detected=!1,this._isWindows=!1,this._isNode=!1,this._isElectronRenderer=!1,this._isWebWorker=!1,this._isElectronNodeIntegrationWebWorker=!1}_detect(){this._detected||(this._detected=!0,this._isWindows=y._isWindows(),this._isNode=typeof module<"u"&&!!module.exports,this._isElectronRenderer=typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="renderer",this._isWebWorker=typeof u.global.importScripts=="function",this._isElectronNodeIntegrationWebWorker=this._isWebWorker&&typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="worker")}static _isWindows(){return typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0?!0:typeof process<"u"?process.platform==="win32":!1}}u.Environment=y})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(r,c,a){this.type=r,this.detail=c,this.timestamp=a}}u.LoaderEvent=y;class m{constructor(r){this._events=[new y(1,"",r)]}record(r,c){this._events.push(new y(r,c,u.Utilities.getHighPerformanceTimestamp()))}getEvents(){return this._events}}u.LoaderEventRecorder=m;class p{record(r,c){}getEvents(){return[]}}p.INSTANCE=new p,u.NullLoaderEventRecorder=p})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{static fileUriToFilePath(p,h){if(h=decodeURI(h).replace(/%23/g,"#"),p){if(/^file:\/\/\//.test(h))return h.substr(8);if(/^file:\/\//.test(h))return h.substr(5)}else if(/^file:\/\//.test(h))return h.substr(7);return h}static startsWith(p,h){return p.length>=h.length&&p.substr(0,h.length)===h}static endsWith(p,h){return p.length>=h.length&&p.substr(p.length-h.length)===h}static containsQueryString(p){return/^[^\#]*\?/gi.test(p)}static isAbsolutePath(p){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(p)}static forEachProperty(p,h){if(p){let r;for(r in p)p.hasOwnProperty(r)&&h(r,p[r])}}static isEmpty(p){let h=!0;return y.forEachProperty(p,()=>{h=!1}),h}static recursiveClone(p){if(!p||typeof p!="object"||p instanceof RegExp||!Array.isArray(p)&&Object.getPrototypeOf(p)!==Object.prototype)return p;let h=Array.isArray(p)?[]:{};return y.forEachProperty(p,(r,c)=>{c&&typeof c=="object"?h[r]=y.recursiveClone(c):h[r]=c}),h}static generateAnonymousModule(){return"===anonymous"+y.NEXT_ANONYMOUS_ID+++"==="}static isAnonymousModule(p){return y.startsWith(p,"===anonymous")}static getHighPerformanceTimestamp(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=u.global.performance&&typeof u.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?u.global.performance.now():Date.now()}}y.NEXT_ANONYMOUS_ID=1,y.PERFORMANCE_NOW_PROBED=!1,y.HAS_PERFORMANCE_NOW=!1,u.Utilities=y})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){function y(h){if(h instanceof Error)return h;const r=new Error(h.message||String(h)||"Unknown Error");return h.stack&&(r.stack=h.stack),r}u.ensureError=y;class m{static validateConfigurationOptions(r){function c(a){if(a.phase==="loading"){console.error('Loading "'+a.moduleId+'" failed'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}if(a.phase==="factory"){console.error('The factory function of "'+a.moduleId+'" has thrown an exception'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}}if(r=r||{},typeof r.baseUrl!="string"&&(r.baseUrl=""),typeof r.isBuild!="boolean"&&(r.isBuild=!1),typeof r.paths!="object"&&(r.paths={}),typeof r.config!="object"&&(r.config={}),typeof r.catchError>"u"&&(r.catchError=!1),typeof r.recordStats>"u"&&(r.recordStats=!1),typeof r.urlArgs!="string"&&(r.urlArgs=""),typeof r.onError!="function"&&(r.onError=c),Array.isArray(r.ignoreDuplicateModules)||(r.ignoreDuplicateModules=[]),r.baseUrl.length>0&&(u.Utilities.endsWith(r.baseUrl,"/")||(r.baseUrl+="/")),typeof r.cspNonce!="string"&&(r.cspNonce=""),typeof r.preferScriptTags>"u"&&(r.preferScriptTags=!1),r.nodeCachedData&&typeof r.nodeCachedData=="object"&&(typeof r.nodeCachedData.seed!="string"&&(r.nodeCachedData.seed="seed"),(typeof r.nodeCachedData.writeDelay!="number"||r.nodeCachedData.writeDelay<0)&&(r.nodeCachedData.writeDelay=1e3*7),!r.nodeCachedData.path||typeof r.nodeCachedData.path!="string")){const a=y(new Error("INVALID cached data configuration, 'path' MUST be set"));a.phase="configuration",r.onError(a),r.nodeCachedData=void 0}return r}static mergeConfigurationOptions(r=null,c=null){let a=u.Utilities.recursiveClone(c||{});return u.Utilities.forEachProperty(r,(t,e)=>{t==="ignoreDuplicateModules"&&typeof a.ignoreDuplicateModules<"u"?a.ignoreDuplicateModules=a.ignoreDuplicateModules.concat(e):t==="paths"&&typeof a.paths<"u"?u.Utilities.forEachProperty(e,(i,s)=>a.paths[i]=s):t==="config"&&typeof a.config<"u"?u.Utilities.forEachProperty(e,(i,s)=>a.config[i]=s):a[t]=u.Utilities.recursiveClone(e)}),m.validateConfigurationOptions(a)}}u.ConfigurationOptionsUtil=m;class p{constructor(r,c){if(this._env=r,this.options=m.mergeConfigurationOptions(c),this._createIgnoreDuplicateModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){let a=this.options.nodeRequire.main.filename,t=Math.max(a.lastIndexOf("/"),a.lastIndexOf("\\"));this.options.baseUrl=a.substring(0,t+1)}}_createIgnoreDuplicateModulesMap(){this.ignoreDuplicateModulesMap={};for(let r=0;r{Array.isArray(c)?this.sortedPathsRules.push({from:r,to:c}):this.sortedPathsRules.push({from:r,to:[c]})}),this.sortedPathsRules.sort((r,c)=>c.from.length-r.from.length)}cloneAndMerge(r){return new p(this._env,m.mergeConfigurationOptions(r,this.options))}getOptionsLiteral(){return this.options}_applyPaths(r){let c;for(let a=0,t=this.sortedPathsRules.length;athis.triggerCallback(i),d=>this.triggerErrorback(i,d))}triggerCallback(e){let i=this._callbackMap[e];delete this._callbackMap[e];for(let s=0;s{e.removeEventListener("load",l),e.removeEventListener("error",d)},l=o=>{n(),i()},d=o=>{n(),s(o)};e.addEventListener("load",l),e.addEventListener("error",d)}load(e,i,s,n){if(/^node\|/.test(i)){let l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=i.split("|"),_=null;try{_=d(o[1])}catch(f){n(f);return}e.enqueueDefineAnonymousModule([],()=>_),s()}else{let l=document.createElement("script");l.setAttribute("async","async"),l.setAttribute("type","text/javascript"),this.attachListeners(l,s,n);const{trustedTypesPolicy:d}=e.getConfig().getOptionsLiteral();d&&(i=d.createScriptURL(i)),l.setAttribute("src",i);const{cspNonce:o}=e.getConfig().getOptionsLiteral();o&&l.setAttribute("nonce",o),document.getElementsByTagName("head")[0].appendChild(l)}}}function p(t){const{trustedTypesPolicy:e}=t.getConfig().getOptionsLiteral();try{return(e?self.eval(e.createScript("","true")):new Function("true")).call(self),!0}catch{return!1}}class h{constructor(){this._cachedCanUseEval=null}_canUseEval(e){return this._cachedCanUseEval===null&&(this._cachedCanUseEval=p(e)),this._cachedCanUseEval}load(e,i,s,n){if(/^node\|/.test(i)){const l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=i.split("|");let _=null;try{_=d(o[1])}catch(f){n(f);return}e.enqueueDefineAnonymousModule([],function(){return _}),s()}else{const{trustedTypesPolicy:l}=e.getConfig().getOptionsLiteral();if(!(/^((http:)|(https:)|(file:))/.test(i)&&i.substring(0,self.origin.length)!==self.origin)&&this._canUseEval(e)){fetch(i).then(o=>{if(o.status!==200)throw new Error(o.statusText);return o.text()}).then(o=>{o=`${o} +//# sourceURL=${i}`,(l?self.eval(l.createScript("",o)):new Function(o)).call(self),s()}).then(void 0,n);return}try{l&&(i=l.createScriptURL(i)),importScripts(i),s()}catch(o){n(o)}}}}class r{constructor(e){this._env=e,this._didInitialize=!1,this._didPatchNodeRequire=!1}_init(e){this._didInitialize||(this._didInitialize=!0,this._fs=e("fs"),this._vm=e("vm"),this._path=e("path"),this._crypto=e("crypto"))}_initNodeRequire(e,i){const{nodeCachedData:s}=i.getConfig().getOptionsLiteral();if(!s||this._didPatchNodeRequire)return;this._didPatchNodeRequire=!0;const n=this,l=e("module");function d(o){const _=o.constructor;let f=function(v){try{return o.require(v)}finally{}};return f.resolve=function(v,E){return _._resolveFilename(v,o,!1,E)},f.resolve.paths=function(v){return _._resolveLookupPaths(v,o)},f.main=process.mainModule,f.extensions=_._extensions,f.cache=_._cache,f}l.prototype._compile=function(o,_){const f=l.wrap(o.replace(/^#!.*/,"")),g=i.getRecorder(),v=n._getCachedDataPath(s,_),E={filename:_};let I;try{const D=n._fs.readFileSync(v);I=D.slice(0,16),E.cachedData=D.slice(16),g.record(60,v)}catch{g.record(61,v)}const C=new n._vm.Script(f,E),P=C.runInThisContext(E),w=n._path.dirname(_),R=d(this),U=[this.exports,R,this,_,w,process,_commonjsGlobal,Buffer],b=P.apply(this.exports,U);return n._handleCachedData(C,f,v,!E.cachedData,i),n._verifyCachedData(C,f,v,I,i),b}}load(e,i,s,n){const l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=l.nodeInstrumenter||function(f){return f};this._init(d),this._initNodeRequire(d,e);let _=e.getRecorder();if(/^node\|/.test(i)){let f=i.split("|"),g=null;try{g=d(f[1])}catch(v){n(v);return}e.enqueueDefineAnonymousModule([],()=>g),s()}else{i=u.Utilities.fileUriToFilePath(this._env.isWindows,i);const f=this._path.normalize(i),g=this._getElectronRendererScriptPathOrUri(f),v=!!l.nodeCachedData,E=v?this._getCachedDataPath(l.nodeCachedData,i):void 0;this._readSourceAndCachedData(f,E,_,(I,C,P,w)=>{if(I){n(I);return}let R;C.charCodeAt(0)===r._BOM?R=r._PREFIX+C.substring(1)+r._SUFFIX:R=r._PREFIX+C+r._SUFFIX,R=o(R,f);const U={filename:g,cachedData:P},b=this._createAndEvalScript(e,R,U,s,n);this._handleCachedData(b,R,E,v&&!P,e),this._verifyCachedData(b,R,E,w,e)})}}_createAndEvalScript(e,i,s,n,l){const d=e.getRecorder();d.record(31,s.filename);const o=new this._vm.Script(i,s),_=o.runInThisContext(s),f=e.getGlobalAMDDefineFunc();let g=!1;const v=function(){return g=!0,f.apply(null,arguments)};return v.amd=f.amd,_.call(u.global,e.getGlobalAMDRequireFunc(),v,s.filename,this._path.dirname(s.filename)),d.record(32,s.filename),g?n():l(new Error(`Didn't receive define call in ${s.filename}!`)),o}_getElectronRendererScriptPathOrUri(e){if(!this._env.isElectronRenderer)return e;let i=e.match(/^([a-z])\:(.*)/i);return i?`file:///${(i[1].toUpperCase()+":"+i[2]).replace(/\\/g,"/")}`:`file://${e}`}_getCachedDataPath(e,i){const s=this._crypto.createHash("md5").update(i,"utf8").update(e.seed,"utf8").update(process.arch,"").digest("hex"),n=this._path.basename(i).replace(/\.js$/,"");return this._path.join(e.path,`${n}-${s}.code`)}_handleCachedData(e,i,s,n,l){e.cachedDataRejected?this._fs.unlink(s,d=>{l.getRecorder().record(62,s),this._createAndWriteCachedData(e,i,s,l),d&&l.getConfig().onError(d)}):n&&this._createAndWriteCachedData(e,i,s,l)}_createAndWriteCachedData(e,i,s,n){let l=Math.ceil(n.getConfig().getOptionsLiteral().nodeCachedData.writeDelay*(1+Math.random())),d=-1,o=0,_;const f=()=>{setTimeout(()=>{_||(_=this._crypto.createHash("md5").update(i,"utf8").digest());const g=e.createCachedData();if(!(g.length===0||g.length===d||o>=5)){if(g.length{v&&n.getConfig().onError(v),n.getRecorder().record(63,s),f()})}},l*Math.pow(4,o++))};f()}_readSourceAndCachedData(e,i,s,n){if(!i)this._fs.readFile(e,{encoding:"utf8"},n);else{let l,d,o,_=2;const f=g=>{g?n(g):--_===0&&n(void 0,l,d,o)};this._fs.readFile(e,{encoding:"utf8"},(g,v)=>{l=v,f(g)}),this._fs.readFile(i,(g,v)=>{!g&&v&&v.length>0?(o=v.slice(0,16),d=v.slice(16),s.record(60,i)):s.record(61,i),f()})}}_verifyCachedData(e,i,s,n,l){n&&(e.cachedDataRejected||setTimeout(()=>{const d=this._crypto.createHash("md5").update(i,"utf8").digest();n.equals(d)||(l.getConfig().onError(new Error(`FAILED TO VERIFY CACHED DATA, deleting stale '${s}' now, but a RESTART IS REQUIRED`)),this._fs.unlink(s,o=>{o&&l.getConfig().onError(o)}))},Math.ceil(5e3*(1+Math.random()))))}}r._BOM=65279,r._PREFIX="(function (require, define, __filename, __dirname) { ",r._SUFFIX=` +});`;function c(t,e){if(e.__$__isRecorded)return e;const i=function(n){t.record(33,n);try{return e(n)}finally{t.record(34,n)}};return i.__$__isRecorded=!0,i}u.ensureRecordedNodeRequire=c;function a(t){return new y(t)}u.createScriptLoader=a})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(t){let e=t.lastIndexOf("/");e!==-1?this.fromModulePath=t.substr(0,e+1):this.fromModulePath=""}static _normalizeModuleId(t){let e=t,i;for(i=/\/\.\//;i.test(e);)e=e.replace(i,"/");for(e=e.replace(/^\.\//g,""),i=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;i.test(e);)e=e.replace(i,"/");return e=e.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),e}resolveModule(t){let e=t;return u.Utilities.isAbsolutePath(e)||(u.Utilities.startsWith(e,"./")||u.Utilities.startsWith(e,"../"))&&(e=y._normalizeModuleId(this.fromModulePath+e)),e}}y.ROOT=new y(""),u.ModuleIdResolver=y;class m{constructor(t,e,i,s,n,l){this.id=t,this.strId=e,this.dependencies=i,this._callback=s,this._errorback=n,this.moduleIdResolver=l,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}static _safeInvokeFunction(t,e){try{return{returnedValue:t.apply(u.global,e),producedError:null}}catch(i){return{returnedValue:null,producedError:i}}}static _invokeFactory(t,e,i,s){return t.shouldInvokeFactory(e)?t.shouldCatchError()?this._safeInvokeFunction(i,s):{returnedValue:i.apply(u.global,s),producedError:null}:{returnedValue:null,producedError:null}}complete(t,e,i,s){this._isComplete=!0;let n=null;if(this._callback)if(typeof this._callback=="function"){t.record(21,this.strId);let l=m._invokeFactory(e,this.strId,this._callback,i);n=l.producedError,t.record(22,this.strId),!n&&typeof l.returnedValue<"u"&&(!this.exportsPassedIn||u.Utilities.isEmpty(this.exports))&&(this.exports=l.returnedValue)}else this.exports=this._callback;if(n){let l=u.ensureError(n);l.phase="factory",l.moduleId=this.strId,l.neededBy=s(this.id),this.error=l,e.onError(l)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null}onDependencyError(t){return this._isComplete=!0,this.error=t,this._errorback?(this._errorback(t),!0):!1}isComplete(){return this._isComplete}}u.Module=m;class p{constructor(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}getMaxModuleId(){return this._nextId}getModuleId(t){let e=this._strModuleIdToIntModuleId.get(t);return typeof e>"u"&&(e=this._nextId++,this._strModuleIdToIntModuleId.set(t,e),this._intModuleIdToStrModuleId[e]=t),e}getStrModuleId(t){return this._intModuleIdToStrModuleId[t]}}class h{constructor(t){this.id=t}}h.EXPORTS=new h(0),h.MODULE=new h(1),h.REQUIRE=new h(2),u.RegularDependency=h;class r{constructor(t,e,i){this.id=t,this.pluginId=e,this.pluginParam=i}}u.PluginDependency=r;class c{constructor(t,e,i,s,n=0){this._env=t,this._scriptLoader=e,this._loaderAvailableTimestamp=n,this._defineFunc=i,this._requireFunc=s,this._moduleIdProvider=new p,this._config=new u.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[],this._requireFunc.moduleManager=this}reset(){return new c(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)}getGlobalAMDDefineFunc(){return this._defineFunc}getGlobalAMDRequireFunc(){return this._requireFunc}static _findRelevantLocationInStack(t,e){let i=l=>l.replace(/\\/g,"/"),s=i(t),n=e.split(/\n/);for(let l=0;lthis._moduleIdProvider.getStrModuleId(_.id))),this._resolve(o)}_normalizeDependency(t,e){if(t==="exports")return h.EXPORTS;if(t==="module")return h.MODULE;if(t==="require")return h.REQUIRE;let i=t.indexOf("!");if(i>=0){let s=e.resolveModule(t.substr(0,i)),n=e.resolveModule(t.substr(i+1)),l=this._moduleIdProvider.getModuleId(s+"!"+n),d=this._moduleIdProvider.getModuleId(s);return new r(l,d,n)}return new h(this._moduleIdProvider.getModuleId(e.resolveModule(t)))}_normalizeDependencies(t,e){let i=[],s=0;for(let n=0,l=t.length;nthis._moduleIdProvider.getStrModuleId(l));const n=u.ensureError(e);return n.phase="loading",n.moduleId=i,n.neededBy=s,n}_onLoadError(t,e){const i=this._createLoadError(t,e);this._modules2[t]||(this._modules2[t]=new m(t,this._moduleIdProvider.getStrModuleId(t),[],()=>{},null,null));let s=[];for(let d=0,o=this._moduleIdProvider.getMaxModuleId();d0;){let d=l.shift(),o=this._modules2[d];o&&(n=o.onDependencyError(i)||n);let _=this._inverseDependencies2[d];if(_)for(let f=0,g=_.length;f0;){let d=n.shift().dependencies;if(d)for(let o=0,_=d.length;o<_;o++){let f=d[o];if(f.id===e)return!0;let g=this._modules2[f.id];g&&!s[f.id]&&(s[f.id]=!0,n.push(g))}}return!1}_findCyclePath(t,e,i){if(t===e||i===50)return[t];let s=this._modules2[t];if(!s)return null;let n=s.dependencies;if(n)for(let l=0,d=n.length;lthis._relativeRequire(t,i,s,n);return e.toUrl=i=>this._config.requireToUrl(t.resolveModule(i)),e.getStats=()=>this.getLoaderEvents(),e.hasDependencyCycle=()=>this._hasDependencyCycle,e.config=(i,s=!1)=>{this.configure(i,s)},e.__$__nodeRequire=u.global.nodeRequire,e}_loadModule(t){if(this._modules2[t]||this._knownModules2[t])return;this._knownModules2[t]=!0;let e=this._moduleIdProvider.getStrModuleId(t),i=this._config.moduleIdToPaths(e),s=/^@[^\/]+\/[^\/]+$/;this._env.isNode&&(e.indexOf("/")===-1||s.test(e))&&i.push("node|"+e);let n=-1,l=d=>{if(n++,n>=i.length)this._onLoadError(t,d);else{let o=i[n],_=this.getRecorder();if(this._config.isBuild()&&o==="empty:"){this._buildInfoPath[t]=o,this.defineModule(this._moduleIdProvider.getStrModuleId(t),[],null,null,null),this._onLoad(t);return}_.record(10,o),this._scriptLoader.load(this,o,()=>{this._config.isBuild()&&(this._buildInfoPath[t]=o),_.record(11,o),this._onLoad(t)},f=>{_.record(12,o),l(f)})}};l(null)}_loadPluginDependency(t,e){if(this._modules2[e.id]||this._knownModules2[e.id])return;this._knownModules2[e.id]=!0;let i=s=>{this.defineModule(this._moduleIdProvider.getStrModuleId(e.id),[],s,null,null)};i.error=s=>{this._config.onError(this._createLoadError(e.id,s))},t.load(e.pluginParam,this._createRequire(y.ROOT),i,this._config.getOptionsLiteral())}_resolve(t){let e=t.dependencies;if(e)for(let i=0,s=e.length;ithis._moduleIdProvider.getStrModuleId(o)).join(` => +`)),t.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[n.id]=this._inverseDependencies2[n.id]||[],this._inverseDependencies2[n.id].push(t.id),n instanceof r){let d=this._modules2[n.pluginId];if(d&&d.isComplete()){this._loadPluginDependency(d.exports,n);continue}let o=this._inversePluginDependencies2.get(n.pluginId);o||(o=[],this._inversePluginDependencies2.set(n.pluginId,o)),o.push(n),this._loadModule(n.pluginId);continue}this._loadModule(n.id)}t.unresolvedDependenciesCount===0&&this._onModuleComplete(t)}_onModuleComplete(t){let e=this.getRecorder();if(t.isComplete())return;let i=t.dependencies,s=[];if(i)for(let o=0,_=i.length;o<_;o++){let f=i[o];if(f===h.EXPORTS){s[o]=t.exports;continue}if(f===h.MODULE){s[o]={id:t.strId,config:()=>this._config.getConfigForModule(t.strId)};continue}if(f===h.REQUIRE){s[o]=this._createRequire(t.moduleIdResolver);continue}let g=this._modules2[f.id];if(g){s[o]=g.exports;continue}s[o]=null}const n=o=>(this._inverseDependencies2[o]||[]).map(_=>this._moduleIdProvider.getStrModuleId(_));t.complete(e,this._config,s,n);let l=this._inverseDependencies2[t.id];if(this._inverseDependencies2[t.id]=null,l)for(let o=0,_=l.length;o<_;o++){let f=l[o],g=this._modules2[f];g.unresolvedDependenciesCount--,g.unresolvedDependenciesCount===0&&this._onModuleComplete(g)}let d=this._inversePluginDependencies2.get(t.id);if(d){this._inversePluginDependencies2.delete(t.id);for(let o=0,_=d.length;o<_;o++)this._loadPluginDependency(t.exports,d[o])}}}u.ModuleManager=c})(AMDLoader||(AMDLoader={}));var define,AMDLoader;(function(u){const y=new u.Environment;let m=null;const p=function(a,t,e){typeof a!="string"&&(e=t,t=a,a=null),(typeof t!="object"||!Array.isArray(t))&&(e=t,t=null),t||(t=["require","exports","module"]),a?m.defineModule(a,t,e,null,null):m.enqueueDefineAnonymousModule(t,e)};p.amd={jQuery:!0};const h=function(a,t=!1){m.configure(a,t)},r=function(){if(arguments.length===1){if(arguments[0]instanceof Object&&!Array.isArray(arguments[0])){h(arguments[0]);return}if(typeof arguments[0]=="string")return m.synchronousRequire(arguments[0])}if((arguments.length===2||arguments.length===3)&&Array.isArray(arguments[0])){m.defineModule(u.Utilities.generateAnonymousModule(),arguments[0],arguments[1],arguments[2],null);return}throw new Error("Unrecognized require call")};r.config=h,r.getConfig=function(){return m.getConfig().getOptionsLiteral()},r.reset=function(){m=m.reset()},r.getBuildInfo=function(){return m.getBuildInfo()},r.getStats=function(){return m.getLoaderEvents()},r.define=p;function c(){if(typeof u.global.require<"u"||typeof require<"u"){const a=u.global.require||require;if(typeof a=="function"&&typeof a.resolve=="function"){const t=u.ensureRecordedNodeRequire(m.getRecorder(),a);u.global.nodeRequire=t,r.nodeRequire=t,r.__$__nodeRequire=t}}y.isNode&&!y.isElectronRenderer&&!y.isElectronNodeIntegrationWebWorker?module.exports=r:(y.isElectronRenderer||(u.global.define=p),u.global.require=r)}u.init=c,(typeof u.global.define!="function"||!u.global.define.amd)&&(m=new u.ModuleManager(y,u.createScriptLoader(y),p,r,u.Utilities.getHighPerformanceTimestamp()),typeof u.global.require<"u"&&typeof u.global.require!="function"&&r.config(u.global.require),define=function(){return p.apply(null,arguments)},define.amd=p.amd,typeof doNotInitLoader>"u"&&c())})(AMDLoader||(AMDLoader={})); + +//# sourceMappingURL=../../min-maps/vs/loader.js.map \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/prism-line-numbers.min.js b/src/agentscope/studio/static/js_third_party/prism-line-numbers.min.js new file mode 100644 index 000000000..1f12d2d47 --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/prism-line-numbers.min.js @@ -0,0 +1 @@ +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e="line-numbers",n=/\n(?!$)/g,t=Prism.plugins.lineNumbers={getLine:function(n,t){if("PRE"===n.tagName&&n.classList.contains(e)){var i=n.querySelector(".line-numbers-rows");if(i){var r=parseInt(n.getAttribute("data-start"),10)||1,s=r+(i.children.length-1);ts&&(t=s);var l=t-r;return i.children[l]}}},resize:function(e){r([e])},assumeViewportIndependence:!0},i=void 0;window.addEventListener("resize",(function(){t.assumeViewportIndependence&&i===window.innerWidth||(i=window.innerWidth,r(Array.prototype.slice.call(document.querySelectorAll("pre.line-numbers"))))})),Prism.hooks.add("complete",(function(t){if(t.code){var i=t.element,s=i.parentNode;if(s&&/pre/i.test(s.nodeName)&&!i.querySelector(".line-numbers-rows")&&Prism.util.isActive(i,e)){i.classList.remove(e),s.classList.add(e);var l,o=t.code.match(n),a=o?o.length+1:1,u=new Array(a+1).join("");(l=document.createElement("span")).setAttribute("aria-hidden","true"),l.className="line-numbers-rows",l.innerHTML=u,s.hasAttribute("data-start")&&(s.style.counterReset="linenumber "+(parseInt(s.getAttribute("data-start"),10)-1)),t.element.appendChild(l),r([s]),Prism.hooks.run("line-numbers",t)}}})),Prism.hooks.add("line-numbers",(function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}))}function r(e){if(0!=(e=e.filter((function(e){var n,t=(n=e,n?window.getComputedStyle?getComputedStyle(n):n.currentStyle||null:null)["white-space"];return"pre-wrap"===t||"pre-line"===t}))).length){var t=e.map((function(e){var t=e.querySelector("code"),i=e.querySelector(".line-numbers-rows");if(t&&i){var r=e.querySelector(".line-numbers-sizer"),s=t.textContent.split(n);r||((r=document.createElement("span")).className="line-numbers-sizer",t.appendChild(r)),r.innerHTML="0",r.style.display="block";var l=r.getBoundingClientRect().height;return r.innerHTML="",{element:e,lines:s,lineHeights:[],oneLinerHeight:l,sizer:r}}})).filter(Boolean);t.forEach((function(e){var n=e.sizer,t=e.lines,i=e.lineHeights,r=e.oneLinerHeight;i[t.length-1]=void 0,t.forEach((function(e,t){if(e&&e.length>1){var s=n.appendChild(document.createElement("span"));s.style.display="block",s.textContent=e}else i[t]=r}))})),t.forEach((function(e){for(var n=e.sizer,t=e.lineHeights,i=0,r=0;r]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/prism.min.js b/src/agentscope/studio/static/js_third_party/prism.min.js new file mode 100644 index 000000000..49715fa91 --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/prism.min.js @@ -0,0 +1 @@ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(o){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,e={},j={manual:o.Prism&&o.Prism.manual,disableWorkerMessageHandler:o.Prism&&o.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof C?new C(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=i.reach);y+=b.value.length,b=b.next){var v=b.value;if(n.length>t.length)return;if(!(v instanceof C)){var F,x=1;if(m){if(!(F=L(f,y,t,p))||F.index>=t.length)break;var k=F.index,w=F.index+F[0].length,A=y;for(A+=b.value.length;A<=k;)b=b.next,A+=b.value.length;if(A-=b.value.length,y=A,b.value instanceof C)continue;for(var P=b;P!==n.tail&&(Ai.reach&&(i.reach=v),b.prev),S=(S&&(_=z(n,_,S),y+=S.length),O(n,_,x),new C(l,d?j.tokenize($,d):$,h,$));b=z(n,_,S),E&&z(n,b,E),1i.reach&&(i.reach=$.reach))}}}}}(e,r,t,r.head,0),r),i=[],l=s.head.next;l!==s.tail;)i.push(l.value),l=l.next;return i},hooks:{all:{},add:function(e,t){var n=j.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=j.hooks.all[e];if(n&&n.length)for(var a,r=0;a=n[r++];)a(t)}},Token:C};function C(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function L(e,t,n,a){e.lastIndex=t;t=e.exec(n);return t&&a&&t[1]&&(e=t[1].length,t.index+=e,t[0]=t[0].slice(e)),t}function u(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function z(e,t,n){var a=t.next,n={value:n,prev:t,next:a};return t.next=n,a.prev=n,e.length++,n}function O(e,t,n){for(var a=t.next,r=0;r"+s.content+""},!o.document)return o.addEventListener&&(j.disableWorkerMessageHandler||o.addEventListener("message",function(e){var e=JSON.parse(e.data),t=e.language,n=e.code,e=e.immediateClose;o.postMessage(j.highlight(n,j.languages[t],t)),e&&o.close()},!1)),j;var a,e=j.util.currentScript();function r(){j.manual||j.highlightAll()}return e&&(j.filename=e.src,e.hasAttribute("data-manual")&&(j.manual=!0)),j.manual||("loading"===(a=document.readyState)||"interactive"===a&&e&&e.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),j}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var n={},n=(n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^$/i,{"included-cdata":{pattern://i,inside:n}}),t=(n["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]},{});t[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,t){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:Prism.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup);t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,function(){var o,u,g,c,e;void 0!==Prism&&"undefined"!=typeof document&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),o={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},c="pre[data-src]:not(["+(u="data-src-status")+'="loaded"]):not(['+u+'="'+(g="loading")+'"])',Prism.hooks.add("before-highlightall",function(e){e.selector+=", "+c}),Prism.hooks.add("before-sanity-check",function(e){var r,t,n,a,s,i,l=e.element;l.matches(c)&&(e.code="",l.setAttribute(u,g),(r=l.appendChild(document.createElement("CODE"))).textContent="Loading…",t=l.getAttribute("data-src"),"none"===(e=e.language)&&(n=(/\.(\w+)$/.exec(t)||[,"none"])[1],e=o[n]||n),Prism.util.setLanguage(r,e),Prism.util.setLanguage(l,e),(n=Prism.plugins.autoloader)&&n.loadLanguages(e),n=t,a=function(e){l.setAttribute(u,"loaded");var t,n,a=function(e){var t,n;if(e=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||""))return t=Number(e[1]),n=e[2],e=e[3],n?e?[t,Number(e)]:[t,void 0]:[t,t]}(l.getAttribute("data-range"));a&&(t=e.split(/\r\n?|\n/g),n=a[0],a=null==a[1]?t.length:a[1],n<0&&(n+=t.length),n=Math.max(0,Math.min(n-1,t.length)),a<0&&(a+=t.length),a=Math.max(0,Math.min(a,t.length)),e=t.slice(n,a).join("\n"),l.hasAttribute("data-start")||l.setAttribute("data-start",String(n+1))),r.textContent=e,Prism.highlightElement(r)},s=function(e){l.setAttribute(u,"failed"),r.textContent=e},(i=new XMLHttpRequest).open("GET",n,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?a(i.responseText):400<=i.status?s("✖ Error "+i.status+" while fetching file: "+i.statusText):s("✖ Error: File does not exist or is empty"))},i.send(null))}),e=!(Prism.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(c),a=0;t=n[a++];)Prism.highlightElement(t)}}),Prism.fileHighlight=function(){e||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),e=!0),Prism.plugins.fileHighlight.highlight.apply(this,arguments)})}(); \ No newline at end of file diff --git a/src/agentscope/studio/static/js_third_party/socket.io.js b/src/agentscope/studio/static/js_third_party/socket.io.js new file mode 100644 index 000000000..be040c4ac --- /dev/null +++ b/src/agentscope/studio/static/js_third_party/socket.io.js @@ -0,0 +1,7919 @@ +/*! + * Socket.IO v3.1.3 + * (c) 2014-2021 Guillermo Rauch + * Released under the MIT License. + */ +(function webpackUniversalModuleDefinition(root, factory) { + if (typeof exports === "object" && typeof module === "object") + module.exports = factory(); + else if (typeof define === "function" && define.amd) define([], factory); + else if (typeof exports === "object") exports["io"] = factory(); + else root["io"] = factory(); +})(self, function () { + return /******/ (function (modules) { + // webpackBootstrap + /******/ // The module cache + /******/ var installedModules = {}; + /******/ + /******/ // The require function + /******/ function __webpack_require__(moduleId) { + /******/ + /******/ // Check if module is in cache + /******/ if (installedModules[moduleId]) { + /******/ return installedModules[moduleId].exports; + /******/ + } + /******/ // Create a new module (and put it into the cache) + /******/ var module = (installedModules[moduleId] = { + /******/ i: moduleId, + /******/ l: false, + /******/ exports: {}, + /******/ + }); + /******/ + /******/ // Execute the module function + /******/ modules[moduleId].call( + module.exports, + module, + module.exports, + __webpack_require__ + ); + /******/ + /******/ // Flag the module as loaded + /******/ module.l = true; + /******/ + /******/ // Return the exports of the module + /******/ return module.exports; + /******/ + } + /******/ + /******/ + /******/ // expose the modules object (__webpack_modules__) + /******/ __webpack_require__.m = modules; + /******/ + /******/ // expose the module cache + /******/ __webpack_require__.c = installedModules; + /******/ + /******/ // define getter function for harmony exports + /******/ __webpack_require__.d = function (exports, name, getter) { + /******/ if (!__webpack_require__.o(exports, name)) { + /******/ Object.defineProperty(exports, name, { + enumerable: true, + get: getter, + }); + /******/ + } + /******/ + }; + /******/ + /******/ // define __esModule on exports + /******/ __webpack_require__.r = function (exports) { + /******/ if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + /******/ Object.defineProperty(exports, Symbol.toStringTag, { + value: "Module", + }); + /******/ + } + /******/ Object.defineProperty(exports, "__esModule", { value: true }); + /******/ + }; + /******/ + /******/ // create a fake namespace object + /******/ // mode & 1: value is a module id, require it + /******/ // mode & 2: merge all properties of value into the ns + /******/ // mode & 4: return value when already ns object + /******/ // mode & 8|1: behave like require + /******/ __webpack_require__.t = function (value, mode) { + /******/ if (mode & 1) value = __webpack_require__(value); + /******/ if (mode & 8) return value; + /******/ if ( + mode & 4 && + typeof value === "object" && + value && + value.__esModule + ) + return value; + /******/ var ns = Object.create(null); + /******/ __webpack_require__.r(ns); + /******/ Object.defineProperty(ns, "default", { + enumerable: true, + value: value, + }); + /******/ if (mode & 2 && typeof value != "string") + for (var key in value) + __webpack_require__.d( + ns, + key, + function (key) { + return value[key]; + }.bind(null, key) + ); + /******/ return ns; + /******/ + }; + /******/ + /******/ // getDefaultExport function for compatibility with non-harmony modules + /******/ __webpack_require__.n = function (module) { + /******/ var getter = + module && module.__esModule + ? /******/ function getDefault() { + return module["default"]; + } + : /******/ function getModuleExports() { + return module; + }; + /******/ __webpack_require__.d(getter, "a", getter); + /******/ return getter; + /******/ + }; + /******/ + /******/ // Object.prototype.hasOwnProperty.call + /******/ __webpack_require__.o = function (object, property) { + return Object.prototype.hasOwnProperty.call(object, property); + }; + /******/ + /******/ // __webpack_public_path__ + /******/ __webpack_require__.p = ""; + /******/ + /******/ + /******/ // Load entry module and return exports + /******/ return __webpack_require__( + (__webpack_require__.s = "./build/index.js") + ); + /******/ + })( + /************************************************************************/ + /******/ { + /***/ "./build/index.js": + /*!************************!*\ + !*** ./build/index.js ***! + \************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + "use strict"; + + function _typeof(obj) { + "@babel/helpers - typeof"; + if ( + typeof Symbol === "function" && + typeof Symbol.iterator === "symbol" + ) { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && + typeof Symbol === "function" && + obj.constructor === Symbol && + obj !== Symbol.prototype + ? "symbol" + : typeof obj; + }; + } + return _typeof(obj); + } + + Object.defineProperty(exports, "__esModule", { + value: true, + }); + exports.Socket = + exports.io = + exports.Manager = + exports.protocol = + void 0; + + var url_1 = __webpack_require__(/*! ./url */ "./build/url.js"); + + var manager_1 = __webpack_require__( + /*! ./manager */ "./build/manager.js" + ); + + var socket_1 = __webpack_require__( + /*! ./socket */ "./build/socket.js" + ); + + Object.defineProperty(exports, "Socket", { + enumerable: true, + get: function get() { + return socket_1.Socket; + }, + }); + + var debug = __webpack_require__( + /*! debug */ "./node_modules/debug/src/browser.js" + )("socket.io-client"); + /** + * Module exports. + */ + + module.exports = exports = lookup; + /** + * Managers cache. + */ + + var cache = (exports.managers = {}); + + function lookup(uri, opts) { + if (_typeof(uri) === "object") { + opts = uri; + uri = undefined; + } + + opts = opts || {}; + var parsed = url_1.url(uri, opts.path); + var source = parsed.source; + var id = parsed.id; + var path = parsed.path; + var sameNamespace = cache[id] && path in cache[id]["nsps"]; + var newConnection = + opts.forceNew || + opts["force new connection"] || + false === opts.multiplex || + sameNamespace; + var io; + + if (newConnection) { + debug("ignoring socket cache for %s", source); + io = new manager_1.Manager(source, opts); + } else { + if (!cache[id]) { + debug("new io instance for %s", source); + cache[id] = new manager_1.Manager(source, opts); + } + + io = cache[id]; + } + + if (parsed.query && !opts.query) { + opts.query = parsed.queryKey; + } + + return io.socket(parsed.path, opts); + } + + exports.io = lookup; + /** + * Protocol version. + * + * @public + */ + + var socket_io_parser_1 = __webpack_require__( + /*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js" + ); + + Object.defineProperty(exports, "protocol", { + enumerable: true, + get: function get() { + return socket_io_parser_1.protocol; + }, + }); + /** + * `connect`. + * + * @param {String} uri + * @public + */ + + exports.connect = lookup; + /** + * Expose constructors for standalone build. + * + * @public + */ + + var manager_2 = __webpack_require__( + /*! ./manager */ "./build/manager.js" + ); + + Object.defineProperty(exports, "Manager", { + enumerable: true, + get: function get() { + return manager_2.Manager; + }, + }); + + /***/ + }, + + /***/ "./build/manager.js": + /*!**************************!*\ + !*** ./build/manager.js ***! + \**************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + "use strict"; + + function _typeof(obj) { + "@babel/helpers - typeof"; + if ( + typeof Symbol === "function" && + typeof Symbol.iterator === "symbol" + ) { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && + typeof Symbol === "function" && + obj.constructor === Symbol && + obj !== Symbol.prototype + ? "symbol" + : typeof obj; + }; + } + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); + } + + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError( + "Super expression must either be null or a function" + ); + } + subClass.prototype = Object.create( + superClass && superClass.prototype, + { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + } + ); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = + Object.setPrototypeOf || + function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + + function _possibleConstructorReturn(self, call) { + if ( + call && + (_typeof(call) === "object" || typeof call === "function") + ) { + return call; + } + return _assertThisInitialized(self); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + } + return self; + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call( + Reflect.construct(Date, [], function () {}) + ); + return true; + } catch (e) { + return false; + } + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + Object.defineProperty(exports, "__esModule", { + value: true, + }); + exports.Manager = void 0; + + var eio = __webpack_require__( + /*! engine.io-client */ "./node_modules/engine.io-client/lib/index.js" + ); + + var socket_1 = __webpack_require__( + /*! ./socket */ "./build/socket.js" + ); + + var Emitter = __webpack_require__( + /*! component-emitter */ "./node_modules/component-emitter/index.js" + ); + + var parser = __webpack_require__( + /*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js" + ); + + var on_1 = __webpack_require__(/*! ./on */ "./build/on.js"); + + var Backoff = __webpack_require__( + /*! backo2 */ "./node_modules/backo2/index.js" + ); + + var debug = __webpack_require__( + /*! debug */ "./node_modules/debug/src/browser.js" + )("socket.io-client:manager"); + + var Manager = /*#__PURE__*/ (function (_Emitter) { + _inherits(Manager, _Emitter); + + var _super = _createSuper(Manager); + + function Manager(uri, opts) { + var _this; + + _classCallCheck(this, Manager); + + _this = _super.call(this); + _this.nsps = {}; + _this.subs = []; + + if (uri && "object" === _typeof(uri)) { + opts = uri; + uri = undefined; + } + + opts = opts || {}; + opts.path = opts.path || "/socket.io"; + _this.opts = opts; + + _this.reconnection(opts.reconnection !== false); + + _this.reconnectionAttempts(opts.reconnectionAttempts || Infinity); + + _this.reconnectionDelay(opts.reconnectionDelay || 1000); + + _this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000); + + _this.randomizationFactor(opts.randomizationFactor || 0.5); + + _this.backoff = new Backoff({ + min: _this.reconnectionDelay(), + max: _this.reconnectionDelayMax(), + jitter: _this.randomizationFactor(), + }); + + _this.timeout(null == opts.timeout ? 20000 : opts.timeout); + + _this._readyState = "closed"; + _this.uri = uri; + + var _parser = opts.parser || parser; + + _this.encoder = new _parser.Encoder(); + _this.decoder = new _parser.Decoder(); + _this._autoConnect = opts.autoConnect !== false; + if (_this._autoConnect) _this.open(); + return _this; + } + + _createClass(Manager, [ + { + key: "reconnection", + value: function reconnection(v) { + if (!arguments.length) return this._reconnection; + this._reconnection = !!v; + return this; + }, + }, + { + key: "reconnectionAttempts", + value: function reconnectionAttempts(v) { + if (v === undefined) return this._reconnectionAttempts; + this._reconnectionAttempts = v; + return this; + }, + }, + { + key: "reconnectionDelay", + value: function reconnectionDelay(v) { + var _a; + + if (v === undefined) return this._reconnectionDelay; + this._reconnectionDelay = v; + (_a = this.backoff) === null || _a === void 0 + ? void 0 + : _a.setMin(v); + return this; + }, + }, + { + key: "randomizationFactor", + value: function randomizationFactor(v) { + var _a; + + if (v === undefined) return this._randomizationFactor; + this._randomizationFactor = v; + (_a = this.backoff) === null || _a === void 0 + ? void 0 + : _a.setJitter(v); + return this; + }, + }, + { + key: "reconnectionDelayMax", + value: function reconnectionDelayMax(v) { + var _a; + + if (v === undefined) return this._reconnectionDelayMax; + this._reconnectionDelayMax = v; + (_a = this.backoff) === null || _a === void 0 + ? void 0 + : _a.setMax(v); + return this; + }, + }, + { + key: "timeout", + value: function timeout(v) { + if (!arguments.length) return this._timeout; + this._timeout = v; + return this; + }, + /** + * Starts trying to reconnect if reconnection is enabled and we have not + * started reconnecting yet + * + * @private + */ + }, + { + key: "maybeReconnectOnOpen", + value: function maybeReconnectOnOpen() { + // Only try to reconnect if it's the first time we're connecting + if ( + !this._reconnecting && + this._reconnection && + this.backoff.attempts === 0 + ) { + // keeps reconnection from firing twice for the same reconnection loop + this.reconnect(); + } + }, + /** + * Sets the current transport `socket`. + * + * @param {Function} fn - optional, callback + * @return self + * @public + */ + }, + { + key: "open", + value: function open(fn) { + var _this2 = this; + + debug("readyState %s", this._readyState); + if (~this._readyState.indexOf("open")) return this; + debug("opening %s", this.uri); + this.engine = eio(this.uri, this.opts); + var socket = this.engine; + var self = this; + this._readyState = "opening"; + this.skipReconnect = false; // emit `open` + + var openSubDestroy = on_1.on(socket, "open", function () { + self.onopen(); + fn && fn(); + }); // emit `error` + + var errorSub = on_1.on(socket, "error", function (err) { + debug("error"); + self.cleanup(); + self._readyState = "closed"; + + _get( + _getPrototypeOf(Manager.prototype), + "emit", + _this2 + ).call(_this2, "error", err); + + if (fn) { + fn(err); + } else { + // Only do this if there is no fn to handle the error + self.maybeReconnectOnOpen(); + } + }); + + if (false !== this._timeout) { + var timeout = this._timeout; + debug("connect attempt will timeout after %d", timeout); + + if (timeout === 0) { + openSubDestroy(); // prevents a race condition with the 'open' event + } // set timer + + var timer = setTimeout(function () { + debug("connect attempt timed out after %d", timeout); + openSubDestroy(); + socket.close(); + socket.emit("error", new Error("timeout")); + }, timeout); + this.subs.push(function subDestroy() { + clearTimeout(timer); + }); + } + + this.subs.push(openSubDestroy); + this.subs.push(errorSub); + return this; + }, + /** + * Alias for open() + * + * @return self + * @public + */ + }, + { + key: "connect", + value: function connect(fn) { + return this.open(fn); + }, + /** + * Called upon transport open. + * + * @private + */ + }, + { + key: "onopen", + value: function onopen() { + debug("open"); // clear old subs + + this.cleanup(); // mark as open + + this._readyState = "open"; + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "open" + ); // add new subs + + var socket = this.engine; + this.subs.push( + on_1.on(socket, "ping", this.onping.bind(this)), + on_1.on(socket, "data", this.ondata.bind(this)), + on_1.on(socket, "error", this.onerror.bind(this)), + on_1.on(socket, "close", this.onclose.bind(this)), + on_1.on(this.decoder, "decoded", this.ondecoded.bind(this)) + ); + }, + /** + * Called upon a ping. + * + * @private + */ + }, + { + key: "onping", + value: function onping() { + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "ping" + ); + }, + /** + * Called with data. + * + * @private + */ + }, + { + key: "ondata", + value: function ondata(data) { + this.decoder.add(data); + }, + /** + * Called when parser fully decodes a packet. + * + * @private + */ + }, + { + key: "ondecoded", + value: function ondecoded(packet) { + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "packet", + packet + ); + }, + /** + * Called upon socket error. + * + * @private + */ + }, + { + key: "onerror", + value: function onerror(err) { + debug("error", err); + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "error", + err + ); + }, + /** + * Creates a new socket for the given `nsp`. + * + * @return {Socket} + * @public + */ + }, + { + key: "socket", + value: function socket(nsp, opts) { + var socket = this.nsps[nsp]; + + if (!socket) { + socket = new socket_1.Socket(this, nsp, opts); + this.nsps[nsp] = socket; + } + + return socket; + }, + /** + * Called upon a socket close. + * + * @param socket + * @private + */ + }, + { + key: "_destroy", + value: function _destroy(socket) { + var nsps = Object.keys(this.nsps); + + for (var _i = 0, _nsps = nsps; _i < _nsps.length; _i++) { + var nsp = _nsps[_i]; + var _socket = this.nsps[nsp]; + + if (_socket.active) { + debug("socket %s is still active, skipping close", nsp); + return; + } + } + + this._close(); + }, + /** + * Writes a packet. + * + * @param packet + * @private + */ + }, + { + key: "_packet", + value: function _packet(packet) { + debug("writing packet %j", packet); + var encodedPackets = this.encoder.encode(packet); + + for (var i = 0; i < encodedPackets.length; i++) { + this.engine.write(encodedPackets[i], packet.options); + } + }, + /** + * Clean up transport subscriptions and packet buffer. + * + * @private + */ + }, + { + key: "cleanup", + value: function cleanup() { + debug("cleanup"); + this.subs.forEach(function (subDestroy) { + return subDestroy(); + }); + this.subs.length = 0; + this.decoder.destroy(); + }, + /** + * Close the current socket. + * + * @private + */ + }, + { + key: "_close", + value: function _close() { + debug("disconnect"); + this.skipReconnect = true; + this._reconnecting = false; + + if ("opening" === this._readyState) { + // `onclose` will not fire because + // an open event never happened + this.cleanup(); + } + + this.backoff.reset(); + this._readyState = "closed"; + if (this.engine) this.engine.close(); + }, + /** + * Alias for close() + * + * @private + */ + }, + { + key: "disconnect", + value: function disconnect() { + return this._close(); + }, + /** + * Called upon engine close. + * + * @private + */ + }, + { + key: "onclose", + value: function onclose(reason) { + debug("onclose"); + this.cleanup(); + this.backoff.reset(); + this._readyState = "closed"; + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "close", + reason + ); + + if (this._reconnection && !this.skipReconnect) { + this.reconnect(); + } + }, + /** + * Attempt a reconnection. + * + * @private + */ + }, + { + key: "reconnect", + value: function reconnect() { + var _this3 = this; + + if (this._reconnecting || this.skipReconnect) return this; + var self = this; + + if (this.backoff.attempts >= this._reconnectionAttempts) { + debug("reconnect failed"); + this.backoff.reset(); + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "reconnect_failed" + ); + + this._reconnecting = false; + } else { + var delay = this.backoff.duration(); + debug("will wait %dms before reconnect attempt", delay); + this._reconnecting = true; + var timer = setTimeout(function () { + if (self.skipReconnect) return; + debug("attempting reconnect"); + + _get( + _getPrototypeOf(Manager.prototype), + "emit", + _this3 + ).call( + _this3, + "reconnect_attempt", + self.backoff.attempts + ); // check again for the case socket closed in above events + + if (self.skipReconnect) return; + self.open(function (err) { + if (err) { + debug("reconnect attempt error"); + self._reconnecting = false; + self.reconnect(); + + _get( + _getPrototypeOf(Manager.prototype), + "emit", + _this3 + ).call(_this3, "reconnect_error", err); + } else { + debug("reconnect success"); + self.onreconnect(); + } + }); + }, delay); + this.subs.push(function subDestroy() { + clearTimeout(timer); + }); + } + }, + /** + * Called upon successful reconnect. + * + * @private + */ + }, + { + key: "onreconnect", + value: function onreconnect() { + var attempt = this.backoff.attempts; + this._reconnecting = false; + this.backoff.reset(); + + _get(_getPrototypeOf(Manager.prototype), "emit", this).call( + this, + "reconnect", + attempt + ); + }, + }, + ]); + + return Manager; + })(Emitter); + + exports.Manager = Manager; + + /***/ + }, + + /***/ "./build/on.js": + /*!*********************!*\ + !*** ./build/on.js ***! + \*********************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true, + }); + exports.on = void 0; + + function on(obj, ev, fn) { + obj.on(ev, fn); + return function subDestroy() { + obj.off(ev, fn); + }; + } + + exports.on = on; + + /***/ + }, + + /***/ "./build/socket.js": + /*!*************************!*\ + !*** ./build/socket.js ***! + \*************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + "use strict"; + + function _typeof(obj) { + "@babel/helpers - typeof"; + if ( + typeof Symbol === "function" && + typeof Symbol.iterator === "symbol" + ) { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && + typeof Symbol === "function" && + obj.constructor === Symbol && + obj !== Symbol.prototype + ? "symbol" + : typeof obj; + }; + } + return _typeof(obj); + } + + function _createForOfIteratorHelper(o, allowArrayLike) { + var it; + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if ( + Array.isArray(o) || + (it = _unsupportedIterableToArray(o)) || + (allowArrayLike && o && typeof o.length === "number") + ) { + if (it) o = it; + var i = 0; + var F = function F() {}; + return { + s: F, + n: function n() { + if (i >= o.length) return { done: true }; + return { done: false, value: o[i++] }; + }, + e: function e(_e) { + throw _e; + }, + f: F, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." + ); + } + var normalCompletion = true, + didErr = false, + err; + return { + s: function s() { + it = o[Symbol.iterator](); + }, + n: function n() { + var step = it.next(); + normalCompletion = step.done; + return step; + }, + e: function e(_e2) { + didErr = true; + err = _e2; + }, + f: function f() { + try { + if (!normalCompletion && it["return"] != null) it["return"](); + } finally { + if (didErr) throw err; + } + }, + }; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if ( + n === "Arguments" || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ) + return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); + } + + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError( + "Super expression must either be null or a function" + ); + } + subClass.prototype = Object.create( + superClass && superClass.prototype, + { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + } + ); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = + Object.setPrototypeOf || + function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + + function _possibleConstructorReturn(self, call) { + if ( + call && + (_typeof(call) === "object" || typeof call === "function") + ) { + return call; + } + return _assertThisInitialized(self); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + } + return self; + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call( + Reflect.construct(Date, [], function () {}) + ); + return true; + } catch (e) { + return false; + } + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + Object.defineProperty(exports, "__esModule", { + value: true, + }); + exports.Socket = void 0; + + var socket_io_parser_1 = __webpack_require__( + /*! socket.io-parser */ "./node_modules/socket.io-parser/dist/index.js" + ); + + var Emitter = __webpack_require__( + /*! component-emitter */ "./node_modules/component-emitter/index.js" + ); + + var on_1 = __webpack_require__(/*! ./on */ "./build/on.js"); + + var debug = __webpack_require__( + /*! debug */ "./node_modules/debug/src/browser.js" + )("socket.io-client:socket"); + /** + * Internal events. + * These events can't be emitted by the user. + */ + + var RESERVED_EVENTS = Object.freeze({ + connect: 1, + connect_error: 1, + disconnect: 1, + disconnecting: 1, + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener + newListener: 1, + removeListener: 1, + }); + + var Socket = /*#__PURE__*/ (function (_Emitter) { + _inherits(Socket, _Emitter); + + var _super = _createSuper(Socket); + + /** + * `Socket` constructor. + * + * @public + */ + function Socket(io, nsp, opts) { + var _this; + + _classCallCheck(this, Socket); + + _this = _super.call(this); + _this.receiveBuffer = []; + _this.sendBuffer = []; + _this.ids = 0; + _this.acks = {}; + _this.flags = {}; + _this.io = io; + _this.nsp = nsp; + _this.ids = 0; + _this.acks = {}; + _this.receiveBuffer = []; + _this.sendBuffer = []; + _this.connected = false; + _this.disconnected = true; + _this.flags = {}; + + if (opts && opts.auth) { + _this.auth = opts.auth; + } + + if (_this.io._autoConnect) _this.open(); + return _this; + } + /** + * Subscribe to open, close and packet events + * + * @private + */ + + _createClass(Socket, [ + { + key: "subEvents", + value: function subEvents() { + if (this.subs) return; + var io = this.io; + this.subs = [ + on_1.on(io, "open", this.onopen.bind(this)), + on_1.on(io, "packet", this.onpacket.bind(this)), + on_1.on(io, "error", this.onerror.bind(this)), + on_1.on(io, "close", this.onclose.bind(this)), + ]; + }, + /** + * Whether the Socket will try to reconnect when its Manager connects or reconnects + */ + }, + { + key: "connect", + + /** + * "Opens" the socket. + * + * @public + */ + value: function connect() { + if (this.connected) return this; + this.subEvents(); + if (!this.io["_reconnecting"]) this.io.open(); // ensure open + + if ("open" === this.io._readyState) this.onopen(); + return this; + }, + /** + * Alias for connect() + */ + }, + { + key: "open", + value: function open() { + return this.connect(); + }, + /** + * Sends a `message` event. + * + * @return self + * @public + */ + }, + { + key: "send", + value: function send() { + for ( + var _len = arguments.length, + args = new Array(_len), + _key = 0; + _key < _len; + _key++ + ) { + args[_key] = arguments[_key]; + } + + args.unshift("message"); + this.emit.apply(this, args); + return this; + }, + /** + * Override `emit`. + * If the event is in `events`, it's emitted normally. + * + * @param ev - event name + * @return self + * @public + */ + }, + { + key: "emit", + value: function emit(ev) { + if (RESERVED_EVENTS.hasOwnProperty(ev)) { + throw new Error('"' + ev + '" is a reserved event name'); + } + + for ( + var _len2 = arguments.length, + args = new Array(_len2 > 1 ? _len2 - 1 : 0), + _key2 = 1; + _key2 < _len2; + _key2++ + ) { + args[_key2 - 1] = arguments[_key2]; + } + + args.unshift(ev); + var packet = { + type: socket_io_parser_1.PacketType.EVENT, + data: args, + }; + packet.options = {}; + packet.options.compress = this.flags.compress !== false; // event ack callback + + if ("function" === typeof args[args.length - 1]) { + debug("emitting packet with ack id %d", this.ids); + this.acks[this.ids] = args.pop(); + packet.id = this.ids++; + } + + var isTransportWritable = + this.io.engine && + this.io.engine.transport && + this.io.engine.transport.writable; + var discardPacket = + this.flags["volatile"] && + (!isTransportWritable || !this.connected); + + if (discardPacket) { + debug( + "discard packet as the transport is not currently writable" + ); + } else if (this.connected) { + this.packet(packet); + } else { + this.sendBuffer.push(packet); + } + + this.flags = {}; + return this; + }, + /** + * Sends a packet. + * + * @param packet + * @private + */ + }, + { + key: "packet", + value: function packet(_packet) { + _packet.nsp = this.nsp; + + this.io._packet(_packet); + }, + /** + * Called upon engine `open`. + * + * @private + */ + }, + { + key: "onopen", + value: function onopen() { + var _this2 = this; + + debug("transport is open - connecting"); + + if (typeof this.auth == "function") { + this.auth(function (data) { + _this2.packet({ + type: socket_io_parser_1.PacketType.CONNECT, + data: data, + }); + }); + } else { + this.packet({ + type: socket_io_parser_1.PacketType.CONNECT, + data: this.auth, + }); + } + }, + /** + * Called upon engine or manager `error`. + * + * @param err + * @private + */ + }, + { + key: "onerror", + value: function onerror(err) { + if (!this.connected) { + _get(_getPrototypeOf(Socket.prototype), "emit", this).call( + this, + "connect_error", + err + ); + } + }, + /** + * Called upon engine `close`. + * + * @param reason + * @private + */ + }, + { + key: "onclose", + value: function onclose(reason) { + debug("close (%s)", reason); + this.connected = false; + this.disconnected = true; + delete this.id; + + _get(_getPrototypeOf(Socket.prototype), "emit", this).call( + this, + "disconnect", + reason + ); + }, + /** + * Called with socket packet. + * + * @param packet + * @private + */ + }, + { + key: "onpacket", + value: function onpacket(packet) { + var sameNamespace = packet.nsp === this.nsp; + if (!sameNamespace) return; + + switch (packet.type) { + case socket_io_parser_1.PacketType.CONNECT: + if (packet.data && packet.data.sid) { + var id = packet.data.sid; + this.onconnect(id); + } else { + _get( + _getPrototypeOf(Socket.prototype), + "emit", + this + ).call( + this, + "connect_error", + new Error( + "It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)" + ) + ); + } + + break; + + case socket_io_parser_1.PacketType.EVENT: + this.onevent(packet); + break; + + case socket_io_parser_1.PacketType.BINARY_EVENT: + this.onevent(packet); + break; + + case socket_io_parser_1.PacketType.ACK: + this.onack(packet); + break; + + case socket_io_parser_1.PacketType.BINARY_ACK: + this.onack(packet); + break; + + case socket_io_parser_1.PacketType.DISCONNECT: + this.ondisconnect(); + break; + + case socket_io_parser_1.PacketType.CONNECT_ERROR: + var err = new Error(packet.data.message); // @ts-ignore + + err.data = packet.data.data; + + _get( + _getPrototypeOf(Socket.prototype), + "emit", + this + ).call(this, "connect_error", err); + + break; + } + }, + /** + * Called upon a server event. + * + * @param packet + * @private + */ + }, + { + key: "onevent", + value: function onevent(packet) { + var args = packet.data || []; + debug("emitting event %j", args); + + if (null != packet.id) { + debug("attaching ack callback to event"); + args.push(this.ack(packet.id)); + } + + if (this.connected) { + this.emitEvent(args); + } else { + this.receiveBuffer.push(Object.freeze(args)); + } + }, + }, + { + key: "emitEvent", + value: function emitEvent(args) { + if (this._anyListeners && this._anyListeners.length) { + var listeners = this._anyListeners.slice(); + + var _iterator = _createForOfIteratorHelper(listeners), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done; ) { + var listener = _step.value; + listener.apply(this, args); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + } + + _get(_getPrototypeOf(Socket.prototype), "emit", this).apply( + this, + args + ); + }, + /** + * Produces an ack callback to emit with an event. + * + * @private + */ + }, + { + key: "ack", + value: function ack(id) { + var self = this; + var sent = false; + return function () { + // prevent double callbacks + if (sent) return; + sent = true; + + for ( + var _len3 = arguments.length, + args = new Array(_len3), + _key3 = 0; + _key3 < _len3; + _key3++ + ) { + args[_key3] = arguments[_key3]; + } + + debug("sending ack %j", args); + self.packet({ + type: socket_io_parser_1.PacketType.ACK, + id: id, + data: args, + }); + }; + }, + /** + * Called upon a server acknowlegement. + * + * @param packet + * @private + */ + }, + { + key: "onack", + value: function onack(packet) { + var ack = this.acks[packet.id]; + + if ("function" === typeof ack) { + debug("calling ack %s with %j", packet.id, packet.data); + ack.apply(this, packet.data); + delete this.acks[packet.id]; + } else { + debug("bad ack %s", packet.id); + } + }, + /** + * Called upon server connect. + * + * @private + */ + }, + { + key: "onconnect", + value: function onconnect(id) { + debug("socket connected with id %s", id); + this.id = id; + this.connected = true; + this.disconnected = false; + + _get(_getPrototypeOf(Socket.prototype), "emit", this).call( + this, + "connect" + ); + + this.emitBuffered(); + }, + /** + * Emit buffered events (received and emitted). + * + * @private + */ + }, + { + key: "emitBuffered", + value: function emitBuffered() { + var _this3 = this; + + this.receiveBuffer.forEach(function (args) { + return _this3.emitEvent(args); + }); + this.receiveBuffer = []; + this.sendBuffer.forEach(function (packet) { + return _this3.packet(packet); + }); + this.sendBuffer = []; + }, + /** + * Called upon server disconnect. + * + * @private + */ + }, + { + key: "ondisconnect", + value: function ondisconnect() { + debug("server disconnect (%s)", this.nsp); + this.destroy(); + this.onclose("io server disconnect"); + }, + /** + * Called upon forced client/server side disconnections, + * this method ensures the manager stops tracking us and + * that reconnections don't get triggered for this. + * + * @private + */ + }, + { + key: "destroy", + value: function destroy() { + if (this.subs) { + // clean subscriptions to avoid reconnections + this.subs.forEach(function (subDestroy) { + return subDestroy(); + }); + this.subs = undefined; + } + + this.io["_destroy"](this); + }, + /** + * Disconnects the socket manually. + * + * @return self + * @public + */ + }, + { + key: "disconnect", + value: function disconnect() { + if (this.connected) { + debug("performing disconnect (%s)", this.nsp); + this.packet({ + type: socket_io_parser_1.PacketType.DISCONNECT, + }); + } // remove socket from pool + + this.destroy(); + + if (this.connected) { + // fire events + this.onclose("io client disconnect"); + } + + return this; + }, + /** + * Alias for disconnect() + * + * @return self + * @public + */ + }, + { + key: "close", + value: function close() { + return this.disconnect(); + }, + /** + * Sets the compress flag. + * + * @param compress - if `true`, compresses the sending data + * @return self + * @public + */ + }, + { + key: "compress", + value: function compress(_compress) { + this.flags.compress = _compress; + return this; + }, + /** + * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not + * ready to send messages. + * + * @returns self + * @public + */ + }, + { + key: "onAny", + + /** + * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the + * callback. + * + * @param listener + * @public + */ + value: function onAny(listener) { + this._anyListeners = this._anyListeners || []; + + this._anyListeners.push(listener); + + return this; + }, + /** + * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the + * callback. The listener is added to the beginning of the listeners array. + * + * @param listener + * @public + */ + }, + { + key: "prependAny", + value: function prependAny(listener) { + this._anyListeners = this._anyListeners || []; + + this._anyListeners.unshift(listener); + + return this; + }, + /** + * Removes the listener that will be fired when any event is emitted. + * + * @param listener + * @public + */ + }, + { + key: "offAny", + value: function offAny(listener) { + if (!this._anyListeners) { + return this; + } + + if (listener) { + var listeners = this._anyListeners; + + for (var i = 0; i < listeners.length; i++) { + if (listener === listeners[i]) { + listeners.splice(i, 1); + return this; + } + } + } else { + this._anyListeners = []; + } + + return this; + }, + /** + * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, + * e.g. to remove listeners. + * + * @public + */ + }, + { + key: "listenersAny", + value: function listenersAny() { + return this._anyListeners || []; + }, + }, + { + key: "active", + get: function get() { + return !!this.subs; + }, + }, + { + key: "volatile", + get: function get() { + this.flags["volatile"] = true; + return this; + }, + }, + ]); + + return Socket; + })(Emitter); + + exports.Socket = Socket; + + /***/ + }, + + /***/ "./build/url.js": + /*!**********************!*\ + !*** ./build/url.js ***! + \**********************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true, + }); + exports.url = void 0; + + var parseuri = __webpack_require__( + /*! parseuri */ "./node_modules/parseuri/index.js" + ); + + var debug = __webpack_require__( + /*! debug */ "./node_modules/debug/src/browser.js" + )("socket.io-client:url"); + /** + * URL parser. + * + * @param uri - url + * @param path - the request path of the connection + * @param loc - An object meant to mimic window.location. + * Defaults to window.location. + * @public + */ + + function url(uri) { + var path = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : ""; + var loc = arguments.length > 2 ? arguments[2] : undefined; + var obj = uri; // default to window.location + + loc = loc || (typeof location !== "undefined" && location); + if (null == uri) uri = loc.protocol + "//" + loc.host; // relative path support + + if (typeof uri === "string") { + if ("/" === uri.charAt(0)) { + if ("/" === uri.charAt(1)) { + uri = loc.protocol + uri; + } else { + uri = loc.host + uri; + } + } + + if (!/^(https?|wss?):\/\//.test(uri)) { + debug("protocol-less url %s", uri); + + if ("undefined" !== typeof loc) { + uri = loc.protocol + "//" + uri; + } else { + uri = "https://" + uri; + } + } // parse + + debug("parse %s", uri); + obj = parseuri(uri); + } // make sure we treat `localhost:80` and `localhost` equally + + if (!obj.port) { + if (/^(http|ws)$/.test(obj.protocol)) { + obj.port = "80"; + } else if (/^(http|ws)s$/.test(obj.protocol)) { + obj.port = "443"; + } + } + + obj.path = obj.path || "/"; + var ipv6 = obj.host.indexOf(":") !== -1; + var host = ipv6 ? "[" + obj.host + "]" : obj.host; // define unique id + + obj.id = obj.protocol + "://" + host + ":" + obj.port + path; // define href + + obj.href = + obj.protocol + + "://" + + host + + (loc && loc.port === obj.port ? "" : ":" + obj.port); + return obj; + } + + exports.url = url; + + /***/ + }, + + /***/ "./node_modules/backo2/index.js": + /*!**************************************!*\ + !*** ./node_modules/backo2/index.js ***! + \**************************************/ + /*! no static exports found */ + /***/ function (module, exports) { + /** + * Expose `Backoff`. + */ + module.exports = Backoff; + /** + * Initialize backoff timer with `opts`. + * + * - `min` initial timeout in milliseconds [100] + * - `max` max timeout [10000] + * - `jitter` [0] + * - `factor` [2] + * + * @param {Object} opts + * @api public + */ + + function Backoff(opts) { + opts = opts || {}; + this.ms = opts.min || 100; + this.max = opts.max || 10000; + this.factor = opts.factor || 2; + this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0; + this.attempts = 0; + } + /** + * Return the backoff duration. + * + * @return {Number} + * @api public + */ + + Backoff.prototype.duration = function () { + var ms = this.ms * Math.pow(this.factor, this.attempts++); + + if (this.jitter) { + var rand = Math.random(); + var deviation = Math.floor(rand * this.jitter * ms); + ms = + (Math.floor(rand * 10) & 1) == 0 + ? ms - deviation + : ms + deviation; + } + + return Math.min(ms, this.max) | 0; + }; + /** + * Reset the number of attempts. + * + * @api public + */ + + Backoff.prototype.reset = function () { + this.attempts = 0; + }; + /** + * Set the minimum duration + * + * @api public + */ + + Backoff.prototype.setMin = function (min) { + this.ms = min; + }; + /** + * Set the maximum duration + * + * @api public + */ + + Backoff.prototype.setMax = function (max) { + this.max = max; + }; + /** + * Set the jitter + * + * @api public + */ + + Backoff.prototype.setJitter = function (jitter) { + this.jitter = jitter; + }; + + /***/ + }, + + /***/ "./node_modules/component-emitter/index.js": + /*!*************************************************!*\ + !*** ./node_modules/component-emitter/index.js ***! + \*************************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + /** + * Expose `Emitter`. + */ + if (true) { + module.exports = Emitter; + } + /** + * Initialize a new `Emitter`. + * + * @api public + */ + + function Emitter(obj) { + if (obj) return mixin(obj); + } + + /** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + + function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + + return obj; + } + /** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + Emitter.prototype.on = Emitter.prototype.addEventListener = function ( + event, + fn + ) { + this._callbacks = this._callbacks || {}; + (this._callbacks["$" + event] = + this._callbacks["$" + event] || []).push(fn); + return this; + }; + /** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + Emitter.prototype.once = function (event, fn) { + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; + }; + /** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + + Emitter.prototype.off = + Emitter.prototype.removeListener = + Emitter.prototype.removeAllListeners = + Emitter.prototype.removeEventListener = + function (event, fn) { + this._callbacks = this._callbacks || {}; // all + + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } // specific event + + var callbacks = this._callbacks["$" + event]; + if (!callbacks) return this; // remove all handlers + + if (1 == arguments.length) { + delete this._callbacks["$" + event]; + return this; + } // remove specific handler + + var cb; + + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } // Remove event specific arrays for event types that no + // one is subscribed for to avoid memory leak. + + if (callbacks.length === 0) { + delete this._callbacks["$" + event]; + } + + return this; + }; + /** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + + Emitter.prototype.emit = function (event) { + this._callbacks = this._callbacks || {}; + var args = new Array(arguments.length - 1), + callbacks = this._callbacks["$" + event]; + + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + + if (callbacks) { + callbacks = callbacks.slice(0); + + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; + }; + /** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + + Emitter.prototype.listeners = function (event) { + this._callbacks = this._callbacks || {}; + return this._callbacks["$" + event] || []; + }; + /** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + + Emitter.prototype.hasListeners = function (event) { + return !!this.listeners(event).length; + }; + + /***/ + }, + + /***/ "./node_modules/debug/src/browser.js": + /*!*******************************************!*\ + !*** ./node_modules/debug/src/browser.js ***! + \*******************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + /* eslint-env browser */ + + /** + * This is the web browser implementation of `debug()`. + */ + exports.formatArgs = formatArgs; + exports.save = save; + exports.load = load; + exports.useColors = useColors; + exports.storage = localstorage(); + + exports.destroy = (function () { + var warned = false; + return function () { + if (!warned) { + warned = true; + console.warn( + "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." + ); + } + }; + })(); + /** + * Colors. + */ + + exports.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33", + ]; + /** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + // eslint-disable-next-line complexity + + function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if ( + typeof window !== "undefined" && + window.process && + (window.process.type === "renderer" || window.process.__nwjs) + ) { + return true; + } // Internet Explorer and Edge do not support colors. + + if ( + typeof navigator !== "undefined" && + navigator.userAgent && + navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/) + ) { + return false; + } // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + + return ( + (typeof document !== "undefined" && + document.documentElement && + document.documentElement.style && + document.documentElement.style.WebkitAppearance) || // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== "undefined" && + window.console && + (window.console.firebug || + (window.console.exception && window.console.table))) || // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== "undefined" && + navigator.userAgent && + navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && + parseInt(RegExp.$1, 10) >= 31) || // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== "undefined" && + navigator.userAgent && + navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)) + ); + } + /** + * Colorize log arguments if enabled. + * + * @api public + */ + + function formatArgs(args) { + args[0] = + (this.useColors ? "%c" : "") + + this.namespace + + (this.useColors ? " %c" : " ") + + args[0] + + (this.useColors ? "%c " : " ") + + "+" + + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + var c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function (match) { + if (match === "%%") { + return; + } + + index++; + + if (match === "%c") { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + /** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ + + exports.log = console.debug || console.log || function () {}; + /** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + + function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem("debug", namespaces); + } else { + exports.storage.removeItem("debug"); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + /** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + + function load() { + var r; + + try { + r = exports.storage.getItem("debug"); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + + return r; + } + /** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + + function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + } + + module.exports = __webpack_require__( + /*! ./common */ "./node_modules/debug/src/common.js" + )(exports); + var formatters = module.exports.formatters; + /** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + + formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return "[UnexpectedJSONParseError]: " + error.message; + } + }; + + /***/ + }, + + /***/ "./node_modules/debug/src/common.js": + /*!******************************************!*\ + !*** ./node_modules/debug/src/common.js ***! + \******************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + function _toConsumableArray(arr) { + return ( + _arrayWithoutHoles(arr) || + _iterableToArray(arr) || + _unsupportedIterableToArray(arr) || + _nonIterableSpread() + ); + } + + function _nonIterableSpread() { + throw new TypeError( + "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." + ); + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if ( + n === "Arguments" || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ) + return _arrayLikeToArray(o, minLen); + } + + function _iterableToArray(iter) { + if ( + typeof Symbol !== "undefined" && + Symbol.iterator in Object(iter) + ) + return Array.from(iter); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + return arr2; + } + + /** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + function setup(env) { + createDebug.debug = createDebug; + createDebug["default"] = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = __webpack_require__( + /*! ms */ "./node_modules/ms/index.js" + ); + createDebug.destroy = destroy; + Object.keys(env).forEach(function (key) { + createDebug[key] = env[key]; + }); + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + + createDebug.formatters = {}; + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + + function selectColor(namespace) { + var hash = 0; + + for (var i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[ + Math.abs(hash) % createDebug.colors.length + ]; + } + + createDebug.selectColor = selectColor; + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + + function createDebug(namespace) { + var prevTime; + var enableOverride = null; + + function debug() { + for ( + var _len = arguments.length, args = new Array(_len), _key = 0; + _key < _len; + _key++ + ) { + args[_key] = arguments[_key]; + } + + // Disabled? + if (!debug.enabled) { + return; + } + + var self = debug; // Set `diff` timestamp + + var curr = Number(new Date()); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== "string") { + // Anything else let's inspect with %O + args.unshift("%O"); + } // Apply any `formatters` transformations + + var index = 0; + args[0] = args[0].replace( + /%([a-zA-Z%])/g, + function (match, format) { + // If we encounter an escaped % then don't increase the array index + if (match === "%%") { + return "%"; + } + + index++; + var formatter = createDebug.formatters[format]; + + if (typeof formatter === "function") { + var val = args[index]; + match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format` + + args.splice(index, 1); + index--; + } + + return match; + } + ); // Apply env-specific formatting (colors, etc.) + + createDebug.formatArgs.call(self, args); + var logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, "enabled", { + enumerable: true, + configurable: false, + get: function get() { + return enableOverride === null + ? createDebug.enabled(namespace) + : enableOverride; + }, + set: function set(v) { + enableOverride = v; + }, + }); // Env-specific initialization logic for debug instances + + if (typeof createDebug.init === "function") { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + var newDebug = createDebug( + this.namespace + + (typeof delimiter === "undefined" ? ":" : delimiter) + + namespace + ); + newDebug.log = this.log; + return newDebug; + } + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.names = []; + createDebug.skips = []; + var i; + var split = ( + typeof namespaces === "string" ? namespaces : "" + ).split(/[\s,]+/); + var len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, ".*?"); + + if (namespaces[0] === "-") { + createDebug.skips.push( + new RegExp("^" + namespaces.substr(1) + "$") + ); + } else { + createDebug.names.push(new RegExp("^" + namespaces + "$")); + } + } + } + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + + function disable() { + var namespaces = [] + .concat( + _toConsumableArray(createDebug.names.map(toNamespace)), + _toConsumableArray( + createDebug.skips + .map(toNamespace) + .map(function (namespace) { + return "-" + namespace; + }) + ) + ) + .join(","); + createDebug.enable(""); + return namespaces; + } + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + + function enabled(name) { + if (name[name.length - 1] === "*") { + return true; + } + + var i; + var len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + + function toNamespace(regexp) { + return regexp + .toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, "*"); + } + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + + return val; + } + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + + function destroy() { + console.warn( + "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." + ); + } + + createDebug.enable(createDebug.load()); + return createDebug; + } + + module.exports = setup; + + /***/ + }, + + /***/ "./node_modules/engine.io-client/lib/globalThis.browser.js": + /*!*****************************************************************!*\ + !*** ./node_modules/engine.io-client/lib/globalThis.browser.js ***! + \*****************************************************************/ + /*! no static exports found */ + /***/ function (module, exports) { + module.exports = (function () { + if (typeof self !== "undefined") { + return self; + } else if (typeof window !== "undefined") { + return window; + } else { + return Function("return this")(); + } + })(); + + /***/ + }, + + /***/ "./node_modules/engine.io-client/lib/index.js": + /*!****************************************************!*\ + !*** ./node_modules/engine.io-client/lib/index.js ***! + \****************************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + var Socket = __webpack_require__( + /*! ./socket */ "./node_modules/engine.io-client/lib/socket.js" + ); + + module.exports = function (uri, opts) { + return new Socket(uri, opts); + }; + /** + * Expose deps for legacy compatibility + * and standalone browser access. + */ + + module.exports.Socket = Socket; + module.exports.protocol = Socket.protocol; // this is an int + + module.exports.Transport = __webpack_require__( + /*! ./transport */ "./node_modules/engine.io-client/lib/transport.js" + ); + module.exports.transports = __webpack_require__( + /*! ./transports/index */ "./node_modules/engine.io-client/lib/transports/index.js" + ); + module.exports.parser = __webpack_require__( + /*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js" + ); + + /***/ + }, + + /***/ "./node_modules/engine.io-client/lib/socket.js": + /*!*****************************************************!*\ + !*** ./node_modules/engine.io-client/lib/socket.js ***! + \*****************************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + function _extends() { + _extends = + Object.assign || + function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + + function _typeof(obj) { + "@babel/helpers - typeof"; + if ( + typeof Symbol === "function" && + typeof Symbol.iterator === "symbol" + ) { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && + typeof Symbol === "function" && + obj.constructor === Symbol && + obj !== Symbol.prototype + ? "symbol" + : typeof obj; + }; + } + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError( + "Super expression must either be null or a function" + ); + } + subClass.prototype = Object.create( + superClass && superClass.prototype, + { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + } + ); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = + Object.setPrototypeOf || + function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + + function _possibleConstructorReturn(self, call) { + if ( + call && + (_typeof(call) === "object" || typeof call === "function") + ) { + return call; + } + return _assertThisInitialized(self); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + } + return self; + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call( + Reflect.construct(Date, [], function () {}) + ); + return true; + } catch (e) { + return false; + } + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + var transports = __webpack_require__( + /*! ./transports/index */ "./node_modules/engine.io-client/lib/transports/index.js" + ); + + var Emitter = __webpack_require__( + /*! component-emitter */ "./node_modules/component-emitter/index.js" + ); + + var debug = __webpack_require__( + /*! debug */ "./node_modules/debug/src/browser.js" + )("engine.io-client:socket"); + + var parser = __webpack_require__( + /*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js" + ); + + var parseuri = __webpack_require__( + /*! parseuri */ "./node_modules/parseuri/index.js" + ); + + var parseqs = __webpack_require__( + /*! parseqs */ "./node_modules/parseqs/index.js" + ); + + var Socket = /*#__PURE__*/ (function (_Emitter) { + _inherits(Socket, _Emitter); + + var _super = _createSuper(Socket); + + /** + * Socket constructor. + * + * @param {String|Object} uri or options + * @param {Object} options + * @api public + */ + function Socket(uri) { + var _this; + + var opts = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : {}; + + _classCallCheck(this, Socket); + + _this = _super.call(this); + + if (uri && "object" === _typeof(uri)) { + opts = uri; + uri = null; + } + + if (uri) { + uri = parseuri(uri); + opts.hostname = uri.host; + opts.secure = + uri.protocol === "https" || uri.protocol === "wss"; + opts.port = uri.port; + if (uri.query) opts.query = uri.query; + } else if (opts.host) { + opts.hostname = parseuri(opts.host).host; + } + + _this.secure = + null != opts.secure + ? opts.secure + : typeof location !== "undefined" && + "https:" === location.protocol; + + if (opts.hostname && !opts.port) { + // if no port is specified manually, use the protocol default + opts.port = _this.secure ? "443" : "80"; + } + + _this.hostname = + opts.hostname || + (typeof location !== "undefined" + ? location.hostname + : "localhost"); + _this.port = + opts.port || + (typeof location !== "undefined" && location.port + ? location.port + : _this.secure + ? 443 + : 80); + _this.transports = opts.transports || ["polling", "websocket"]; + _this.readyState = ""; + _this.writeBuffer = []; + _this.prevBufferLen = 0; + _this.opts = _extends( + { + path: "/engine.io", + agent: false, + withCredentials: false, + upgrade: true, + jsonp: true, + timestampParam: "t", + rememberUpgrade: false, + rejectUnauthorized: true, + perMessageDeflate: { + threshold: 1024, + }, + transportOptions: {}, + }, + opts + ); + _this.opts.path = _this.opts.path.replace(/\/$/, "") + "/"; + + if (typeof _this.opts.query === "string") { + _this.opts.query = parseqs.decode(_this.opts.query); + } // set on handshake + + _this.id = null; + _this.upgrades = null; + _this.pingInterval = null; + _this.pingTimeout = null; // set on heartbeat + + _this.pingTimeoutTimer = null; + + if (typeof addEventListener === "function") { + addEventListener( + "beforeunload", + function () { + if (_this.transport) { + // silently close the transport + _this.transport.removeAllListeners(); + + _this.transport.close(); + } + }, + false + ); + } + + _this.open(); + + return _this; + } + /** + * Creates transport of the given type. + * + * @param {String} transport name + * @return {Transport} + * @api private + */ + + _createClass(Socket, [ + { + key: "createTransport", + value: function createTransport(name) { + debug('creating transport "%s"', name); + var query = clone(this.opts.query); // append engine.io protocol identifier + + query.EIO = parser.protocol; // transport name + + query.transport = name; // session id if we already have one + + if (this.id) query.sid = this.id; + + var opts = _extends( + {}, + this.opts.transportOptions[name], + this.opts, + { + query: query, + socket: this, + hostname: this.hostname, + secure: this.secure, + port: this.port, + } + ); + + debug("options: %j", opts); + return new transports[name](opts); + }, + /** + * Initializes transport to use and starts probe. + * + * @api private + */ + }, + { + key: "open", + value: function open() { + var transport; + + if ( + this.opts.rememberUpgrade && + Socket.priorWebsocketSuccess && + this.transports.indexOf("websocket") !== -1 + ) { + transport = "websocket"; + } else if (0 === this.transports.length) { + // Emit error on next tick so it can be listened to + var self = this; + setTimeout(function () { + self.emit("error", "No transports available"); + }, 0); + return; + } else { + transport = this.transports[0]; + } + + this.readyState = "opening"; // Retry with the next transport if the transport is disabled (jsonp: false) + + try { + transport = this.createTransport(transport); + } catch (e) { + debug("error while creating transport: %s", e); + this.transports.shift(); + this.open(); + return; + } + + transport.open(); + this.setTransport(transport); + }, + /** + * Sets the current transport. Disables the existing one (if any). + * + * @api private + */ + }, + { + key: "setTransport", + value: function setTransport(transport) { + debug("setting transport %s", transport.name); + var self = this; + + if (this.transport) { + debug( + "clearing existing transport %s", + this.transport.name + ); + this.transport.removeAllListeners(); + } // set up transport + + this.transport = transport; // set up transport listeners + + transport + .on("drain", function () { + self.onDrain(); + }) + .on("packet", function (packet) { + self.onPacket(packet); + }) + .on("error", function (e) { + self.onError(e); + }) + .on("close", function () { + self.onClose("transport close"); + }); + }, + /** + * Probes a transport. + * + * @param {String} transport name + * @api private + */ + }, + { + key: "probe", + value: function probe(name) { + debug('probing transport "%s"', name); + var transport = this.createTransport(name, { + probe: 1, + }); + var failed = false; + var self = this; + Socket.priorWebsocketSuccess = false; + + function onTransportOpen() { + if (self.onlyBinaryUpgrades) { + var upgradeLosesBinary = + !this.supportsBinary && self.transport.supportsBinary; + failed = failed || upgradeLosesBinary; + } + + if (failed) return; + debug('probe transport "%s" opened', name); + transport.send([ + { + type: "ping", + data: "probe", + }, + ]); + transport.once("packet", function (msg) { + if (failed) return; + + if ("pong" === msg.type && "probe" === msg.data) { + debug('probe transport "%s" pong', name); + self.upgrading = true; + self.emit("upgrading", transport); + if (!transport) return; + Socket.priorWebsocketSuccess = + "websocket" === transport.name; + debug( + 'pausing current transport "%s"', + self.transport.name + ); + self.transport.pause(function () { + if (failed) return; + if ("closed" === self.readyState) return; + debug( + "changing transport and sending upgrade packet" + ); + cleanup(); + self.setTransport(transport); + transport.send([ + { + type: "upgrade", + }, + ]); + self.emit("upgrade", transport); + transport = null; + self.upgrading = false; + self.flush(); + }); + } else { + debug('probe transport "%s" failed', name); + var err = new Error("probe error"); + err.transport = transport.name; + self.emit("upgradeError", err); + } + }); + } + + function freezeTransport() { + if (failed) return; // Any callback called by transport should be ignored since now + + failed = true; + cleanup(); + transport.close(); + transport = null; + } // Handle any error that happens while probing + + function onerror(err) { + var error = new Error("probe error: " + err); + error.transport = transport.name; + freezeTransport(); + debug( + 'probe transport "%s" failed because of error: %s', + name, + err + ); + self.emit("upgradeError", error); + } + + function onTransportClose() { + onerror("transport closed"); + } // When the socket is closed while we're probing + + function onclose() { + onerror("socket closed"); + } // When the socket is upgraded while we're probing + + function onupgrade(to) { + if (transport && to.name !== transport.name) { + debug( + '"%s" works - aborting "%s"', + to.name, + transport.name + ); + freezeTransport(); + } + } // Remove all listeners on the transport and on self + + function cleanup() { + transport.removeListener("open", onTransportOpen); + transport.removeListener("error", onerror); + transport.removeListener("close", onTransportClose); + self.removeListener("close", onclose); + self.removeListener("upgrading", onupgrade); + } + + transport.once("open", onTransportOpen); + transport.once("error", onerror); + transport.once("close", onTransportClose); + this.once("close", onclose); + this.once("upgrading", onupgrade); + transport.open(); + }, + /** + * Called when connection is deemed open. + * + * @api public + */ + }, + { + key: "onOpen", + value: function onOpen() { + debug("socket open"); + this.readyState = "open"; + Socket.priorWebsocketSuccess = + "websocket" === this.transport.name; + this.emit("open"); + this.flush(); // we check for `readyState` in case an `open` + // listener already closed the socket + + if ( + "open" === this.readyState && + this.opts.upgrade && + this.transport.pause + ) { + debug("starting upgrade probes"); + var i = 0; + var l = this.upgrades.length; + + for (; i < l; i++) { + this.probe(this.upgrades[i]); + } + } + }, + /** + * Handles a packet. + * + * @api private + */ + }, + { + key: "onPacket", + value: function onPacket(packet) { + if ( + "opening" === this.readyState || + "open" === this.readyState || + "closing" === this.readyState + ) { + debug( + 'socket receive: type "%s", data "%s"', + packet.type, + packet.data + ); + this.emit("packet", packet); // Socket is live - any packet counts + + this.emit("heartbeat"); + + switch (packet.type) { + case "open": + this.onHandshake(JSON.parse(packet.data)); + break; + + case "ping": + this.resetPingTimeout(); + this.sendPacket("pong"); + this.emit("pong"); + break; + + case "error": + var err = new Error("server error"); + err.code = packet.data; + this.onError(err); + break; + + case "message": + this.emit("data", packet.data); + this.emit("message", packet.data); + break; + } + } else { + debug( + 'packet received with socket readyState "%s"', + this.readyState + ); + } + }, + /** + * Called upon handshake completion. + * + * @param {Object} handshake obj + * @api private + */ + }, + { + key: "onHandshake", + value: function onHandshake(data) { + this.emit("handshake", data); + this.id = data.sid; + this.transport.query.sid = data.sid; + this.upgrades = this.filterUpgrades(data.upgrades); + this.pingInterval = data.pingInterval; + this.pingTimeout = data.pingTimeout; + this.onOpen(); // In case open handler closes socket + + if ("closed" === this.readyState) return; + this.resetPingTimeout(); + }, + /** + * Sets and resets ping timeout timer based on server pings. + * + * @api private + */ + }, + { + key: "resetPingTimeout", + value: function resetPingTimeout() { + var _this2 = this; + + clearTimeout(this.pingTimeoutTimer); + this.pingTimeoutTimer = setTimeout(function () { + _this2.onClose("ping timeout"); + }, this.pingInterval + this.pingTimeout); + }, + /** + * Called on `drain` event + * + * @api private + */ + }, + { + key: "onDrain", + value: function onDrain() { + this.writeBuffer.splice(0, this.prevBufferLen); // setting prevBufferLen = 0 is very important + // for example, when upgrading, upgrade packet is sent over, + // and a nonzero prevBufferLen could cause problems on `drain` + + this.prevBufferLen = 0; + + if (0 === this.writeBuffer.length) { + this.emit("drain"); + } else { + this.flush(); + } + }, + /** + * Flush write buffers. + * + * @api private + */ + }, + { + key: "flush", + value: function flush() { + if ( + "closed" !== this.readyState && + this.transport.writable && + !this.upgrading && + this.writeBuffer.length + ) { + debug( + "flushing %d packets in socket", + this.writeBuffer.length + ); + this.transport.send(this.writeBuffer); // keep track of current length of writeBuffer + // splice writeBuffer and callbackBuffer on `drain` + + this.prevBufferLen = this.writeBuffer.length; + this.emit("flush"); + } + }, + /** + * Sends a message. + * + * @param {String} message. + * @param {Function} callback function. + * @param {Object} options. + * @return {Socket} for chaining. + * @api public + */ + }, + { + key: "write", + value: function write(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + }, + }, + { + key: "send", + value: function send(msg, options, fn) { + this.sendPacket("message", msg, options, fn); + return this; + }, + /** + * Sends a packet. + * + * @param {String} packet type. + * @param {String} data. + * @param {Object} options. + * @param {Function} callback function. + * @api private + */ + }, + { + key: "sendPacket", + value: function sendPacket(type, data, options, fn) { + if ("function" === typeof data) { + fn = data; + data = undefined; + } + + if ("function" === typeof options) { + fn = options; + options = null; + } + + if ( + "closing" === this.readyState || + "closed" === this.readyState + ) { + return; + } + + options = options || {}; + options.compress = false !== options.compress; + var packet = { + type: type, + data: data, + options: options, + }; + this.emit("packetCreate", packet); + this.writeBuffer.push(packet); + if (fn) this.once("flush", fn); + this.flush(); + }, + /** + * Closes the connection. + * + * @api private + */ + }, + { + key: "close", + value: function close() { + var self = this; + + if ( + "opening" === this.readyState || + "open" === this.readyState + ) { + this.readyState = "closing"; + + if (this.writeBuffer.length) { + this.once("drain", function () { + if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + }); + } else if (this.upgrading) { + waitForUpgrade(); + } else { + close(); + } + } + + function close() { + self.onClose("forced close"); + debug("socket closing - telling transport to close"); + self.transport.close(); + } + + function cleanupAndClose() { + self.removeListener("upgrade", cleanupAndClose); + self.removeListener("upgradeError", cleanupAndClose); + close(); + } + + function waitForUpgrade() { + // wait for upgrade to finish since we can't send packets while pausing a transport + self.once("upgrade", cleanupAndClose); + self.once("upgradeError", cleanupAndClose); + } + + return this; + }, + /** + * Called upon transport error + * + * @api private + */ + }, + { + key: "onError", + value: function onError(err) { + debug("socket error %j", err); + Socket.priorWebsocketSuccess = false; + this.emit("error", err); + this.onClose("transport error", err); + }, + /** + * Called upon transport close. + * + * @api private + */ + }, + { + key: "onClose", + value: function onClose(reason, desc) { + if ( + "opening" === this.readyState || + "open" === this.readyState || + "closing" === this.readyState + ) { + debug('socket close with reason: "%s"', reason); + var self = this; // clear timers + + clearTimeout(this.pingIntervalTimer); + clearTimeout(this.pingTimeoutTimer); // stop event from firing again for transport + + this.transport.removeAllListeners("close"); // ensure transport won't stay open + + this.transport.close(); // ignore further transport communication + + this.transport.removeAllListeners(); // set ready state + + this.readyState = "closed"; // clear session id + + this.id = null; // emit close event + + this.emit("close", reason, desc); // clean buffers after, so users can still + // grab the buffers on `close` event + + self.writeBuffer = []; + self.prevBufferLen = 0; + } + }, + /** + * Filters upgrades, returning only those matching client transports. + * + * @param {Array} server upgrades + * @api private + * + */ + }, + { + key: "filterUpgrades", + value: function filterUpgrades(upgrades) { + var filteredUpgrades = []; + var i = 0; + var j = upgrades.length; + + for (; i < j; i++) { + if (~this.transports.indexOf(upgrades[i])) + filteredUpgrades.push(upgrades[i]); + } + + return filteredUpgrades; + }, + }, + ]); + + return Socket; + })(Emitter); + + Socket.priorWebsocketSuccess = false; + /** + * Protocol version. + * + * @api public + */ + + Socket.protocol = parser.protocol; // this is an int + + function clone(obj) { + var o = {}; + + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + o[i] = obj[i]; + } + } + + return o; + } + + module.exports = Socket; + + /***/ + }, + + /***/ "./node_modules/engine.io-client/lib/transport.js": + /*!********************************************************!*\ + !*** ./node_modules/engine.io-client/lib/transport.js ***! + \********************************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + function _typeof(obj) { + "@babel/helpers - typeof"; + if ( + typeof Symbol === "function" && + typeof Symbol.iterator === "symbol" + ) { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && + typeof Symbol === "function" && + obj.constructor === Symbol && + obj !== Symbol.prototype + ? "symbol" + : typeof obj; + }; + } + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError( + "Super expression must either be null or a function" + ); + } + subClass.prototype = Object.create( + superClass && superClass.prototype, + { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + } + ); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = + Object.setPrototypeOf || + function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + + function _possibleConstructorReturn(self, call) { + if ( + call && + (_typeof(call) === "object" || typeof call === "function") + ) { + return call; + } + return _assertThisInitialized(self); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + } + return self; + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call( + Reflect.construct(Date, [], function () {}) + ); + return true; + } catch (e) { + return false; + } + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + var parser = __webpack_require__( + /*! engine.io-parser */ "./node_modules/engine.io-parser/lib/index.js" + ); + + var Emitter = __webpack_require__( + /*! component-emitter */ "./node_modules/component-emitter/index.js" + ); + + var Transport = /*#__PURE__*/ (function (_Emitter) { + _inherits(Transport, _Emitter); + + var _super = _createSuper(Transport); + + /** + * Transport abstract constructor. + * + * @param {Object} options. + * @api private + */ + function Transport(opts) { + var _this; + + _classCallCheck(this, Transport); + + _this = _super.call(this); + _this.opts = opts; + _this.query = opts.query; + _this.readyState = ""; + _this.socket = opts.socket; + return _this; + } + /** + * Emits an error. + * + * @param {String} str + * @return {Transport} for chaining + * @api public + */ + + _createClass(Transport, [ + { + key: "onError", + value: function onError(msg, desc) { + var err = new Error(msg); + err.type = "TransportError"; + err.description = desc; + this.emit("error", err); + return this; + }, + /** + * Opens the transport. + * + * @api public + */ + }, + { + key: "open", + value: function open() { + if ("closed" === this.readyState || "" === this.readyState) { + this.readyState = "opening"; + this.doOpen(); + } + + return this; + }, + /** + * Closes the transport. + * + * @api private + */ + }, + { + key: "close", + value: function close() { + if ( + "opening" === this.readyState || + "open" === this.readyState + ) { + this.doClose(); + this.onClose(); + } + + return this; + }, + /** + * Sends multiple packets. + * + * @param {Array} packets + * @api private + */ + }, + { + key: "send", + value: function send(packets) { + if ("open" === this.readyState) { + this.write(packets); + } else { + throw new Error("Transport not open"); + } + }, + /** + * Called upon open + * + * @api private + */ + }, + { + key: "onOpen", + value: function onOpen() { + this.readyState = "open"; + this.writable = true; + this.emit("open"); + }, + /** + * Called with data. + * + * @param {String} data + * @api private + */ + }, + { + key: "onData", + value: function onData(data) { + var packet = parser.decodePacket( + data, + this.socket.binaryType + ); + this.onPacket(packet); + }, + /** + * Called with a decoded packet. + */ + }, + { + key: "onPacket", + value: function onPacket(packet) { + this.emit("packet", packet); + }, + /** + * Called upon close. + * + * @api private + */ + }, + { + key: "onClose", + value: function onClose() { + this.readyState = "closed"; + this.emit("close"); + }, + }, + ]); + + return Transport; + })(Emitter); + + module.exports = Transport; + + /***/ + }, + + /***/ "./node_modules/engine.io-client/lib/transports/index.js": + /*!***************************************************************!*\ + !*** ./node_modules/engine.io-client/lib/transports/index.js ***! + \***************************************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + var XMLHttpRequest = __webpack_require__( + /*! xmlhttprequest-ssl */ "./node_modules/engine.io-client/lib/xmlhttprequest.js" + ); + + var XHR = __webpack_require__( + /*! ./polling-xhr */ "./node_modules/engine.io-client/lib/transports/polling-xhr.js" + ); + + var JSONP = __webpack_require__( + /*! ./polling-jsonp */ "./node_modules/engine.io-client/lib/transports/polling-jsonp.js" + ); + + var websocket = __webpack_require__( + /*! ./websocket */ "./node_modules/engine.io-client/lib/transports/websocket.js" + ); + + exports.polling = polling; + exports.websocket = websocket; + /** + * Polling transport polymorphic constructor. + * Decides on xhr vs jsonp based on feature detection. + * + * @api private + */ + + function polling(opts) { + var xhr; + var xd = false; + var xs = false; + var jsonp = false !== opts.jsonp; + + if (typeof location !== "undefined") { + var isSSL = "https:" === location.protocol; + var port = location.port; // some user agents have empty `location.port` + + if (!port) { + port = isSSL ? 443 : 80; + } + + xd = opts.hostname !== location.hostname || port !== opts.port; + xs = opts.secure !== isSSL; + } + + opts.xdomain = xd; + opts.xscheme = xs; + xhr = new XMLHttpRequest(opts); + + if ("open" in xhr && !opts.forceJSONP) { + return new XHR(opts); + } else { + if (!jsonp) throw new Error("JSONP disabled"); + return new JSONP(opts); + } + } + + /***/ + }, + + /***/ "./node_modules/engine.io-client/lib/transports/polling-jsonp.js": + /*!***********************************************************************!*\ + !*** ./node_modules/engine.io-client/lib/transports/polling-jsonp.js ***! + \***********************************************************************/ + /*! no static exports found */ + /***/ function (module, exports, __webpack_require__) { + function _typeof(obj) { + "@babel/helpers - typeof"; + if ( + typeof Symbol === "function" && + typeof Symbol.iterator === "symbol" + ) { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && + typeof Symbol === "function" && + obj.constructor === Symbol && + obj !== Symbol.prototype + ? "symbol" + : typeof obj; + }; + } + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); + if (desc.get) { + return desc.get.call(receiver); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); + } + + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; + } + return object; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError( + "Super expression must either be null or a function" + ); + } + subClass.prototype = Object.create( + superClass && superClass.prototype, + { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + } + ); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = + Object.setPrototypeOf || + function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + + function _possibleConstructorReturn(self, call) { + if ( + call && + (_typeof(call) === "object" || typeof call === "function") + ) { + return call; + } + return _assertThisInitialized(self); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); + } + return self; + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Date.prototype.toString.call( + Reflect.construct(Date, [], function () {}) + ); + return true; + } catch (e) { + return false; + } + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + var Polling = __webpack_require__( + /*! ./polling */ "./node_modules/engine.io-client/lib/transports/polling.js" + ); + + var globalThis = __webpack_require__( + /*! ../globalThis */ "./node_modules/engine.io-client/lib/globalThis.browser.js" + ); + + var rNewline = /\n/g; + var rEscapedNewline = /\\n/g; + /** + * Global JSONP callbacks. + */ + + var callbacks; + + var JSONPPolling = /*#__PURE__*/ (function (_Polling) { + _inherits(JSONPPolling, _Polling); + + var _super = _createSuper(JSONPPolling); + + /** + * JSONP Polling constructor. + * + * @param {Object} opts. + * @api public + */ + function JSONPPolling(opts) { + var _this; + + _classCallCheck(this, JSONPPolling); + + _this = _super.call(this, opts); + _this.query = _this.query || {}; // define global callbacks array if not present + // we do this here (lazily) to avoid unneeded global pollution + + if (!callbacks) { + // we need to consider multiple engines in the same page + callbacks = globalThis.___eio = globalThis.___eio || []; + } // callback identifier + + _this.index = callbacks.length; // add callback to jsonp global + + var self = _assertThisInitialized(_this); + + callbacks.push(function (msg) { + self.onData(msg); + }); // append to query string + + _this.query.j = _this.index; + return _this; + } + /** + * JSONP only supports binary as base64 encoded strings + */ + + _createClass(JSONPPolling, [ + { + key: "doClose", + + /** + * Closes the socket. + * + * @api private + */ + value: function doClose() { + if (this.script) { + // prevent spurious errors from being emitted when the window is unloaded + this.script.onerror = function () {}; + + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + if (this.form) { + this.form.parentNode.removeChild(this.form); + this.form = null; + this.iframe = null; + } + + _get( + _getPrototypeOf(JSONPPolling.prototype), + "doClose", + this + ).call(this); + }, + /** + * Starts a poll cycle. + * + * @api private + */ + }, + { + key: "doPoll", + value: function doPoll() { + var self = this; + var script = document.createElement("script"); + + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + script.async = true; + script.src = this.uri(); + + script.onerror = function (e) { + self.onError("jsonp poll error", e); + }; + + var insertAt = document.getElementsByTagName("script")[0]; + + if (insertAt) { + insertAt.parentNode.insertBefore(script, insertAt); + } else { + (document.head || document.body).appendChild(script); + } + + this.script = script; + var isUAgecko = + "undefined" !== typeof navigator && + /gecko/i.test(navigator.userAgent); + + if (isUAgecko) { + setTimeout(function () { + var iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + document.body.removeChild(iframe); + }, 100); + } + }, + /** + * Writes with a hidden iframe. + * + * @param {String} data to send + * @param {Function} called upon flush. + * @api private + */ + }, + { + key: "doWrite", + value: function doWrite(data, fn) { + var self = this; + var iframe; + + if (!this.form) { + var form = document.createElement("form"); + var area = document.createElement("textarea"); + var id = (this.iframeId = "eio_iframe_" + this.index); + form.className = "socketio"; + form.style.position = "absolute"; + form.style.top = "-1000px"; + form.style.left = "-1000px"; + form.target = id; + form.method = "POST"; + form.setAttribute("accept-charset", "utf-8"); + area.name = "d"; + form.appendChild(area); + document.body.appendChild(form); + this.form = form; + this.area = area; + } + + this.form.action = this.uri(); + + function complete() { + initIframe(); + fn(); + } + + function initIframe() { + if (self.iframe) { + try { + self.form.removeChild(self.iframe); + } catch (e) { + self.onError("jsonp polling iframe removal error", e); + } + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + var html = + '