diff --git a/bin/importer/feeders/Rocket_Chat.py b/bin/importer/feeders/Rocket_Chat.py new file mode 100755 index 00000000..5de7384f --- /dev/null +++ b/bin/importer/feeders/Rocket_Chat.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +# -*-coding:UTF-8 -* +""" +The Telegram Feeder Importer Module +================ + +Process Telegram JSON + +""" +import os +import sys + +sys.path.append(os.environ['AIL_BIN']) +################################## +# Import Project packages +################################## +from importer.feeders.abstract_chats_feeder import AbstractChatFeeder + +class Rocket_ChatFeeder(AbstractChatFeeder): + + def __init__(self, json_data): + super().__init__('rocket-chat', json_data) diff --git a/bin/lib/ail_core.py b/bin/lib/ail_core.py index 5c922add..e8a2aacb 100755 --- a/bin/lib/ail_core.py +++ b/bin/lib/ail_core.py @@ -101,7 +101,12 @@ def get_object_all_subtypes(obj_type): # TODO Dynamic subtype if obj_type == 'pgp': return ['key', 'mail', 'name'] if obj_type == 'username': - return ['telegram', 'discord', 'twitter', 'jabber'] + chat_protocols = r_serv_db.smembers('chat:protocols') + if not chat_protocols: + chat_protocols = set() + chat_protocols.add('jabber') + chat_protocols.add('telegram') + return sorted(chat_protocols) if obj_type == 'user-account': return r_object.smembers(f'all_chat:subtypes') return [] diff --git a/bin/lib/ail_users.py b/bin/lib/ail_users.py index f59fd83a..bb84d7e5 100755 --- a/bin/lib/ail_users.py +++ b/bin/lib/ail_users.py @@ -22,6 +22,7 @@ ################################## from lib import ail_logger from lib import ail_orgs +from lib import Language from lib.ConfigLoader import ConfigLoader from exporter import MailExporter @@ -511,6 +512,8 @@ def get_meta(self, options=set()): meta['role'] = get_user_role(self.user_id) if 'rulezet_api_key' in options: meta['rulezet_api_key'] = self.get_rulezet_api_key() + if 'preferred_language' in options: + meta['preferred_language'] = self.get_preferred_language() if '2fa' in options: meta['2fa'] = self.is_2fa_enabled() if 'otp_setup' in options: @@ -601,6 +604,15 @@ def set_rulezet_api_key(self, api_key): def delete_rulezet_api_key(self): r_serv_db.hdel(f'ail:user:settings:{self.user_id}', 'rulezet:api_key') + def get_preferred_language(self): + language = r_serv_db.hget(f'ail:user:settings:{self.user_id}', 'preferred_language') + if language: + return language + return 'en' + + def set_preferred_language(self, language): + r_serv_db.hset(f'ail:user:settings:{self.user_id}', 'preferred_language', language) + ## OTP ## def is_2fa_setup(self): @@ -686,7 +698,7 @@ def api_get_users_meta(): return meta def api_get_user_profile(user_id): - options = {'api_key', 'role', '2fa', 'org', 'org_name', 'rulezet_api_key'} + options = {'api_key', 'role', '2fa', 'org', 'org_name', 'rulezet_api_key', 'preferred_language'} user = AILUser(user_id) if not user.exists(): return {'status': 'error', 'reason': 'User not found'}, 404 @@ -795,6 +807,16 @@ def api_edit_user_rulezet_api_key(user_id, api_key): user.set_rulezet_api_key(api_key) return {'status': 'success'}, 200 +def api_edit_user_preferred_language(user_id, language): + user = AILUser(user_id) + if not user.exists(): + return {'status': 'error', 'reason': 'User not found'}, 404 + language = Language.normalize_bcp47_tag(language) + if not language: + return {'status': 'error', 'reason': 'Invalid preferred language'}, 400 + user.set_preferred_language(language) + return {'status': 'success'}, 200 + def api_delete_user_rulezet_api_key(user_id): user = AILUser(user_id) if not user.exists(): diff --git a/bin/lib/chats_viewer.py b/bin/lib/chats_viewer.py index c7c3df9d..de07504a 100755 --- a/bin/lib/chats_viewer.py +++ b/bin/lib/chats_viewer.py @@ -135,6 +135,11 @@ def get_nb_networks(self): def get_icon(self): if self.id == 'discord': icon = {'style': 'fab', 'icon': 'fa-discord'} + elif self.id == 'matrix': + icon = {'style': 'svg', + 'icon': ''} + elif self.id == 'rocket-chat': + icon = {'style': 'fab', 'icon': 'fa-rocketchat'} elif self.id == 'telegram': icon = {'style': 'fab', 'icon': 'fa-telegram'} else: @@ -386,7 +391,7 @@ def get_obj_chat_from_global_id(chat_gid): def get_obj_chat_meta(obj_chat, new_options=set()): options = {} if obj_chat.type == 'chat': - options = {'created_at', 'icon', 'info', 'subchannels', 'threads', 'username'} + options = {'address', 'created_at', 'icon', 'info', 'network', 'protocol', 'subchannels', 'threads', 'username'} elif obj_chat.type == 'chat-subchannel': options = {'chat', 'created_at', 'icon', 'nb_messages', 'threads'} elif obj_chat.type == 'chat-thread': @@ -737,7 +742,7 @@ def get_user_account_mentions_chord(subtype, user_id): def _get_chat_card_meta_options(): - return {'created_at', 'icon', 'info', 'nb_participants', 'origin_link', 'subchannels', 'tags_safe', 'threads', 'translation', 'username'} + return {'address', 'created_at', 'icon', 'info', 'nb_participants', 'network', 'origin_link', 'protocol', 'subchannels', 'tags_safe', 'threads', 'translation', 'username'} def _get_message_bloc_meta_options(): return {'chat', 'content', 'files', 'files-names', 'icon', 'images', 'language', 'link', 'parent', 'parent_meta', 'reactions','thread', 'translation', 'user-account'} @@ -1081,7 +1086,7 @@ def api_get_chat(chat_id, chat_instance_uuid, translation_target=None, nb=-1, pa chat = Chats.Chat(chat_id, chat_instance_uuid) if not chat.exists(): return {"status": "error", "reason": "Unknown chat"}, 404 - meta = chat.get_meta({'created_at', 'icon', 'info', 'nb_participants', 'subchannels', 'tags_safe', 'threads', 'translation', 'username'}, translation_target=translation_target) + meta = chat.get_meta({'address', 'created_at', 'icon', 'info', 'network', 'nb_participants', 'protocol', 'subchannels', 'tags_safe', 'threads', 'translation', 'username'}, translation_target=translation_target) if meta['username']: meta['username'] = get_username_meta_from_global_id(meta['username']) if meta['subchannels']: @@ -1197,7 +1202,7 @@ def api_get_message(message_id, translation_target=None): message = Messages.Message(message_id) if not message.exists(): return {"status": "error", "reason": "Unknown uuid"}, 404 - meta = message.get_meta({'barcodes', 'chat', 'container', 'content', 'files', 'files-names', 'forwarded_from', 'icon', 'images', 'language', 'link', 'parent', 'parent_meta', 'protocol', 'qrcodes', 'reactions', 'thread', 'translation', 'user-account'}, translation_target=translation_target) + meta = message.get_meta({'address', 'barcodes', 'chat', 'container', 'content', 'files', 'files-names', 'forwarded_from', 'icon', 'images', 'language', 'link', 'network', 'parent', 'parent_meta', 'protocol', 'qrcodes', 'reactions', 'thread', 'translation', 'user-account'}, translation_target=translation_target) if 'forwarded_from' in meta: chat = get_obj_chat_from_global_id(meta['forwarded_from']) meta['forwarded_from'] = chat.get_meta({'icon'}) diff --git a/bin/lib/crawlers.py b/bin/lib/crawlers.py index 0db6d828..397750dd 100755 --- a/bin/lib/crawlers.py +++ b/bin/lib/crawlers.py @@ -17,8 +17,9 @@ import sys import time import uuid +from collections import deque -# import orjson +import orjson from multiprocessing import Process as Proc @@ -193,6 +194,23 @@ def get_date_crawled_items_source(date): def get_har_dir(): return HAR_DIR + +def get_last_crawler_logs(lines=100): + log_path = os.path.join(os.environ['AIL_HOME'], 'logs', 'crawlers.log') + if not os.path.exists(log_path): + return ['No crawler logs available.'] + if os.path.getsize(log_path) == 0: + return ['Crawler log file is empty.'] + try: + with open(log_path, 'r', encoding='utf-8', errors='replace') as f: + last_lines = deque(f, maxlen=lines) + except OSError: + return ['No crawler logs available.'] + + if not last_lines: + return ['Crawler log file is empty.'] + return [line.rstrip('\n') for line in last_lines] + def is_valid_onion_v3_domain(domain): if len(domain) == 62: # v3 address return domain[:56].isalnum() @@ -1449,7 +1467,6 @@ def extract_time_from_capture(self, capture): if not self.date: self.date = get_current_date(separator=True) self.epoch = int(time.time()) - print(self.date, self.epoch) def extract_title(self, item, html_content): title_content = extract_title(html_content) @@ -1500,7 +1517,8 @@ def process_favicons(self, item, favicons): fav.add(item.get_date(), item) def process(self, capture, capture_parent='capture_importer'): - capture = self._decode_capture(capture) + if capture_parent != 'lookyloo': + capture = self._decode_capture(capture) self.extract_domain_from_capture(capture) # Filter unsafe onions if self.domain.id.endswith('.onion'): @@ -1542,7 +1560,7 @@ def process(self, capture, capture_parent='capture_importer'): # SSHKeys.save_passive_ssh_host(self.domain.id) return objs - def process_capture(self, parent_id, capture): + def process_capture(self, parent_id, capture, force=False): objs = [] filter_page = False if not parent_id: @@ -1581,8 +1599,17 @@ def process_capture(self, parent_id, capture): else: last_url = f'http://{self.domain.id}' + # Filter duplicate + if not force and self.root_item_id is None: + if self.domain.exists_epoch_history(self.epoch): + self.logger.warning(f'Capture Already Imported, {self.domain.id} -> {self.epoch}') + return False + if capture.get('html') and not filter_page: - item_id = create_item_id(self.items_dir, self.domain.id) + if capture.get('uuid') and parent_id is None: + item_id = create_item_id(self.items_dir, self.domain.id, c_uuid=capture['uuid']) + else: + item_id = create_item_id(self.items_dir, self.domain.id) item = Item(item_id) print(item.id) @@ -1634,15 +1661,18 @@ def process_capture(self, parent_id, capture): return objs def process_lookyloo_archive(self, archive): - temp_dir = os.path.join(os.environ['AIL_HOME'], 'temp/import', archive) - archive = os.path.join(temp_dir, archive) # TODO sanityse + temp_dir = os.path.join(os.environ['AIL_HOME'], 'temp/import') + archive = os.path.join(temp_dir, archive) if not os.path.commonpath([archive, temp_dir]) == temp_dir: self.logger.critical(f'Path Transversal {archive}') return [] files_to_skip = ['cnames.json', 'ipasn.json', 'ips.json', 'mx.json', - 'nameservers.json', 'soa.json', 'hashlookup.json'] + 'nameservers.json', 'soa.json', 'hashlookup.json', + 'cookies.json', 'storage.json', 'meta', 'parent', 'categories', 'data.filename', # TEMP + 'data', 'trusted_timestamps.json', 'capture_settings.json', 'frames.json'] # TEMP capture = {} + unrecoverable_error= False with ZipFile(archive, 'r') as lookyloo_capture: for filename in lookyloo_capture.namelist(): @@ -1660,20 +1690,20 @@ def process_lookyloo_archive(self, archive): capture['last_redirected_url'] = lookyloo_capture.read(filename).decode() elif filename.endswith('0.png'): capture['png'] = lookyloo_capture.read(filename) - # elif filename.endswith('0.cookies.json'): # TODO # # # # + # elif filename.endswith('0.cookies.json'): # # Not required # capture{'cookies'} = orjson.loads(lookyloo_capture.read(filename)) # elif filename.endswith('0.storage.json'): # # Not required # storage = orjson.loads(lookyloo_capture.read(filename)) elif filename.endswith('potential_favicons.ico'): - if not 'potential_favicons.ico': - capture['potential_favicons'] = set() + if 'potential_favicons' not in capture: + capture['potential_favicons'] = [] # We may have more than one favicon - capture['potential_favicons'].add(lookyloo_capture.read(filename)) - # elif filename.endswith('uuid'): # TODO Avoid duplicate and multiple Imports - # uuid = lookyloo_capture.read(filename).decode() - # if self.uuid_exists(uuid): # TODO Avoid duplicate and multiple Imports + capture['potential_favicons'].append(lookyloo_capture.read(filename)) + elif filename.endswith('uuid'): # TODO Avoid duplicate and multiple Imports + capture['uuid'] = lookyloo_capture.read(filename).decode() + # if self.uuid_exists(uuid): # messages['warnings'].append(f'UUID {uuid} already exists, set a new one.') # uuid = str(uuid4()) # elif filename.endswith('meta'): @@ -1708,11 +1738,12 @@ def process_lookyloo_archive(self, archive): else: self.logger.warning(f'Unexpected file in the capture archive: {filename}') # require HAR + html + last_redirected_url - if not capture.get('har') or not not capture.get('html'): + if not capture.get('har') or not capture.get('html'): unrecoverable_error = True if not capture.get('last_redirected_url'): self.logger.warning('Incomplete submission: missing landing page') self.logger.error('Invalid submission: missing HAR or html or last_redirected_url file') + print(capture.keys()) elif not capture.get('png'): if not capture.get('png'): self.logger.warning('Incomplete submission: missing screenshot') @@ -2743,14 +2774,16 @@ def is_redirection(domain, last_url): last_domain = '{}.{}'.format(last_domain[-2], last_domain[-1]) return domain != last_domain -def create_item_id(item_dir, domain): +def create_item_id(item_dir, domain, c_uuid=None): + if not c_uuid: + c_uuid = str(uuid.uuid4()) # remove / domain = domain.replace('/', '_') if len(domain) > 215: - n_uuid = domain[-215:]+str(uuid.uuid4()) + item_id = domain[-215:]+c_uuid else: - n_uuid = domain+str(uuid.uuid4()) - return os.path.join(item_dir, n_uuid) + item_id = domain+c_uuid + return os.path.join(item_dir, item_id) # # # # # # # # # # # # # # @@ -2852,9 +2885,12 @@ def ping_lacus(): else: try: ping = lacus.is_up - except: - req_error = {'error': 'Failed to connect Lacus URL', 'status_code': 400} + except Exception as e: + req_error = {'error': f'Unexpected error while checking Lacus availability, {type(e).__name__}: {e}', 'status_code': 503} ping = False + if not ping: + req_error = {'error': 'Unable to reach Lacus. Please verify that the Lacus service is running and that the configured URL and port are reachable.', 'status_code': 503} + update_lacus_connection_status(ping, req_error=req_error) return ping @@ -2917,61 +2953,85 @@ def api_set_crawler_max_captures(data): ## TEST ## def is_test_ail_crawlers_successful(): - return r_db.hget('crawler:tor:test', 'success') == 'True' + web_success = r_db.hget('crawler:tor:test', 'web_success') + onion_success = r_db.hget('crawler:tor:test', 'onion_success') + return web_success == 'True' or onion_success == 'True' def get_test_ail_crawlers_message(): - return r_db.hget('crawler:tor:test', 'message') - -def save_test_ail_crawlers_result(test_success, message): - r_db.hset('crawler:tor:test', 'success', str(test_success)) - r_db.hset('crawler:tor:test', 'message', message) + metadata = get_test_ail_crawlers_metadata() + return f"Web: {metadata['web_message']}\nOnion: {metadata['onion_message']}" + +def get_test_ail_crawlers_metadata(): + metadata = { + 'web_success': r_db.hget('crawler:tor:test', 'web_success'), + 'web_message': r_db.hget('crawler:tor:test', 'web_message'), + 'onion_success': r_db.hget('crawler:tor:test', 'onion_success'), + 'onion_message': r_db.hget('crawler:tor:test', 'onion_message'), + 'date_test': r_db.hget('crawler:tor:test', 'date_test') + } + if metadata['web_success'] is None: + metadata['web_success'] = 'False' + if not metadata['web_message']: + metadata['web_message'] = 'Web crawler test has not been run yet.' + if metadata['onion_success'] is None: + metadata['onion_success'] = 'False' + if not metadata['onion_message']: + metadata['onion_message'] = 'Onion crawler test has not been run yet.' + if not metadata['date_test']: + metadata['date_test'] = 'Unknown' + return metadata + +def save_test_ail_crawlers_result(web_success, web_message, onion_success, onion_message, date_test): + r_db.hset('crawler:tor:test', 'web_success', str(web_success)) + r_db.hset('crawler:tor:test', 'web_message', web_message) + r_db.hset('crawler:tor:test', 'onion_success', str(onion_success)) + r_db.hset('crawler:tor:test', 'onion_message', onion_message) + r_db.hset('crawler:tor:test', 'date_test', date_test) + +def _run_lacus_network_test(lacus, user_agent, url, expected_text, proxy=None): + enqueue_kwargs = {'url': url, 'depth': 0, 'user_agent': user_agent, 'force': True, 'general_timeout_in_sec': 90} + if proxy: + enqueue_kwargs['proxy'] = proxy + capture_uuid = lacus.enqueue(**enqueue_kwargs) + status = lacus.get_capture_status(capture_uuid) + launch_time = int(time.time()) + while int(time.time()) - launch_time < 90 and status != CaptureStatus.DONE: + time.sleep(1) + status = lacus.get_capture_status(capture_uuid) + entries = lacus.get_capture(capture_uuid) + if 'error' in entries: + return False, entries['error'] + if 'html' in entries and entries['html']: + if expected_text in entries['html']: + return True, f'Expected content "{expected_text}" found.' + return False, f'Expected content "{expected_text}" not found.' + if status == 2: + return False, 'Timeout Error' + return False, 'Error' def test_ail_crawlers(): - # # TODO: test web domain + date_test = datetime.now().strftime("%Y-%m-%d %H:%M:%S") if not ping_lacus(): lacus_url = get_lacus_url() error_message = f'Error: Can\'t connect to AIL Lacus, {lacus_url}' print(error_message) - save_test_ail_crawlers_result(False, error_message) + save_test_ail_crawlers_result(False, error_message, False, error_message, date_test) return False lacus = get_lacus() commit_id = git_status.get_last_commit_id_from_local() user_agent = f'{commit_id}-AIL LACUS CRAWLER' - # domain = 'eswpccgr5xyovsahffkehgleqthrasfpfdblwbs4lstd345dwq5qumqd.onion' - url = 'http://eswpccgr5xyovsahffkehgleqthrasfpfdblwbs4lstd345dwq5qumqd.onion' - - ## LAUNCH CRAWLER, TEST MODE ## - # set_current_crawler_status(splash_url, 'CRAWLER TEST', started_time=True, - # crawled_domain='TEST DOMAIN', crawler_type='onion') - capture_uuid = lacus.enqueue(url=url, depth=0, user_agent=user_agent, proxy='force_tor', - force=True, general_timeout_in_sec=90) - status = lacus.get_capture_status(capture_uuid) - launch_time = int(time.time()) # capture timeout - while int(time.time()) - launch_time < 90 and status != CaptureStatus.DONE: - # DEBUG - print(int(time.time()) - launch_time) - print(status) - time.sleep(1) - status = lacus.get_capture_status(capture_uuid) - # TODO CRAWLER STATUS OR QUEUED CAPTURE LIST - entries = lacus.get_capture(capture_uuid) - if 'error' in entries: - save_test_ail_crawlers_result(False, entries['error']) - return False - elif 'html' in entries and entries['html']: - mess = 'It works!' - if mess in entries['html']: - save_test_ail_crawlers_result(True, mess) - return True - else: - return False - elif status == 2: - save_test_ail_crawlers_result(False, 'Timeout Error') - else: - save_test_ail_crawlers_result(False, 'Error') - return False + web_success, web_message = _run_lacus_network_test(lacus, user_agent, 'https://ail-project.org/', 'AIL Project') + onion_success, onion_message = _run_lacus_network_test( + lacus, + user_agent, + 'http://eswpccgr5xyovsahffkehgleqthrasfpfdblwbs4lstd345dwq5qumqd.onion', + 'It works!', + proxy='force_tor' + ) + save_test_ail_crawlers_result(web_success, web_message, onion_success, onion_message, date_test) + return web_success or onion_success #### ---- #### diff --git a/bin/lib/objects/Chats.py b/bin/lib/objects/Chats.py index ccac9a29..10f991bd 100755 --- a/bin/lib/objects/Chats.py +++ b/bin/lib/objects/Chats.py @@ -129,6 +129,10 @@ def get_meta(self, options=set(), translation_target=None, flask_context=False): meta['origin_link'] = self.get_origin_link() if 'protocol' in options: meta['protocol'] = self.get_protocol() + if 'network' in options: + meta['network'] = self.get_network() + if 'address' in options: + meta['address'] = self.get_address() return meta def get_misp_object(self): diff --git a/bin/lib/objects/Domains.py b/bin/lib/objects/Domains.py index b18536c5..623b3b3c 100755 --- a/bin/lib/objects/Domains.py +++ b/bin/lib/objects/Domains.py @@ -529,6 +529,10 @@ def _add_history_root_item(self, root_item, epoch): # Create/Update crawler history r_crawler.zadd(f'domain:history:{self.id}', {root_item: epoch}) + def exists_epoch_history(self, epoch): + nb = r_crawler.zcount(f'domain:history:{self.id}', epoch, epoch) + return nb > 0 + # if domain down -> root_item = epoch def add_history(self, epoch, root_item=None, date=None): if not date: diff --git a/bin/lib/objects/Messages.py b/bin/lib/objects/Messages.py index 7c9ad3e0..588798c8 100755 --- a/bin/lib/objects/Messages.py +++ b/bin/lib/objects/Messages.py @@ -80,6 +80,14 @@ def get_protocol(self): chat_instance = self.get_chat_instance() return r_obj.hget(f'chatSerIns:{chat_instance}', 'protocol') + def get_network(self): + chat_instance = self.get_chat_instance() + return r_obj.hget(f'chatSerIns:{chat_instance}', 'network') + + def get_address(self): + chat_instance = self.get_chat_instance() + return r_obj.hget(f'chatSerIns:{chat_instance}', 'address') + def get_content(self, r_type='str'): # TODO ADD cache # TODO Compress content ??????? """ Returns content @@ -262,13 +270,6 @@ def add_reaction(self, reactions, nb_reaction): # message media # flag is deleted -> event or missing from feeder pass ??? - def get_language(self): - languages = self.get_languages() - if languages: - return languages.pop() - else: - return None - def get_search_document(self, timestamp=None): if not timestamp: timestamp = self.get_timestamp() @@ -322,7 +323,7 @@ def get_meta(self, options=set(), timestamp=None, translation_target='', flask_c """ if options is None: options = set() - meta = self.get_default_meta(tags=True) + meta = self.get_default_meta(tags=True, options=options) # original_id meta['_id'] = self.id.rsplit('/', 1)[-1] @@ -344,6 +345,10 @@ def get_meta(self, options=set(), timestamp=None, translation_target='', flask_c meta['content'] = self.get_content() if 'protocol': meta['protocol'] = self.get_protocol() + if 'network': + meta['network'] = self.get_network() + if 'address': + meta['address'] = self.get_address() if 'parent' in options: meta['parent'] = self.get_parent() if meta['parent'] and 'parent_meta' in options: @@ -389,16 +394,12 @@ def get_meta(self, options=set(), timestamp=None, translation_target='', flask_c meta['files'] = self.get_files(file_names=meta['files-names']) if 'reactions' in options: meta['reactions'] = self.get_reactions() - if 'language' in options: - meta['language'] = self.get_language() if 'translation' in options and translation_target: if meta.get('language'): source = meta['language'] else: source = None meta['translation'] = self.translate(content=meta.get('content'), source=source, target=translation_target) - if 'language' in options: - meta['language'] = self.get_language() # meta['encoding'] = None return meta diff --git a/bin/lib/objects/Ocrs.py b/bin/lib/objects/Ocrs.py index c5cfeb3b..e71c7432 100755 --- a/bin/lib/objects/Ocrs.py +++ b/bin/lib/objects/Ocrs.py @@ -169,16 +169,12 @@ def get_meta(self, options=None, translation_target='', flask_context=False): meta['img'] = self.draw_bounding_boxs() if 'map' in options: meta['map'] = self.get_img_map_coords() - if 'language' in options: - meta['language'] = self.get_language() if 'translation' in options and translation_target: if meta.get('language'): source = meta['language'] else: source = None meta['translation'] = self.translate(content=meta.get('content'), source=source, target=translation_target) - if 'language' in options: - meta['language'] = self.get_language() return meta def get_objs_container(self): diff --git a/bin/lib/objects/PDFs.py b/bin/lib/objects/PDFs.py index f74a68eb..083246ef 100755 --- a/bin/lib/objects/PDFs.py +++ b/bin/lib/objects/PDFs.py @@ -93,6 +93,21 @@ def get_file_content(self): def get_base64(self): return base64.b64encode(self.get_file_content().read()).decode() + def get_content_sample(self, max_pages=5): + text = [] + doc = pymupdf.open(self.get_filepath()) + for page_index in range(doc.page_count): + if len(text) >= max_pages: + break + page = doc[page_index] + page_text = page.get_text("text") + if page_text: + page_text = page_text.strip() + if page_text: + text.append(page_text) + doc.close() + return '\n'.join(text).strip() + def get_content(self, r_type='str'): if r_type == 'str': return None @@ -399,12 +414,18 @@ def api_exists_translation_file(filename): return {'error': 'No Translation Found or Expired. Please Launch a new translation'}, 404 return filename, 200 -def api_create_translation_task(obj_id, source, target, force=False): +def api_create_translation_task(obj_id, target, force=False): # TODO AUTO DETECT LANGUAGE ???? obj = PDF(obj_id) if not obj.exists(): return {'error': 'PDF Not Found'}, 404 + source = obj.get_language() + if not source: + source = obj.detect_language() + if not source: + return {'error': 'No source language available. Please set the PDF language manually or trigger language detection first.'}, 400 + target = Language.normalize_bcp47_tag(target) if not Language.exists_lang_iso_target_source(source, target): - return {'error': 'Invalid Language code'}, 400 + return {'error': 'Invalid source/target Language code'}, 400 obj_gid = obj.get_global_id() if Language.exists_object_translation_language(obj_gid, target): if force: diff --git a/bin/lib/objects/abstract_chat_object.py b/bin/lib/objects/abstract_chat_object.py index 108cfc34..f883af13 100755 --- a/bin/lib/objects/abstract_chat_object.py +++ b/bin/lib/objects/abstract_chat_object.py @@ -54,12 +54,17 @@ def __init__(self, obj_type, id, subtype): # last imported/updated # TODO get instance - # TODO get network - # TODO get address + # TODO get instance def get_protocol(self): return get_chat_protocol(self.subtype) + def get_network(self): + return r_object.hget(f'chatSerIns:{self.subtype}', 'network') + + def get_address(self): + return r_object.hget(f'chatSerIns:{self.subtype}', 'address') + def get_chat(self): # require ail object TODO ## if self.type != 'chat': parent = self.get_parent() diff --git a/bin/lib/objects/abstract_object.py b/bin/lib/objects/abstract_object.py index 083e1d7d..3f4d3c97 100755 --- a/bin/lib/objects/abstract_object.py +++ b/bin/lib/objects/abstract_object.py @@ -93,6 +93,8 @@ def get_default_meta(self, tags=False, link=False, options=set(), flask_context= dict_meta['file-meta'] = self.get_file_meta() if 'investigations' in options: dict_meta['investigations'] = self.get_investigations() + if 'language' in options: + dict_meta['language'] = self.get_language() if 'svg_icon' in options: dict_meta['svg_icon'] = self.get_svg_icon() return dict_meta @@ -461,6 +463,13 @@ def get_objs_container(self): def get_languages(self): return get_obj_languages(self.type, self.get_subtype(r_str=True), self.id) + def get_language(self): + languages = self.get_languages() + if languages: + return languages.pop() + else: + return None + def get_language_objs(self, language): return get_container_language_objs(language, self.get_global_id()) @@ -479,7 +488,11 @@ def edit_language(self, old_language, new_language): self.add_language(new_language) def detect_language(self, field=''): - return detect_obj_language(self.type, self.get_subtype(r_str=True), self.id, self.get_content(), objs_containers=self.get_objs_container()) + if self.type == 'pdf': + content = self.get_content_sample() + else: + content = self.get_content() + return detect_obj_language(self.type, self.get_subtype(r_str=True), self.id, content, objs_containers=self.get_objs_container()) def get_obj_language_stats(self): return get_obj_language_stats(self.type, self.get_subtype(r_str=True), self.id) diff --git a/bin/lib/objects/ail_objects.py b/bin/lib/objects/ail_objects.py index ed1f5670..72f3af55 100755 --- a/bin/lib/objects/ail_objects.py +++ b/bin/lib/objects/ail_objects.py @@ -156,7 +156,7 @@ def api_get_object(obj_type, obj_subtype, obj_id): obj = get_object(obj_type, obj_subtype, obj_id) if not obj.exists(): return {'status': 'error', 'reason': 'Object Not Found'}, 404 - options = {'chat', 'content', 'created_at', 'files-names', 'icon', 'images', 'info', 'nb_participants', 'parent', 'parent_meta', 'reactions', 'thread', 'user-account', 'username', 'subchannels', 'threads'} + options = {'address', 'chat', 'content', 'created_at', 'files-names', 'icon', 'images', 'info', 'nb_participants', 'network', 'parent', 'parent_meta', 'protocol', 'reactions', 'thread', 'user-account', 'username', 'subchannels', 'threads'} return obj.get_meta(options=options), 200 @@ -328,7 +328,7 @@ def get_objects_meta(objs, options=set(), flask_context=False): def get_object_card_meta(obj_type, subtype, id, related_btc=False): obj = get_object(obj_type, subtype, id) - meta = obj.get_meta(options={'chat', 'chats', 'created_at', 'icon', 'info', 'map', 'nb_messages', 'nb_participants', 'threads', 'username'}) + meta = obj.get_meta(options={'address', 'chat', 'chats', 'created_at', 'icon', 'info', 'map', 'nb_messages', 'nb_participants', 'network', 'protocol', 'threads', 'username'}) # meta['icon'] = obj.get_svg_icon() meta['svg_icon'] = obj.get_svg_icon() if subtype or obj_type == 'cookie-name' or obj_type == 'cve' or obj_type == 'etag' or obj_type == 'title' or obj_type == 'favicon' or obj_type == 'hhhash': diff --git a/bin/lib/search_engine.py b/bin/lib/search_engine.py index 8e67fcc3..16a1edaa 100755 --- a/bin/lib/search_engine.py +++ b/bin/lib/search_engine.py @@ -7,6 +7,7 @@ import time import uuid +import requests import meilisearch from meilisearch.errors import MeilisearchApiError, MeilisearchCommunicationError, MeilisearchTimeoutError from hashlib import sha256 @@ -48,7 +49,14 @@ def is_meilisearch_enabled(): return IS_MEILISEARCH_ENABLED -MESSAGES_INDEXES = {'cdiscord', 'ctelegram', 'cmatrix'} # TODO dynamic load of chat name -> load all chat protocol +def load_messages_indexes(): + indexes = set() + for protocol in chats_viewer.get_chat_protocols(): + indexes.add(f'c{protocol}') + return indexes + + +MESSAGES_INDEXES = load_messages_indexes() DATERANGE_INDEXES = {'filename', 'title'} @@ -104,6 +112,73 @@ def is_up(self): def get_nb_tasks(self): return self.client.get_tasks().total + def tasks_enqueued(self): + tasks = self.client.get_tasks({"statuses": ["enqueued"],"limit": 100}) + print("currently enqueued tasks:", len(tasks.results)) + for task in tasks.results: + print("=" * 100) + print("uid: ", task.uid) + print("index_uid: ", task.index_uid) + print("type: ", task.type) + print("status: ", task.status) + print("enqueued_at:", task.enqueued_at) + print("started_at: ", task.started_at) + print("finished_at:", task.finished_at) + print("details: ", task.details) + print("error: ", task.error) + + def tasks_processing(self): + tasks = self.client.get_tasks({"statuses": ["processing"],"limit": 100}) + print("currently processing tasks:", len(tasks.results)) + for task in tasks.results: + print("=" * 100) + print("uid: ", task.uid) + print("index_uid: ", task.index_uid) + print("type: ", task.type) + print("status: ", task.status) + print("enqueued_at:", task.enqueued_at) + print("started_at: ", task.started_at) + print("finished_at:", task.finished_at) + print("details: ", task.details) + print("error: ", task.error) + + def tasks_failed(self): + tasks = self.client.get_tasks({"statuses": ["failed"], "limit": 100}) + print("currently failed tasks:", len(tasks.results)) + for task in tasks.results: + print("=" * 100) + print("uid: ", task.uid) + print("index_uid: ", task.index_uid) + print("type: ", task.type) + print("status: ", task.status) + print("enqueued_at:", task.enqueued_at) + print("started_at: ", task.started_at) + print("finished_at:", task.finished_at) + print("details: ", task.details) + print("error: ", task.error) + + def task_status(self, task_uid): + status = self.client.get_task(task_uid) + print(status) + return status + + def task_payload(self, task_uid): + url = f"{M_URL}/tasks/{task_uid}/documents" + r = requests.get(url, headers={"Authorization": f"Bearer {M_KEY}"}) + if r.status_code != 200: + print(f"Could not dump documents for task {task_uid}: HTTP {r.status_code}") + print(r.text[:1000]) + return None + return r.content + + def tasks_cancel_processing(self, task_uids): + cancel_task = self.client.cancel_tasks({"uids": task_uids, "statuses": ["processing"]}) + print("Cancellation task:", cancel_task.task_uid) + + def _wait_task(self, task, timeout_in_ms=120000): + task_uid = getattr(task, 'task_uid', None) or task.get('taskUid') + return self.client.wait_for_task(task_uid, timeout_in_ms=timeout_in_ms) + def search(self, indexes, query, nb=20, page=1, timestamp_from=None, timestamp_to=None, sort='recent'): # TODO investigate attributesToRetrieve speed end_query = [] @@ -177,7 +252,6 @@ def setup_index_searchable_filterable_sortable(self, index_name): self.add(index_name, dummy_document) self.remove(index_name, 'dummy') - def setup_indexes_searchable_filterable_sortable(self): for index_name in get_indexes_names(): self.setup_index_searchable_filterable_sortable(index_name) @@ -246,6 +320,9 @@ def index_crawled_item(self, domain, item, timestamp): def index_chat_message(self, message): index = f'c{message.get_protocol()}' + if index not in MESSAGES_INDEXES: + self._create_index(index) + MESSAGES_INDEXES.add(index) timestamp = message.get_timestamp() chat_instance = message.get_chat_instance() chat = chats_viewer.get_obj_chat('chat', chat_instance, message.get_chat_id()) @@ -421,7 +498,7 @@ def remove_document(index_name, obj_gid): def delete_index(index_name): Engine._delete(index_name) - Engine.client.create_index(index_name, {'primaryKey': 'uuid'}) + Engine.client._create_index(index_name) def log(user_id, index, to_search): logger.warning(f'{user_id} search: {index} - {to_search}') diff --git a/bin/modules/Languages.py b/bin/modules/Languages.py index ef129b1e..cb42c138 100755 --- a/bin/modules/Languages.py +++ b/bin/modules/Languages.py @@ -33,6 +33,11 @@ def compute(self, message): for lang in obj.get_languages(min_probability=0.8, force_gcld3=True): print(lang) domain.add_language(lang) + # PDF + elif obj.type == 'pdf': + lang = obj.detect_language(content=obj.get_content_sample()) + print(self.obj.id, lang) + # Detect Chat Message Language elif obj.type == 'message': lang = obj.detect_language() diff --git a/bin/packages/Date.py b/bin/packages/Date.py index 0226ea8f..9ad9aa70 100644 --- a/bin/packages/Date.py +++ b/bin/packages/Date.py @@ -106,7 +106,7 @@ def get_current_week_day(): return start.strftime("%Y%m%d") def get_current_utc_full_time(): - timestamp = datetime.datetime.fromtimestamp(time.time()) + timestamp = datetime.datetime.now(datetime.timezone.utc) return timestamp.strftime('%Y-%m-%d %H:%M:%S') def get_date_from_timestamp(timestamp): diff --git a/requirements.txt b/requirements.txt index 6651ebc3..d84e9ab6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ redis>4.4.4 python-magic>0.4.15 yara-python>4.0.2 pyfaup-rs +orjson # AIL Sync websockets>9.0 diff --git a/var/www/blueprints/chats_explorer.py b/var/www/blueprints/chats_explorer.py index bc704440..62548917 100644 --- a/var/www/blueprints/chats_explorer.py +++ b/var/www/blueprints/chats_explorer.py @@ -24,6 +24,7 @@ from lib import Language from lib import Tag from lib import module_extractor +from lib import ail_users from lib.objects import ail_objects from lib import images_engine @@ -423,6 +424,7 @@ def objects_message(): languages = Language.get_all_languages() translation_languages = Language.get_translation_languages() + target = ail_users.AILUser(current_user.get_user_id()).get_preferred_language() container_url = ail_objects.get_obj_from_global_id(message['container']).get_link(flask_context=True) extracted = module_extractor.extract(current_user.get_user_id(), 'message', '', message['id'], content=message['content']) extracted_matches = module_extractor.get_extracted_by_match(extracted) @@ -452,6 +454,21 @@ def objects_message_translate(): else: return redirect(url_for('chats_explorer.objects_message', id=message_id, target=target)) +@chats_explorer.route("/objects/message/translate/json", methods=['POST']) +@login_required +@login_user_no_api +def objects_message_translate_json(): + message_id = request.form.get('id') + target = ail_users.AILUser(current_user.get_user_id()).get_preferred_language() + message, r_code = chats_viewer.api_get_message(message_id, translation_target=target) + if r_code != 200: + return create_json_response(message, r_code) + + return jsonify({ + 'id': message_id, + 'translation': message.get('translation') + }) + @chats_explorer.route("/objects/message/detect/language", methods=['GET']) @login_required @login_user_no_api diff --git a/var/www/blueprints/crawler_splash.py b/var/www/blueprints/crawler_splash.py index a18f3ca4..5951197a 100644 --- a/var/www/blueprints/crawler_splash.py +++ b/var/www/blueprints/crawler_splash.py @@ -11,8 +11,9 @@ import sys import time from datetime import datetime +from pathlib import Path -from flask import render_template, jsonify, request, Blueprint, redirect, url_for, Response, send_file, abort +from flask import render_template, jsonify, request, Blueprint, redirect, url_for, Response, send_file, abort, current_app from flask_login import login_required, current_user sys.path.append('modules') @@ -25,6 +26,7 @@ ################################## # Import Project packages ################################## +from lib.ail_core import generate_uuid from lib import crawlers from lib import Language from lib.objects import Domains @@ -53,6 +55,34 @@ def api_validator(message, code): return Response(json.dumps(message, indent=2, sort_keys=True), mimetype='application/json'), code +def _import_lookyloo_archive_from_upload(uploaded_file, logger): + if not uploaded_file or not uploaded_file.filename: + return False, 'No archive file was provided.' + + filename = uploaded_file.filename.strip() + if not filename.lower().endswith('.zip'): + return False, 'Invalid file type: only .zip archives are supported.' + + archive_name = f"{generate_uuid()}.zip" + imports_root = Path(os.environ['AIL_HOME']) / 'temp' / 'import' + archive_path = imports_root / archive_name + + try: + imports_root.mkdir(parents=True, exist_ok=True) + uploaded_file.save(str(archive_path)) + + crawler_processor = crawlers.CrawlerCapturesProcessor(logger) + imported = crawler_processor.process_lookyloo_archive(archive_name) + if not imported: + return False, 'Invalid or unsupported Lacus capture archive format.' + return True, f'Lacus capture archive imported successfully ({len(imported)} object(s)).' + except Exception as e: + logger.exception(f'Error while importing lookyloo archive: {e}') + return False, f'Archive processing failed: {e}' + finally: + archive_path.unlink(missing_ok=True) + + def create_json_response(data, status_code): if status_code == 403: abort(403) @@ -61,6 +91,7 @@ def create_json_response(data, status_code): return Response(json.dumps(data, indent=2, sort_keys=True), mimetype='application/json'), status_code + # ============= ROUTES ============== @crawler_splash.route("/crawlers/dashboard", methods=['GET']) @login_required @@ -112,9 +143,19 @@ def manual(): crawlers_types=crawlers_types, proxies=proxies, l_cookiejar=l_cookiejar, + import_status=request.args.get('import_status'), + import_message=request.args.get('import_message'), tags_selector_data=Tag.get_tags_selector_data()) +@crawler_splash.route("/crawlers/import_lookyloo_archive", methods=['POST']) +@login_required +@login_user_no_api +def import_lookyloo_archive(): + success, message = _import_lookyloo_archive_from_upload(request.files.get('lookyloo_archive'), logger=current_app.logger) + return redirect(url_for('crawler_splash.manual', import_status='success' if success else 'error', import_message=message)) + + @crawler_splash.route("/crawlers/send_to_spider", methods=['POST']) @login_required @login_user_no_api @@ -1061,10 +1102,11 @@ def crawler_settings(): is_manager_connected = crawlers.get_lacus_connection_metadata(force_ping=True) is_crawler_working = crawlers.is_test_ail_crawlers_successful() - crawler_error_mess = crawlers.get_test_ail_crawlers_message() + crawler_test_metadata = crawlers.get_test_ail_crawlers_metadata() is_onion_filter_enabled = crawlers.is_onion_filter_enabled(cache=False) is_onion_filter_unknown = crawlers.is_onion_filter_unknown(cache=False) + crawler_logs = crawlers.get_last_crawler_logs(lines=100) is_crawler_filter_local_ips_enabled = crawlers.is_crawler_filter_local_ips_enabled(cache=False) # TODO REGISTER PROXY @@ -1078,9 +1120,10 @@ def crawler_settings(): nb_captures=nb_captures, # all_proxies=all_proxies, is_crawler_working=is_crawler_working, - crawler_error_mess=crawler_error_mess, + crawler_test_metadata=crawler_test_metadata, is_onion_filter_enabled=is_onion_filter_enabled, is_onion_filter_unknown=is_onion_filter_unknown, + crawler_logs=crawler_logs, is_crawler_filter_local_ips_enabled=is_crawler_filter_local_ips_enabled ) diff --git a/var/www/blueprints/objects_favicon.py b/var/www/blueprints/objects_favicon.py index d5975f4e..d9a8d628 100644 --- a/var/www/blueprints/objects_favicon.py +++ b/var/www/blueprints/objects_favicon.py @@ -37,8 +37,14 @@ def favicon(filename): if not filename: abort(404) filename = filename.replace('/', '') - if not 9 <= len(filename) <= 11 or not filename.isascii() or not filename.isalnum(): + if not 9 <= len(filename) <= 11 or not filename.isascii(): abort(404) + if filename.startswith('-'): + if not filename[1:].isalnum(): + abort(404) + else: + if not filename.isalnum(): + abort(404) fav = Favicons.Favicon(filename) return send_from_directory(Favicons.FAVICON_FOLDER, fav.get_rel_path(), as_attachment=False, mimetype='image') diff --git a/var/www/blueprints/objects_item.py b/var/www/blueprints/objects_item.py index 26d47a67..ae5c53dd 100644 --- a/var/www/blueprints/objects_item.py +++ b/var/www/blueprints/objects_item.py @@ -23,6 +23,7 @@ from lib import ConfigLoader from lib import chats_viewer from lib import item_basic +from lib import Language from lib.objects.Items import Item from lib.objects.Screenshots import Screenshot from lib import Tag @@ -126,6 +127,7 @@ def showItem(): # # TODO: support post is_hive_connected=False, ollama_enabled=images_engine.is_ollama_enabled(), meta=meta, message=message, + all_languages=Language.get_all_languages(), extracted=extracted, extracted_matches=extracted_matches) # kvrocks data diff --git a/var/www/blueprints/objects_pdf.py b/var/www/blueprints/objects_pdf.py index a031cad4..a4605472 100644 --- a/var/www/blueprints/objects_pdf.py +++ b/var/www/blueprints/objects_pdf.py @@ -11,7 +11,7 @@ import json from flask import render_template, jsonify, request, Blueprint, redirect, url_for, Response, abort, send_file, send_from_directory -from flask_login import login_required +from flask_login import login_required, current_user # Import Role_Manager from Role_Manager import login_admin, login_read_only, no_cache @@ -23,6 +23,7 @@ from lib.objects import PDFs from lib import Language from lib import Tag +from lib import ail_users from packages import Date # ============ BLUEPRINT ============ @@ -55,9 +56,8 @@ def pdf_pdfa(pdf_id): @no_cache def pdf_translate(): obj_id = request.form.get('id') - source = request.form.get('source') target = request.form.get('target') - r = PDFs.api_create_translation_task(obj_id, source, target, force=True) + r = PDFs.api_create_translation_task(obj_id, target, force=True) if r[1] != 200: return create_json_response(r[0], r[1]) else: @@ -104,13 +104,15 @@ def pdf_translated_progress(): @login_read_only def pdf_view(): obj_id = request.args.get('id') - r = PDFs.api_get_meta(obj_id, options={'author', 'file-meta', 'file-names', 'markdown_id', 'translated', 'svg_icon'}, flask_context=True) + r = PDFs.api_get_meta(obj_id, options={'author', 'file-meta', 'file-names', 'language', 'markdown_id', 'translated', 'svg_icon'}, flask_context=True) if r[1] != 200: return create_json_response(r[0], r[1]) meta = r[0] + preferred_language = ail_users.AILUser(current_user.get_user_id()).get_preferred_language() return render_template("ShowPDF.html", ail_tags=Tag.get_modal_add_tags(meta['id'], object_type='item'), translation_languages=Language.get_translation_languages(), + translation_target=preferred_language, meta=meta) diff --git a/var/www/blueprints/search_b.py b/var/www/blueprints/search_b.py index a2cced1a..6bcbf1b1 100644 --- a/var/www/blueprints/search_b.py +++ b/var/www/blueprints/search_b.py @@ -21,6 +21,7 @@ # Import Project packages ################################## from lib import ail_core +from lib import chats_viewer from lib import search_engine from lib.objects import SSHKeys @@ -96,6 +97,7 @@ def search_dashboard(): return render_template('search_dashboard.html', bootstrap_label=bootstrap_label, + chat_protocols=chats_viewer.get_chat_protocols_meta(), indexes_str=indexes_str, selected_scopes=indexes, to_search=search, diff --git a/var/www/blueprints/settings_b.py b/var/www/blueprints/settings_b.py index aa2bb863..0a0a92ae 100644 --- a/var/www/blueprints/settings_b.py +++ b/var/www/blueprints/settings_b.py @@ -25,6 +25,7 @@ from lib import ail_config from lib import ail_queues from lib import ail_users +from lib import Language from lib import d4 from lib import passivedns from lib.ConfigLoader import ConfigLoader @@ -84,6 +85,7 @@ def user_profile(): meta = r[0] global_2fa = ail_users.is_2fa_enabled() return render_template("user_profile.html", meta=meta, global_2fa=global_2fa, + all_languages=Language.get_all_languages(), misps=ail_config.get_user_config_misps(user_id), flowintels=ail_config.get_user_config_flowintels(user_id), rulezet_error=request.args.get('rulezet_error'), @@ -350,6 +352,16 @@ def delete_rulezet(): ## --USER RULEZET-- ## +@settings_b.route("/settings/user/preferred_language/edit", methods=['POST']) +@login_required +@login_user +def edit_preferred_language(): + user_id = current_user.get_user_id() + preferred_language = request.form.get('preferred_language') + r = ail_users.api_edit_user_preferred_language(user_id, preferred_language) + if r[1] != 200: + return redirect(url_for('settings_b.user_profile', rulezet_error=r[0].get('reason'))) + return redirect(url_for('settings_b.user_profile', rulezet_success='Preferred language saved successfully')) @settings_b.route("/settings/users/purge_failed_login", methods=['GET']) @login_required diff --git a/var/www/static/css/pivotick.css b/var/www/static/css/pivotick.css index 8fc27131..78afb65d 100644 --- a/var/www/static/css/pivotick.css +++ b/var/www/static/css/pivotick.css @@ -1 +1 @@ -.pvt-graphcontrols{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;pointer-events:none}.pvt-graphcontrols .pvt-graphcontrols-elements{display:flex;align-items:flex-start;flex-direction:row;gap:12px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-panel{display:flex;flex-direction:column;background-color:color-mix(in srgb,var(--pvt-bg) 80%,white);box-shadow:var(--pvt-graph-navigation-control-container-shadow);border-radius:4px;margin-bottom:6px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-panel .pivotick-divider{border-top:1px solid color-mix(in srgb,var(--pvt-border-color) 40%,transparent);margin:5px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout{pointer-events:all}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout .pvt-graphcontrols-layout-type-container{display:flex;flex-direction:row;align-items:center}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout .pvt-graphcontrols-layout-type-container .pvt-graphcontrols-layout-type-options{max-width:0;display:flex;flex-direction:row;transition:max-width .2s ease-out;overflow:hidden}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout:hover .pvt-graphcontrols-layout-type-options{max-width:unset}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button{border:none;background:none;display:flex;align-items:center;justify-content:center;padding:3px;cursor:pointer;font-size:1rem;width:24px;height:24px;color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);transition:font-size .15s ease}@media(prefers-color-scheme:dark){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button{color:#bbb}}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button.with-text{font-size:.7rem;width:unset;max-width:10em}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:hover:not(:disabled),.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:active:not(:disabled){color:color-mix(in srgb,var(--pvt-text-color-5) 70%,black)}@media(prefers-color-scheme:dark){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:hover:not(:disabled),.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:active:not(:disabled){color:#fff}}@media(prefers-color-scheme:dark){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:disabled{filter:brightness(.6)}}@media(prefers-color-scheme:light){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:disabled{filter:brightness(2)}}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:disabled{cursor:not-allowed}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection{opacity:0;transition:opacity .1s ease-out,transform .1s ease-out;transform:translate(-10px);border-radius:2px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection.shown{opacity:100;transform:translate(0);pointer-events:all}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-title{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom:1px solid var(--pvt-tooltip-floating-bg-color);text-align:center;padding:4px 8px;display:none}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar{display:flex;align-items:center;background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom:1px solid var(--pvt-tooltip-floating-bg-color);padding:2px;margin-bottom:4px;border-top-right-radius:4px;border-top-left-radius:4px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar .pvt-action-list{width:100%;display:flex;align-items:center;flex-direction:row;gap:0em}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar .pvt-action-list .pivotick-button{border-radius:4px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar .pvt-action-list .pivotick-button .pvt-icon{font-size:20px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu .pvt-action-item{padding:6px 8px;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu .pvt-action-item .pvt-icon{font-size:20px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu .pvt-action-item .pvt-action-text{margin-left:1em;text-align:end}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-primary:hover{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-secondary:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-info:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-warning:hover{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-danger:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-success:hover{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}.pvt-graphnavigation-elements button{border:none;background:none;display:flex;align-items:center;justify-content:center;padding:3px;cursor:pointer;font-size:1rem;color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);transition:font-size .15s ease}@media(prefers-color-scheme:dark){.pvt-graphnavigation-elements button{color:#bbb}}.pvt-graphnavigation-elements button:hover,.pvt-graphnavigation-elements button:active{color:color-mix(in srgb,var(--pvt-text-color-5) 70%,black)}@media(prefers-color-scheme:dark){.pvt-graphnavigation-elements button:hover,.pvt-graphnavigation-elements button:active{color:#fff}}.pvt-graphnavigation-elements .pvt-graphnavigation-zoom-fit{background-color:color-mix(in srgb,var(--pvt-bg) 80%,white);box-shadow:var(--pvt-graph-navigation-control-container-shadow);border-radius:4px;margin-bottom:6px}.pvt-graphnavigation-elements .pvt-graphnavigation-zoom-controls{display:flex;flex-direction:column;background-color:color-mix(in srgb,var(--pvt-bg) 80%,white);box-shadow:var(--pvt-graph-navigation-control-container-shadow);border-radius:4px}.pvt-graphnavigation-elements .pvt-graphnavigation-zoom-controls .pvt-zoom-divider{border-top:1px solid color-mix(in srgb,var(--pvt-border-color) 40%,transparent);margin:0 5px}.pvt-sidebar{position:relative;background:var(--pvt-ui-bg);box-shadow:var(--pvt-sidebar-layout-shadow-right)}.pvt-sidebar .pvt-sidebar-elements{height:100%;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:10px}.pvt-sidebar .pvt-sidebar-elements .enter-active{opacity:1!important;transform:translate(0)!important}.pvt-sidebar .pvt-sidebar-elements .enter-ready{transition:opacity .1s ease,transform .1s ease;opacity:0;transform:translate(-8px)}.pvt-sidebar .pvt-sidebar-elements .pvt-extra-panel{display:flex;flex-direction:column;gap:10px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-header-panel{display:none;min-height:40px;align-items:center;padding:2px 6px;font-weight:300;color:var(--pvt-text-color-5)}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-header-panel.pvt-neighbors-header-panel{display:flex;align-items:center}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel{min-height:32px;padding:6px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel{position:relative;width:100%;height:var(--pvt-sidebar-width);box-sizing:border-box}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pvt-neighbors-count{position:absolute;right:10px;bottom:5px;font-size:14px;font-weight:300;color:var(--pvt-text-color-5)}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels{height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=egograph]{border:var(--pvt-sidebar-panel-border);height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=egograph] div{height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=egograph] .pivotick .pvt-canvas{background-image:none}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details{margin-bottom:4px;display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .edge{margin-right:4px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .edge.edge-out{color:var(--pvt-text-color-primary);width:2em!important}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .edge.edge-in{color:var(--pvt-text-color-secondary);width:2em!important}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer{display:flex;flex-direction:row;align-items:center;gap:5px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer .pvt-neighbors-list__nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d;width:30px;height:30px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer .pvt-neighbors-list__nodepreview .pvt-mainheader-icon{width:26px;height:26px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbor-edge-description{margin-left:auto;border-radius:2px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbor-edge-description.empty-label{color:var(--pvt-text-color-3);font-style:italic}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=stats] .main-stats-container{display:flex;flex-direction:column;gap:10px}.pvt-sidebar .pvt-sidebar-collapse-container{position:absolute;right:-40px;bottom:7px;background-color:var(--pvt-sidebar-collapse-bg);color:var(--pvt-sidebar-collapse-color);box-shadow:var(--pvt-sidebar-collapse-shadow);border:1px solid var(--pvt-sidebar-collapse-border-color);padding:4px;font-size:20px;border-radius:50%;width:26px;height:26px;display:flex;justify-content:center;align-items:center;cursor:pointer}.pvt-sidebar .pvt-sidebar-collapse-container:hover{color:color-mix(in srgb,var(--pvt-sidebar-collapse-color) 70%,black)}.pvt-sidebar .pvt-sidebar-collapse-container:active{color:color-mix(in srgb,var(--pvt-sidebar-collapse-color) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-sidebar .pvt-sidebar-collapse-container .pvt-sidebar-collapse-button{display:flex;justify-content:center;align-items:center;width:24px;height:24px}.pvt-sidebar .pvt-sidebar-collapse-container .pvt-sidebar-collapse-button-expand{display:none}.pvt-sidebar-collapsed .pvt-sidebar-collapse-button-collapse{display:none!important}.pvt-sidebar-collapsed .pvt-sidebar-collapse-button-expand{display:flex!important}.pvt-mainheader-panel{min-height:70px;display:flex;justify-content:flex-start;align-items:center;box-sizing:border-box;padding:10px 12px;box-shadow:var(--pvt-sidebar-layout-shadow-bottom)}.pvt-mainheader-panel>div{display:flex;flex-direction:row;align-items:center;gap:10px}.pvt-mainheader-panel>div .pvt-mainheader-nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d}.pvt-mainheader-panel>div .pvt-mainheader-nodepreview .pvt-mainheader-icon{width:42px;height:42px}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo{flex-grow:1;display:flex;flex-direction:column;justify-content:center;font-family:Segoe UI,sans-serif}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-name{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-subtitle{font-size:12px;color:var(--pvt-text-color-5);text-overflow:ellipsis;overflow:hidden;white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-action{flex-shrink:1}.pvt-aggregated-property-section{margin-bottom:14px}.pvt-aggregated-property-section .pvt-aggregated-property-title{display:inline-block;padding:4px 8px;text-align:left;font-size:.9rem;font-weight:500;color:var(--pvt-text-color-5);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;text-transform:uppercase}.pvt-aggregated-property-section .pvt-aggregated-property-container{margin:0 4px 4px;display:flex;flex-direction:column;gap:2px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row{display:flex;flex-direction:row;align-items:center}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value{flex-grow:1;font-family:monospace;font-size:.8rem}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container{position:relative;margin-right:8px;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:all;user-select:all;font-size:.875rem;font-weight:400;color:var(--pvt-text-color-primary)}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions{display:none;position:absolute;right:4px;flex-direction:row;gap:4px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button{border:none;background:none;padding:0;cursor:pointer;font-size:1rem;color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);transition:font-size .15s ease;max-height:22px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button:hover:not(:disabled),.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button:active:not(:disabled){color:color-mix(in srgb,var(--pvt-text-color-5) 70%,black)}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button:disabled{filter:brightness(2);cursor:not-allowed}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container:hover .pvt-aggregated-property-actions{display:inline-flex}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-count{--pvt-inline-bar-width: 60px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value-dim{display:inline-block;width:100%;color:var(--pvt-text-color-3);font-style:italic;text-align:start}.pivotick-tab-controls{display:flex;flex-direction:row;gap:4px}.pvt-slide-panel{display:hidden;position:relative;background:var(--pvt-ui-bg);transform:translate(100%);transition:transform .1s ease-in-out;border-top:1px solid var(--pvt-border-color);box-shadow:var(--pvt-sidebar-layout-shadow-left)}.pvt-slide-panel.open{display:flex;flex-direction:column;transform:translate(0)}.pvt-slide-panel .pvt-slide-panel__header{padding:12px;font-weight:700;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;border-bottom:var(--pvt-sidebar-panel-border)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:active{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:disabled{cursor:not-allowed;transform:none}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button{padding:.25rem .5rem;align-self:flex-start;font-size:1.2rem;line-height:.8rem;margin-left:auto}.pvt-slide-panel .pvt-slide-panel__content{flex-grow:1;padding:16px;overflow-y:auto;overflow-x:hidden}.pvt-slide-panel .pvt-slide-panel__content .pvt-sidebar-separator{border-bottom:var(--pvt-sidebar-panel-border);margin:24px -16px}.pvt-slide-panel .pvt-slide-panel__content .pvt-graph-filter-container{display:flex;flex-direction:column;gap:0px}.pvt-searchbox div.search-container{position:relative;display:flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;padding:6px 12px;border-radius:4px;color:var(--pvt-text-color-4)}.pvt-searchbox div.search-container div.input-container{position:relative;display:flex;width:100%}.pvt-searchbox div.search-container div.input-container span.icon-container{position:absolute;inset-block:0;inset-inline-start:0;display:flex;align-items:center;padding-inline-start:.75rem;pointer-events:none}.pvt-searchbox div.search-container div.input-container span.icon-container svg{width:1em;height:1em;color:var(--pvt-text-color-6);opacity:.7}.pvt-searchbox div.search-container div.input-container input{display:inline-block;width:100%;padding:.5rem .75rem;font-size:1rem;border-radius:.25rem;transition:border-color .2s ease,box-shadow .2s ease}.pvt-searchbox div.search-container div.input-container input::placeholder{opacity:.7}.pvt-searchbox div.search-container div.input-container input:focus{outline:none}.pvt-searchbox div.search-container div.input-container input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.pvt-searchbox div.search-container div.input-container input{background-color:var(--pvt-ui-bg);color:var(--pvt-text-color-6);border:1px solid var(--pvt-border-color)}.pvt-searchbox div.search-container div.input-container input::placeholder{color:var(--pvt-text-color-6);opacity:.7}.pvt-searchbox div.search-container div.input-container input:focus{border-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,black)}.pvt-searchbox div.search-container div.input-container input:disabled{background-color:var(--pvt-bg-color-3);cursor:not-allowed}.pvt-searchbox div.search-container div.input-container input{display:block;width:100%;padding:.8rem;padding-inline-start:2.5rem;padding-inline-end:5rem}.pvt-searchbox div.pvt-search-results{display:flex;flex-direction:column;gap:.5em;padding:6px 12px}.pvt-searchbox div.pvt-search-results .pvt-search-result{border:1px solid var(--pvt-bg-color-8);padding:4px 6px;border-radius:4px;cursor:pointer}.pvt-searchbox div.pvt-search-results .pvt-search-result:hover,.pvt-searchbox div.pvt-search-results .pvt-search-result.active{background-color:var(--pvt-bg-color-8)}.pvt-searchbox div.pvt-search-results .pvt-search-result div{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;gap:8px}.pvt-searchbox div.pvt-search-results .pvt-search-result div .pvt-search-result__nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d;width:36px;height:36px}.pvt-searchbox div.pvt-search-results .pvt-search-result div .pvt-search-result__nodepreview .pvt-mainheader-icon{width:30px;height:30px}.pvt-searchbox div.pvt-search-results .pvt-search-result div .pvt-search-result__name{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all;font-size:1em}.pvt-searchbox div.pvt-search-results .pvt-search-result .pvt-search-result__info{display:flex;gap:.5em;flex-direction:row;padding-left:42px}.pvt-searchbox div.pvt-search-results .pvt-search-result .pvt-search-result__info .pvt-search-result__info_key{font-weight:300;color:var(--pvt-text-color-5);white-space:normal;-webkit-user-select:all;user-select:all;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}.pvt-searchbox div.pvt-search-results .pvt-search-result .pvt-search-result__info .pvt-search-result__info_value{color:var(--pvt-text-color-primary);-webkit-user-select:all;user-select:all;min-height:1em;white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pvt-searchbox .pvt-search-summary{padding:6px 12px;font-weight:300;font-size:.9em;color:var(--pvt-text-color-4)}.pvt-searchbox .pvt-search-hints{padding:6px 12px;display:flex;flex-direction:row;gap:1em;font-size:.9em}.pvt-searchbox .pvt-search-hints span{display:inline-flex;align-items:center;gap:.25em}.pvt-searchbox .pvt-search-hints span .pvt-search-text{line-height:1}.pvt-searchbox .pvt-search-hints span .pvt-search-icon{display:inline-flex;align-items:center;justify-content:center;padding:4px;border-radius:4px;background:var(--pvt-bg-color-8);line-height:.9em}.pvt-searchbox .pvt-search-hints span .pvt-search-icon svg{width:1em;height:1em;color:var(--pvt-text-color-6);opacity:.7}.pvt-toolbar{background:var(--pvt-ui-bg);box-shadow:var(--pvt-sidebar-layout-shadow-bottom);border-left:var(--pvt-sidebar-panel-border)}.pvt-toolbar .pvt-toolbar-elements{display:flex;flex-direction:row;gap:4px;align-items:center;margin:2px 6px;width:100%;padding-left:.5rem}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container{position:relative;display:inline-flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;padding:6px 12px;border-radius:4px;background-color:var(--pvt-bg-color-1);color:var(--pvt-text-color-4);box-shadow:var(--pvt-action-container-shadow)}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container span.action-text{font-size:.8em;margin:0 .25em;-webkit-user-select:none;user-select:none}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container span.action-text .active-filter-subtext{font-weight:400;font-size:.9em;display:inline-flex;flex-direction:row;flex-wrap:nowrap;gap:4px;margin-left:4px}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container span.icon-container svg{width:.8rem;height:.8rem;color:var(--pvt-text-color-6);opacity:.7}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button:active{transition:transform .05s ease-out;transform:scale(.95)}.pvt-toolbar .pvt-toolbar-elements .pvt-right{margin-left:auto;display:flex;flex-direction:row;flex-wrap:nowrap;gap:4px}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:active{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:disabled{cursor:not-allowed;transform:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black)}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter{padding:.5rem}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group{display:inline-flex;flex-direction:row;flex-wrap:nowrap}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:active{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:disabled{cursor:not-allowed;transform:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black)}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button{padding:.5rem}.pvt-slide-panel .pvt-hidden-nodes-container h4{margin:0;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list{margin-top:24px;display:flex;flex-direction:column;gap:6px}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list .hidden-node{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all;-webkit-user-select:auto;user-select:auto;display:flex;flex-direction:row;align-items:baseline;cursor:help}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list .hidden-node .subtext{margin:0 .5em 0 auto;color:var(--pvt-text-color-5);display:inline-flex;gap:.25em}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list .hidden-node .subtext .nodeinfo{display:inline-flex;flex-direction:row;align-items:center;gap:2px}.pvt-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--pvt-modal-overlay-bg);display:grid;z-index:1000}.pvt-modal-overlay.pvt-modal-overlay-center{place-items:center}.pvt-modal-overlay.pvt-modal-overlay-top{align-items:start;justify-items:center;padding-top:4rem}.pvt-modal{display:hidden;background:var(--pvt-modal-bg);color:var(--pvt-modal-text);width:100%;max-height:85vh;border-radius:6px;overflow:hidden;box-shadow:var(--pvt-modal-shadow);animation:pvt-modal-in .18s ease-out}.pvt-modal.pvt-modal-open{display:block}.pvt-modal.pvt-modal-sm{max-width:min(100% - 2rem,320px)}.pvt-modal.pvt-modal-md{max-width:min(100% - 2rem,520px)}.pvt-modal.pvt-modal-lg{max-width:min(100% - 2rem,720px)}.pvt-modal.pvt-modal-xl{max-width:min(100% - 2rem,960px)}.pvt-modal.pvt-modal-fluid{width:90%;max-width:none}@media(max-width:600px){.pvt-modal{max-width:calc(100% - 2rem)}}.pvt-modal .pvt-modal__header{padding:1rem;display:flex;align-items:center;font-weight:600;border-bottom:1px solid var(--pvt-border-color)}.pvt-modal .pvt-modal__body{padding:1.5rem;overflow-y:auto}.pvt-modal .pvt-modal__footer{padding:.75rem;display:flex;justify-content:flex-end;gap:.75rem;border-top:1px solid var(--pvt-border-color)}@keyframes pvt-modal-in{0%{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.pvt-tooltip{position:absolute;pointer-events:auto;background-color:var(--pvt-menu-bg-color);border:var(--pvt-menu-border-color);box-shadow:var(--pvt-menu-shadow);font-size:13px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.4;white-space:nowrap;left:-10000px;opacity:0;transition:opacity .1s ease-out;z-index:1000}.pvt-tooltip.shown{opacity:100}.pvt-tooltip.pvt-tooltip-floating{border-color:var(--pvt-tooltip-floating-bg-color)}.pvt-tooltip .pvt-tooltip-topbar{display:flex;align-items:center;background-color:var(--pvt-tooltip-floating-bg-color);padding:2px}.pvt-tooltip .pvt-tooltip-topbar.draggable{cursor:grab;-webkit-user-select:none;user-select:none}.pvt-tooltip .pvt-tooltip-topbar.draggable :active{cursor:grabbing}.pvt-tooltip .pvt-tooltip-topbar .close-button{margin-left:auto}.pvt-tooltip .pvt-tooltip-container{position:relative;display:flex;flex-direction:column;gap:4px;max-width:500px;max-height:500px;min-width:200px;min-height:100px;resize:auto;overflow:hidden}.pvt-tooltip .pvt-tooltip-container:before{--oversize-container-size: 10px;content:"";position:absolute;top:calc(-1 * var(--oversize-container-size));left:calc(-1 * var(--oversize-container-size));width:calc(100% + 2 * var(--oversize-container-size));height:calc(100% + 2 * var(--oversize-container-size));background:#0000;z-index:-1}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container{display:flex;flex-direction:row;align-items:center;gap:10px;padding:12px 8px 4px;border-bottom:var(--pvt-sidebar-panel-border);background-color:var(--pvt-sidebar-mainpanelheader-bg)}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-topright{position:absolute;top:2px;right:2px;color:var(--pvt-text-color-2)}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d;width:38px;height:38px}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodepreview .pvt-mainheader-icon{width:32px;height:32px}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo{flex-grow:1;display:flex;flex-direction:column;justify-content:center;font-family:Segoe UI,sans-serif}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-name{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);-webkit-user-select:all;user-select:all;white-space:wrap}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-subtitle{font-size:12px;color:var(--pvt-text-color-5);-webkit-user-select:all;user-select:all;white-space:wrap}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-action{flex-shrink:1}.pvt-tooltip .pvt-tooltip-container .pvt-properties-container{margin-bottom:4px}.pvt-tooltip .pvt-tooltip-container .pvt-properties-container dl.pvt-property-list{background:var(--pvt-tooltip-property-list);gap:0px 12px}.pvt-tooltip .pvt-tooltip-container .pvt-properties-container dl.pvt-property-list .pvt-property-row{padding:.2em}.pvt-tooltip .pvt-tooltip-container .pivotick-extra-content-container{padding:8px}.pivotick-shadowlink-container{pointer-events:none;position:absolute;top:0;left:0;width:100%;height:100%}.pivotick-shadowlink-container path.pivotick-shadowlink{stroke:color-mix(in srgb,var(--pvt-edge-stroke) 100%,rgba(255,255,255,0));stroke-width:2;stroke-opacity:.3;stroke-dasharray:var(--pvt-edge-stroke-dasharray);animation:var(--pvt-edge-animation)}.pvt-contextmenu{position:absolute;pointer-events:auto;background-color:var(--pvt-menu-bg-color);border:var(--pvt-menu-border-color);box-shadow:var(--pvt-menu-shadow);font-size:13px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.4;white-space:nowrap;left:-10000px;opacity:0;z-index:1020;transition:opacity .1s ease-out,transform .1s ease-out;transform:translateY(-10px);min-width:200px;border-radius:4px;color:var(--pvt-text-color-5)}.pvt-contextmenu.shown{opacity:100;transform:translateY(0)}.pvt-contextmenu .pvt-contextmenu-topbar{display:flex;align-items:center;background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom:1px solid var(--pvt-tooltip-floating-bg-color);padding:2px;margin-bottom:4px;border-top-right-radius:4px;border-top-left-radius:4px}.pvt-contextmenu .pvt-contextmenu-topbar .pvt-action-list{width:100%;display:flex;flex-direction:row;align-items:center;gap:.5em}.pvt-contextmenu .pvt-contextmenu-topbar .pvt-action-list .pivotick-button{border-radius:4px}.pvt-contextmenu .pvt-contextmenu-topbar .pvt-action-list .pivotick-button .pvt-icon{font-size:20px}.pvt-contextmenu .pvt-contextmenu-mainmenu{display:flex;flex-direction:row;align-items:center;gap:10px;background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom-right-radius:4px;border-bottom-left-radius:4px}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list{width:100%}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list .pvt-action-item{padding:6px 8px;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list .pvt-action-item .pvt-icon{font-size:20px}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list .pvt-action-item .pvt-action-text{margin-left:1em;text-align:end}.pvt-contextmenu .pvt-action-item-primary{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}.pvt-contextmenu .pvt-action-item-primary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-primary) 80%,#fff)}.pvt-contextmenu .pvt-action-item-secondary{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-contextmenu .pvt-action-item-secondary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary),#000);color:color-mix(in srgb,var(--pvt-text-color-for-primary) 80%,secondary)}.pvt-contextmenu .pvt-action-item-info{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-contextmenu .pvt-action-item-info:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-info) 80%,#fff)}.pvt-contextmenu .pvt-action-item-warning{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}.pvt-contextmenu .pvt-action-item-warning:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-warning) 80%,#fff)}.pvt-contextmenu .pvt-action-item-danger{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-contextmenu .pvt-action-item-danger:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-danger) 80%,#fff)}.pvt-contextmenu .pvt-action-item-success{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}.pvt-contextmenu .pvt-action-item-success:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-success) 80%,#fff)}.pvt-contextmenu .pvt-action-item-outline-primary:hover{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}.pvt-contextmenu .pvt-action-item-outline-secondary:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-contextmenu .pvt-action-item-outline-info:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-contextmenu .pvt-action-item-outline-warning:hover{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}.pvt-contextmenu .pvt-action-item-outline-danger:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-contextmenu .pvt-action-item-outline-success:hover{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}:root{--pvt-bg: var(--pvt-bg-color-0);--pvt-ui-bg: var(--pvt-bg-color-0);--pvt-border-color: var(--pvt-bg-color-7);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #f2f2f2;--pvt-theme-info: #25B6EB;--pvt-theme-warning: #F59E0B;--pvt-theme-danger: #DC2626;--pvt-theme-success: #16A34A;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #fff;--pvt-text-color-1: #e0e0e0;--pvt-text-color-2: #bbb;--pvt-text-color-3: #999;--pvt-text-color-4: #666;--pvt-text-color-5: #333;--pvt-text-color-6: #000;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), black 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), black 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), black 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), black 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), black 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), black 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #000;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #fff;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #aaaaaa55;--pvt-sidebar-bg: var(--pvt-bg-color-0);--pvt-sidebar-mainpanelheader-bg: var(--pvt-bg-color-1);--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-0);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-layout-shadow-top: rgba(0, 0, 0, .07) 3px -2px 3px 0px, rgba(0, 0, 0, .04) 2px -3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-6);--pvt-tooltip-property-list: var(--pvt-bg-color-2);--pvt-menu-bg-color: var(--pvt-bg-color-1);--pvt-menu-border-color: var(--pvt-text-color-1);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18), rgba(0, 0, 0, .09) 0 -1px 2px;--pvt-modal-bg: var(--pvt-bg-color-0);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: #f5f5f5;--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(0, 0, 0, .22) 0px 0px 4px, rgba(0, 0, 0, .3) 0px 1px 2px;--pvt-selection-color: #f0636a;--pvt-selection-stroke-color: #f0636a;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #007acc;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 2;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: #f0636a;--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-highlighted-stroke: #007acc;--pvt-node-highlighted-stroke-width: 2;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #333;--pvt-node-cluster-fill: rgba(0, 0, 0, .062745098);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #fff);--pvt-edge-stroke: color-mix(in srgb, #007acc 50%, #fff);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-4);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-6);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px orange);--pvt-edge-label-selected-stroke: orange;--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-edge-label-color);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-4);--pvt-inline-bar-bg: var(--pvt-bg-color-2);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 20%, #fff) 0%, var(--pvt-bg-color-primary) 70%, color-mix(in srgb, var(--pvt-bg-color-primary) 80%, #000) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: color-mix(in srgb, var(--pvt-text-color-6) 15%, transparent) 0px 1px 1px 0px, color-mix(in srgb, var(--pvt-text-color-6) 10%, transparent) 0px 0px 2px 0px, inset 0 1px 2px rgba(0, 0, 0, .05);--pvt-bg-color-0: #fff;--pvt-bg-color-1: #fafafa;--pvt-bg-color-2: #f3f3f3;--pvt-bg-color-3: #ededed;--pvt-bg-color-4: #e6e6e6;--pvt-bg-color-5: #e0e0e0;--pvt-bg-color-6: #d6d6d6;--pvt-bg-color-7: #cccccc;--pvt-bg-color-8: #c2c2c2;--pvt-vibrant-blue: #007acc;--pvt-vibrant-indigo: #7000cc;--pvt-vibrant-lobster: #f0636a;--pvt-vibrant-green: #81dd18;--pvt-vibrant-amaranth: #eb2e53}@media(prefers-color-scheme:dark){:root:not([data-theme]){--pvt-bg: var(--pvt-bg-color-2);--pvt-ui-bg: var(--pvt-bg-color-5);--pvt-border-color: var(--pvt-bg-color-3);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #666666;--pvt-theme-info: #2E67F8;--pvt-theme-warning: #ff8000;--pvt-theme-danger: #EB212E;--pvt-theme-success: #2FF924;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #000;--pvt-text-color-1: #333;--pvt-text-color-2: #666;--pvt-text-color-3: #999;--pvt-text-color-4: #bbb;--pvt-text-color-5: #e0e0e0;--pvt-text-color-6: #fff;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), white 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), white 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), white 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), white 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), white 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), white 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #fff;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #000;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #00000055;--pvt-sidebar-mainpanelheader-bg: unset;--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-6);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-8);--pvt-tooltip-property-list: var(--pvt-bg-color-6);--pvt-menu-bg-color: var(--pvt-bg-color-7);--pvt-menu-border-color: var(--pvt-bg-color-2);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18);--pvt-modal-bg: var(--pvt-bg-color-7);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: var(--pvt-bg-color-4);--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(255, 255, 255, .15) 0px 0px 4px rgba(255, 255, 255, .1) 0px 1px 2px;--pvt-selection-color: #F2545B;--pvt-selection-stroke-color: #F2545B;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #7EA2FB;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 0;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: var(--pvt-selection-color);--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-highlighted-stroke: #7EA2FB;--pvt-node-highlighted-stroke-width: 0;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #fff;--pvt-node-cluster-fill: rgba(255, 255, 255, .0235294118);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #000);--pvt-edge-stroke: color-mix(in srgb, #7EA2FB 50%, #000);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-5);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-5);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px var(--pvt-selection-color));--pvt-edge-label-selected-stroke: var(--pvt-selection-color);--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-text-color-5);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-5);--pvt-inline-bar-bg: var(--pvt-bg-color-6);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 90%, #000) 0%, var(--pvt-bg-color-primary) 60%, color-mix(in srgb, var(--pvt-bg-color-primary) 60%, #fff) 80%, color-mix(in srgb, var(--pvt-bg-color-primary) 30%, #fff) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: inset 0 1px 2px var(--pvt-bg-color-0);--pvt-bg-color-0: #0F0F10;--pvt-bg-color-1: #131314;--pvt-bg-color-2: #171719;--pvt-bg-color-3: #1A1A1D;--pvt-bg-color-4: #1D1D20;--pvt-bg-color-5: #202023;--pvt-bg-color-6: #252528;--pvt-bg-color-7: #343437;--pvt-bg-color-8: #464649;--pvt-vibrant-blue: #7EA2FB;--pvt-vibrant-indigo: #A666F4;--pvt-vibrant-lobster: #F2545B;--pvt-vibrant-green: #85CB33;--pvt-vibrant-amaranth: #eb2e53}}.pivotick[data-theme=light]{--pvt-bg: var(--pvt-bg-color-0);--pvt-ui-bg: var(--pvt-bg-color-0);--pvt-border-color: var(--pvt-bg-color-7);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #f2f2f2;--pvt-theme-info: #25B6EB;--pvt-theme-warning: #F59E0B;--pvt-theme-danger: #DC2626;--pvt-theme-success: #16A34A;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #fff;--pvt-text-color-1: #e0e0e0;--pvt-text-color-2: #bbb;--pvt-text-color-3: #999;--pvt-text-color-4: #666;--pvt-text-color-5: #333;--pvt-text-color-6: #000;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), black 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), black 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), black 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), black 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), black 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), black 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #000;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #fff;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #aaaaaa55;--pvt-sidebar-bg: var(--pvt-bg-color-0);--pvt-sidebar-mainpanelheader-bg: var(--pvt-bg-color-1);--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-0);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-layout-shadow-top: rgba(0, 0, 0, .07) 3px -2px 3px 0px, rgba(0, 0, 0, .04) 2px -3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-6);--pvt-tooltip-property-list: var(--pvt-bg-color-2);--pvt-menu-bg-color: var(--pvt-bg-color-1);--pvt-menu-border-color: var(--pvt-text-color-1);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18), rgba(0, 0, 0, .09) 0 -1px 2px;--pvt-modal-bg: var(--pvt-bg-color-0);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: #f5f5f5;--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(0, 0, 0, .22) 0px 0px 4px, rgba(0, 0, 0, .3) 0px 1px 2px;--pvt-selection-color: #f0636a;--pvt-selection-stroke-color: #f0636a;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #007acc;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 2;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: #f0636a;--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-highlighted-stroke: #007acc;--pvt-node-highlighted-stroke-width: 2;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #333;--pvt-node-cluster-fill: rgba(0, 0, 0, .062745098);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #fff);--pvt-edge-stroke: color-mix(in srgb, #007acc 50%, #fff);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-4);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-6);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px orange);--pvt-edge-label-selected-stroke: orange;--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-edge-label-color);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-4);--pvt-inline-bar-bg: var(--pvt-bg-color-2);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 20%, #fff) 0%, var(--pvt-bg-color-primary) 70%, color-mix(in srgb, var(--pvt-bg-color-primary) 80%, #000) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: color-mix(in srgb, var(--pvt-text-color-6) 15%, transparent) 0px 1px 1px 0px, color-mix(in srgb, var(--pvt-text-color-6) 10%, transparent) 0px 0px 2px 0px, inset 0 1px 2px rgba(0, 0, 0, .05);--pvt-bg-color-0: #fff;--pvt-bg-color-1: #fafafa;--pvt-bg-color-2: #f3f3f3;--pvt-bg-color-3: #ededed;--pvt-bg-color-4: #e6e6e6;--pvt-bg-color-5: #e0e0e0;--pvt-bg-color-6: #d6d6d6;--pvt-bg-color-7: #cccccc;--pvt-bg-color-8: #c2c2c2;--pvt-vibrant-blue: #007acc;--pvt-vibrant-indigo: #7000cc;--pvt-vibrant-lobster: #f0636a;--pvt-vibrant-green: #81dd18;--pvt-vibrant-amaranth: #eb2e53}.pivotick[data-theme=dark]{--pvt-bg: var(--pvt-bg-color-2);--pvt-ui-bg: var(--pvt-bg-color-5);--pvt-border-color: var(--pvt-bg-color-3);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #666666;--pvt-theme-info: #2E67F8;--pvt-theme-warning: #ff8000;--pvt-theme-danger: #EB212E;--pvt-theme-success: #2FF924;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #000;--pvt-text-color-1: #333;--pvt-text-color-2: #666;--pvt-text-color-3: #999;--pvt-text-color-4: #bbb;--pvt-text-color-5: #e0e0e0;--pvt-text-color-6: #fff;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), white 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), white 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), white 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), white 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), white 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), white 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #fff;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #000;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #00000055;--pvt-sidebar-mainpanelheader-bg: unset;--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-6);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-8);--pvt-tooltip-property-list: var(--pvt-bg-color-6);--pvt-menu-bg-color: var(--pvt-bg-color-7);--pvt-menu-border-color: var(--pvt-bg-color-2);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18);--pvt-modal-bg: var(--pvt-bg-color-7);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: var(--pvt-bg-color-4);--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(255, 255, 255, .15) 0px 0px 4px rgba(255, 255, 255, .1) 0px 1px 2px;--pvt-selection-color: #F2545B;--pvt-selection-stroke-color: #F2545B;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #7EA2FB;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 0;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: var(--pvt-selection-color);--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-highlighted-stroke: #7EA2FB;--pvt-node-highlighted-stroke-width: 0;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #fff;--pvt-node-cluster-fill: rgba(255, 255, 255, .0235294118);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #000);--pvt-edge-stroke: color-mix(in srgb, #7EA2FB 50%, #000);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-5);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-5);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px var(--pvt-selection-color));--pvt-edge-label-selected-stroke: var(--pvt-selection-color);--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-text-color-5);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-5);--pvt-inline-bar-bg: var(--pvt-bg-color-6);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 90%, #000) 0%, var(--pvt-bg-color-primary) 60%, color-mix(in srgb, var(--pvt-bg-color-primary) 60%, #fff) 80%, color-mix(in srgb, var(--pvt-bg-color-primary) 30%, #fff) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: inset 0 1px 2px var(--pvt-bg-color-0);--pvt-bg-color-0: #0F0F10;--pvt-bg-color-1: #131314;--pvt-bg-color-2: #171719;--pvt-bg-color-3: #1A1A1D;--pvt-bg-color-4: #1D1D20;--pvt-bg-color-5: #202023;--pvt-bg-color-6: #252528;--pvt-bg-color-7: #343437;--pvt-bg-color-8: #464649;--pvt-vibrant-blue: #7EA2FB;--pvt-vibrant-indigo: #A666F4;--pvt-vibrant-lobster: #F2545B;--pvt-vibrant-green: #85CB33;--pvt-vibrant-amaranth: #eb2e53}@keyframes glowPulseSelected{0%{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-selected-color))}50%{stroke-width:5;filter:drop-shadow(0 0 3px var(--pvt-node-selected-color))}to{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-selected-color))}}@keyframes glowPulseHighlighted{0%{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-highlighted-stroke))}50%{stroke-width:5;filter:drop-shadow(0 0 3px var(--pvt-node-highlighted-stroke))}to{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-highlighted-stroke))}}@keyframes dashmove-edge{to{stroke-dashoffset:-10}}@keyframes dashmove-cluster{to{stroke-dashoffset:-6.2831853072}}.pvt-layout{color:var(--pvt-text-color-6)}.hidden{display:none}.pvt-canvas{background-color:var(--pvt-bg);background-image:var(--pvt-graph-background-image)}.pvt-loading-progress-bar{padding:.75em;background:var(--pvt-menu-bg-color);border:1px solid var(--pvt-menu-border-color);box-shadow:var(--pvt-box-shadow-strong);display:flex;flex-direction:column;align-items:center}.pvt-loading-progress-bar.hidden{visibility:hidden}.pvt-loading-progress-bar div.background{padding:10px;box-sizing:border-box;margin-bottom:.5em}.pvt-loading-progress-bar div.background .track{position:relative;background:#e0e0e0;border-radius:4px;height:8px;rx:4;ry:4;overflow:hidden}.pvt-loading-progress-bar div.background .fill{height:100%;background:var(--pvt-bg-color-primary)}.pvt-loading-progress-bar span.label{text-anchor:middle;font-size:16px;fill:#555}dl.pvt-property-list{margin:0;font-size:.95em;overflow:hidden;display:grid;grid-template-columns:fit-content(120px) 1fr;gap:8px 12px}dl.pvt-property-list .pvt-property-row{display:contents;padding:.25em 0;align-items:center}dl.pvt-property-list .pvt-property-row .pvt-property-name{padding:2px 4px;font-size:.9rem;font-weight:300;color:var(--pvt-text-color-5);text-align:end;align-self:start;white-space:normal;-webkit-user-select:all;user-select:all;overflow:hidden;text-overflow:ellipsis}dl.pvt-property-list .pvt-property-row .pvt-property-value{margin-inline-start:0;font-size:.875rem;font-weight:400;padding:2px 4px;align-self:start;color:var(--pvt-text-color-primary);-webkit-user-select:all;user-select:all;min-height:1em;white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;box-orient:vertical}.pvt-form{display:flex;flex-direction:column;gap:16px}.pvt-form .pvt-form-element label{display:block;font-size:.9em;font-weight:300;color:var(--pvt-text-color-5);text-align:start;align-self:start;white-space:normal;overflow:hidden;text-overflow:ellipsis;margin-bottom:2px}.pvt-form .pvt-form-element input{display:inline-block;width:100%;padding:.5rem .75rem;font-size:1rem;border-radius:.25rem;transition:border-color .2s ease,box-shadow .2s ease}.pvt-form .pvt-form-element input::placeholder{opacity:.7}.pvt-form .pvt-form-element input:focus{outline:none}.pvt-form .pvt-form-element input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.pvt-form .pvt-form-element input{background-color:var(--pvt-ui-bg);color:var(--pvt-text-color-6);border:1px solid var(--pvt-border-color)}.pvt-form .pvt-form-element input::placeholder{color:var(--pvt-text-color-6);opacity:.7}.pvt-form .pvt-form-element input:focus{border-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,black)}.pvt-form .pvt-form-element input:disabled{background-color:var(--pvt-bg-color-3);cursor:not-allowed}.pvt-form .pvt-form-element input{width:unset;background:var(--pvt-bg-color-7);color:var(--pvt-text-color-4);border-color:var(--pvt-menu-border-color)}.pvt-keyboard-shortcut{padding:4px 6px;font-size:.8em;border-radius:4px;background:transparent;border:1px solid var(--pvt-bg-color-7);-webkit-user-select:none;user-select:none}.pvt-node-selected-highlight>.node{fill:var(--pvt-node-selected-color);stroke:var(--pvt-node-selected-stroke);stroke-width:var(--pvt-node-selected-stroke-width);stroke-opacity:var(--pvt-node-selected-stroke-opacity);filter:var(--pvt-node-selected-filter);animation:var(--pvt-node-selected-animation)}.pvt-node-selected-highlight>.pvt-cluster-area{stroke:var(--pvt-node-selected-stroke)}.pvt-node-selected-highlight-shadow>*{filter:grayscale(.5);opacity:.5}.pvt-edge-selected-highlight-shadow>*{filter:grayscale(.5);opacity:.5}.pvt-node-highlighted>.node{stroke:var(--pvt-node-highlighted-stroke);stroke-width:var(--pvt-node-highlighted-stroke-width);opacity:var(--pvt-node-highlighted-opacity);filter:var(--pvt-node-highlighted-filter);animation:var(--pvt-node-highlighted-animation)}.pvt-edge-group path{filter:var(--pvt-edge-filter)}.pvt-edge-group path.dashed{stroke-dasharray:var(--pvt-edge-stroke-dasharray)}.pvt-edge-group path.dashed.animated{stroke-dashoffset:0;animation:var(--pvt-edge-animation)}.pvt-edge-group .label-container rect{stroke:var(--pvt-edge-label-stroke);stroke-width:var(--pvt-edge-label-stroke-width);background-color:var(--pvt-edge-label-bg)}.pvt-edge-group .label-container text{color:var(--pvt-edge-label-color);font-family:var(--pvt-edge-label-font-family);font-size:var(--pvt-edge-label-font-size);-webkit-user-select:none;user-select:none}.pvt-edge-group.selected path{stroke:var(--pvt-edge-selected-stroke);stroke-width:var(--pvt-edge-selected-stroke-width);filter:var(--pvt-edge-selected-filter)}.pvt-edge-group.selected .label-container rect{stroke:var(--pvt-edge-label-selected-stroke);stroke-width:var(--pvt-edge-label-selected-stroke-width);background-color:var(--pvt-edge-label-selected-bg)}.pvt-edge-group.selected .label-container text{color:var(--pvt-edge-label-selected-color);font-size:var(--pvt-edge-label-selected-font-size)}.pvt-edge-group.pvt-edge-synthetic path{stroke-dasharray:3}.pvt-node text.icon{-webkit-user-select:none;user-select:none;pointer-events:none}.pvt-node text.icon.icon-unicode{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--pvt-node-icon-font-family, '"Font Awesome 7 Free"');font-feature-settings:normal;font-style:normal;font-synthesis:none;font-variant:normal;font-weight:var(--pvt-node-icon-font-weight, 900);line-height:1;text-align:center;text-rendering:auto}.pvt-node.pvt-node-has-children .node-icon.expand-icon{fill:var(--pvt-bg-color-info)}.pvt-node.pvt-node-has-children .node-icon.expand-icon text{stroke:var(--pvt-text-color-for-info)}.pvt-node.pvt-node-has-children .node-icon.expand-icon:hover{fill:color-mix(in srgb,var(--pvt-bg-color-info) 90%,black)}.pvt-node.pvt-node-has-children .node-icon.expand-icon:active{fill:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon{fill:var(--pvt-bg-color-secondary)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon text{stroke:var(--pvt-text-color-for-secondary)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon:hover{fill:color-mix(in srgb,var(--pvt-bg-color-secondary) 90%,black)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon:active{fill:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black)}.pvt-node.pvt-node-has-children .node-icon{stroke:var(--pvt-bg);stroke-width:1.5;cursor:pointer}.pvt-node.pvt-node-has-children .node-icon text{text-anchor:middle;dominant-baseline:central;pointer-events:none}.pvt-node.pvt-node-has-children.pvt-node-expanded>.node{filter:drop-shadow(2px 2px 3px var(--pvt-box-shadow-color-strong))}.pvt-node.pvt-node-has-children:not(.pvt-node-expanded)>.node{stroke-width:1;stroke-linecap:round;stroke:var(--pvt-node-dash-stroke);stroke-dasharray:3.1415926536}.pvt-node.pvt-node-has-children:not(.pvt-node-expanded)>.node:hover{animation:dashmove-cluster 1s linear infinite}.pvt-cluster-area{fill:var(--pvt-node-cluster-fill);stroke-dasharray:4 2;stroke-width:2;stroke-linecap:round;stroke:var(--pvt-node-cluster-stroke);stroke-dasharray:3 3.16}svg[data-renderer-drag-enabled="1"] .pvt-node:hover{cursor:grab}.pvt-selection-rectangle{fill:var(--pvt-selection-rectangle-fill);stroke:var(--pvt-selection-rectangle-stroke);stroke-width:2px}.pvt-icon.fixed-width{width:1em}button.pivotick-button-primary{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-primary .pvt-icon{margin-right:.2em!important}button.pivotick-button-primary{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}button.pivotick-button-primary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 90%,black)}button.pivotick-button-primary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-primary:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-secondary{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-secondary .pvt-icon{margin-right:.2em!important}button.pivotick-button-secondary{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}button.pivotick-button-secondary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 90%,black)}button.pivotick-button-secondary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-secondary:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-info{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-info .pvt-icon{margin-right:.2em!important}button.pivotick-button-info{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}button.pivotick-button-info:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 90%,black)}button.pivotick-button-info:active{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-info:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-warning{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-warning .pvt-icon{margin-right:.2em!important}button.pivotick-button-warning{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}button.pivotick-button-warning:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 90%,black)}button.pivotick-button-warning:active{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-warning:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-danger{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-danger .pvt-icon{margin-right:.2em!important}button.pivotick-button-danger{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}button.pivotick-button-danger:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 90%,black)}button.pivotick-button-danger:active{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-danger:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-success{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-success .pvt-icon{margin-right:.2em!important}button.pivotick-button-success{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}button.pivotick-button-success:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 90%,black)}button.pivotick-button-success:active{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-success:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-link{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-link .pvt-icon{margin-right:.2em!important}button.pivotick-button-link{background-color:transparent;color:var(--pvt-text-color-6)}button.pivotick-button-link:hover{color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white)}button.pivotick-button-link:active{color:color-mix(in srgb,var(--pvt-text-color-5) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-link:disabled{color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);cursor:not-allowed;transform:none}button.pivotick-button-outline-primary{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-primary:hover{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}button.pivotick-button-outline-primary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-primary:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-primary:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 85%,black)}button.pivotick-button-outline-secondary{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-secondary:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}button.pivotick-button-outline-secondary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-secondary:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-secondary:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black)}button.pivotick-button-outline-info{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-info:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}button.pivotick-button-outline-info:active{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-info:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-info:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black)}button.pivotick-button-outline-warning{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-warning:hover{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}button.pivotick-button-outline-warning:active{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-warning:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-warning:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 85%,black)}button.pivotick-button-outline-danger{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-danger:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}button.pivotick-button-outline-danger:active{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-danger:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-danger:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black)}button.pivotick-button-outline-success{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-success:hover{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}button.pivotick-button-outline-success:active{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-success:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-success:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 85%,black)}button.pivotick-button-block{width:100%}button.pivotick-button-sm{padding:.25rem .4rem;font-size:.8rem;font-weight:600;border-radius:.25rem}button.pivotick-button-xs{padding:.1rem .25rem;font-size:.75rem;font-weight:600;border-radius:.25rem}.pivotick{width:100%;height:100%;color:var(--pvt-text-color-6);background-color:var(--pvt-bg);font-family:var(--pvt-font-family);position:relative;overflow:hidden}.pvt-layout{--pvt-sidebar-width: 340px;--pvt-toolbar-height: 48px;position:relative;width:100%;height:100%;display:grid;grid-template-columns:auto 1fr;grid-template-rows:var(--pvt-toolbar-height) 1fr;grid-template-areas:"sidebar toolbar" "sidebar canvas"}.pvt-layout.mode-static,.pvt-layout.mode-viewer{grid-template-columns:0px 1fr;grid-template-rows:0px 1fr}.pvt-layout.mode-light{grid-template-columns:0px 1fr;grid-template-rows:var(--pvt-toolbar-height) 1fr}.pvt-layout.mode-full.sidebar-collapsed{grid-template-columns:0px 1fr}.pvt-sidebar{width:var(--pvt-sidebar-width);grid-area:sidebar;height:100%;transition:width .1s ease-out}.pvt-sidebar .pvt-sidebar-elements{opacity:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-separator{border-bottom:var(--pvt-sidebar-panel-border)}.pvt-sidebar.pvt-sidebar-collapsed{width:0px}.pvt-sidebar.pvt-sidebar-collapsed .pvt-sidebar-elements{opacity:0%}.pvt-canvas{grid-area:canvas;height:100%;width:100%;position:relative;overflow:hidden}.pvt-canvas .pvt-slide-panel{position:absolute;top:0;bottom:0;right:0;max-width:30%;min-width:220px;overflow-y:auto;height:100%;z-index:1000}.pvt-canvas .pvt-notification{position:absolute;top:1em;right:3em;max-width:280px;display:flex;flex-direction:column;gap:4px}.pvt-toolbar{grid-area:toolbar;height:100%;width:100%;z-index:10;display:flex;flex-direction:row;align-items:center}.pvt-graphnavigation{position:absolute;top:1rem;right:1rem;z-index:5}.pvt-graphcontrols{position:absolute;top:1rem;left:1rem;z-index:5}.pivotick-inline-bar-container{position:relative;display:inline-block;height:var(--pvt-inline-bar-height);width:var(--pvt-inline-bar-width);background:var(--pvt-inline-bar-bg);box-shadow:var(--pvt-inline-bar-shadow);border-radius:4px;overflow:hidden;vertical-align:middle}.pivotick-inline-bar-container .pivotick-inline-bar-fill{display:block;height:100%;background:var(--pvt-inline-bar-fill-bg);background-repeat:no-repeat;border-radius:inherit;transition:width .4s cubic-bezier(.2,.9,.3,1),background-size .4s cubic-bezier(.2,.9,.3,1)}.pivotick-inline-bar-percent{white-space:"nowrap";width:36px;text-align:right;color:"var(--pvt-text-color-4)"}span.pivotick-badge-primary{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}span.pivotick-badge-secondary{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}span.pivotick-badge-info{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}span.pivotick-badge-warning{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}span.pivotick-badge-danger{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}span.pivotick-badge-success{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}span.pivotick-badge-sm{padding:.15rem .25rem;font-size:.8rem}span.pivotick-badge-xs{padding:.05rem .15rem;font-size:.75rem}span.pivotick-badge-xxs{padding:.025rem .1rem;font-size:.6rem}.ts-control{border:1px solid #d0d0d0;padding:8px;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:3px;display:flex;flex-wrap:wrap}.ts-wrapper.multi.has-items .ts-control{padding:calc(6px + -0) 8px calc(3px + -0)}.full .ts-control{background-color:#fff}.disabled .ts-control,.disabled .ts-control *{cursor:default!important}.focus .ts-control{box-shadow:none}.ts-control>*{vertical-align:baseline;display:inline-block}.ts-wrapper.multi .ts-control>div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.ts-wrapper.multi .ts-control>div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.ts-wrapper.multi.disabled .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div.active{color:#7d7d7d;background:#fff;border:0 solid white}.ts-control>input{flex:1 1 auto;min-width:7rem;display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0!important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;-webkit-user-select:auto!important;user-select:auto!important;box-shadow:none!important}.ts-control>input::-ms-clear{display:none}.ts-control>input:focus{outline:none!important}.has-items .ts-control>input{margin:0 4px!important}.ts-control.rtl{text-align:right}.ts-control.rtl.single .ts-control:after{left:15px;right:auto}.ts-control.rtl .ts-control>input{margin:0 4px 0 -2px!important}.disabled .ts-control{opacity:.5;background-color:#fafafa}.input-hidden .ts-control>input{opacity:0;position:absolute;left:-10000px}.ts-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:.25rem 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px #0000001a;border-radius:0 0 3px 3px}.ts-dropdown [data-selectable] .highlight{background:#7da8d033;border-radius:1px}.ts-dropdown .option,.ts-dropdown .optgroup-header,.ts-dropdown .no-results,.ts-dropdown .create{padding:5px 8px}.ts-dropdown .option,.ts-dropdown [data-disabled],.ts-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.ts-dropdown [data-selectable].option{opacity:1;cursor:pointer}.ts-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.ts-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.ts-dropdown .active{background-color:#f5fafd;color:#495c68}.ts-dropdown .active.create{color:#495c68}.ts-dropdown .create{color:#30303080}.ts-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:5px 8px}.ts-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ts-dropdown-content{overflow:hidden auto;max-height:200px;scroll-behavior:smooth}.ts-wrapper.plugin-drag_drop .ts-dragging{color:transparent!important}.ts-wrapper.plugin-drag_drop .ts-dragging>*{visibility:hidden!important}.plugin-checkbox_options:not(.rtl) .option input{margin-right:.5rem}.plugin-checkbox_options.rtl .option input{margin-left:.5rem}.plugin-clear_button{--ts-pr-clear-button: 1em}.plugin-clear_button .clear-button{opacity:0;position:absolute;top:50%;transform:translateY(-50%);right:2px;margin-right:0!important;background:transparent!important;transition:opacity .5s;cursor:pointer}.plugin-clear_button.form-select .clear-button,.plugin-clear_button.single .clear-button{right:max(var(--ts-pr-caret),8px)}.plugin-clear_button.focus.has-items .clear-button,.plugin-clear_button:not(.disabled):hover.has-items .clear-button{opacity:1}.ts-wrapper .dropdown-header{position:relative;padding:10px 8px;border-bottom:1px solid #d0d0d0;background:color-mix(#fff,#d0d0d0,85%);border-radius:3px 3px 0 0}.ts-wrapper .dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.ts-wrapper .dropdown-header-close:hover{color:#000}.plugin-dropdown_input.focus.dropdown-active .ts-control{box-shadow:none;border:1px solid #d0d0d0}.plugin-dropdown_input .dropdown-input{border:1px solid #d0d0d0;border-width:0 0 1px;display:block;padding:8px;box-shadow:none;width:100%;background:transparent}.plugin-dropdown_input .items-placeholder{border:0 none!important;box-shadow:none!important;width:100%}.plugin-dropdown_input.has-items .items-placeholder,.plugin-dropdown_input.dropdown-active .items-placeholder{display:none!important}.ts-wrapper.plugin-input_autogrow.has-items .ts-control>input{min-width:0}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input{flex:none;min-width:4px}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input::placeholder{color:transparent}.ts-dropdown.plugin-optgroup_columns .ts-dropdown-content{display:flex}.ts-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.ts-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.ts-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.ts-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.ts-wrapper.plugin-remove_button .item{display:inline-flex;align-items:center}.ts-wrapper.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:0 6px;border-radius:0 2px 2px 0;box-sizing:border-box}.ts-wrapper.plugin-remove_button .item .remove:hover{background:#0000000d}.ts-wrapper.plugin-remove_button.disabled .item .remove:hover{background:none}.ts-wrapper.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.ts-wrapper.plugin-remove_button:not(.rtl) .item{padding-right:0!important}.ts-wrapper.plugin-remove_button:not(.rtl) .item .remove{border-left:1px solid #d0d0d0;margin-left:6px}.ts-wrapper.plugin-remove_button:not(.rtl) .item.active .remove{border-left-color:#cacaca}.ts-wrapper.plugin-remove_button:not(.rtl).disabled .item .remove{border-left-color:#fff}.ts-wrapper.plugin-remove_button.rtl .item{padding-left:0!important}.ts-wrapper.plugin-remove_button.rtl .item .remove{border-right:1px solid #d0d0d0;margin-right:6px}.ts-wrapper.plugin-remove_button.rtl .item.active .remove{border-right-color:#cacaca}.ts-wrapper.plugin-remove_button.rtl.disabled .item .remove{border-right-color:#fff}:root{--ts-pr-clear-button: 0px;--ts-pr-caret: 0px;--ts-pr-min: .75rem}.ts-wrapper.single .ts-control,.ts-wrapper.single .ts-control input{cursor:pointer}.ts-control:not(.rtl){padding-right:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-control.rtl{padding-left:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-wrapper{position:relative}.ts-dropdown,.ts-control,.ts-control input{color:#303030;font-family:inherit;font-size:13px;line-height:18px}.ts-control,.ts-wrapper.single.input-active .ts-control{background:#fff;cursor:text}.ts-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.ts-control{background:var(--pvt-bg-color-7);border-color:var(--pvt-menu-border-color);color:var(--pvt-text-color-4)}.full .ts-control{background-color:var(--pvt-bg-color-7)}.focus .ts-control{box-shadow:var(--pvt-menu-shadow)}.ts-wrapper.multi .ts-control>div{background:var(--pvt-bg-color-5);color:var(--pvt-text-color-primary);border:none}.ts-wrapper.multi .ts-control>div.active,.ts-wrapper.multi .ts-control>div:hover{background:var(--pvt-bg-color-8);border-color:var(--pvt-text-color-6)}.ts-wrapper.multi.disabled .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div.active{color:var(--pvt-text-color-6);background:var(--pvt-bg-color-8);border-color:var(--pvt-bg-color-2)}.disabled .ts-control{background-color:var(--pvt-bg-color-7)}.ts-control>input{display:inline-block;width:100%;padding:.5rem .75rem;font-size:1rem;border-radius:.25rem;transition:border-color .2s ease,box-shadow .2s ease}.ts-control>input::placeholder{opacity:.7}.ts-control>input:focus{outline:none}.ts-control>input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.ts-control>input{background-color:var(--pvt-ui-bg);color:var(--pvt-text-color-6);border:1px solid var(--pvt-border-color)}.ts-control>input::placeholder{color:var(--pvt-text-color-6);opacity:.7}.ts-control>input:focus{border-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,black)}.ts-control>input:disabled{background-color:var(--pvt-bg-color-3);cursor:not-allowed}.ts-control>input{width:unset}.ts-wrapper.single.input-active .ts-control{background:var(--pvt-bg-color-7)}.ts-dropdown{border-color:var(--pvt-menu-border-color);background:var(--pvt-bg-color-7);box-shadow:var(--pvt-sidebar-layout-shadow-right)}.ts-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.ts-dropdown [data-selectable] .highlight{background:var(--pvt-bg-color-8)}.ts-dropdown .optgroup-header{color:var(--pvt-text-color-4);background:var(--pvt-bg-color-7)}.ts-dropdown .active{background-color:var(--pvt-bg-color-8);color:var(--pvt-text-color-6)}.ts-dropdown .active.create,.ts-dropdown .create{color:var(--pvt-text-color-4)}.ts-dropdown input[type=checkbox].tomselect-checkbox{accent-color:var(--pvt-text-color-primary)}.ts-dropdown,.ts-control,.ts-control input{color:var(--pvt-text-color-4)}.ts-wrapper.plugin-remove_button:not(.rtl) .item .remove{border-color:var(--pvt-bg-color-7);color:var(--pvt-text-color-4)}.pivotick-toast{min-width:250px;background-color:var(--pvt-toast-bg);box-shadow:0 4px 6px #00000026;border:1px solid color-mix(in srgb,var(--pvt-toast-bg) 85%,black);border-radius:4px;color:var(--pvt-toast-color);opacity:0;transform:translate(20px);transition:opacity .3s ease,transform .3s ease;z-index:1000}.pivotick-toast .pivotick-toast-title{font-weight:600;padding:.5em .75em}.pivotick-toast .pivotick-toast-body{padding:.5em .75em;border-top:1px solid color-mix(in srgb,var(--pvt-toast-bg) 85%,black)}.pivotick-toast.show{opacity:1;transform:translate(0)}.pivotick-toast.pivotick-toast-primary{--pvt-toast-bg: var(--pvt-toast-bg-color-primary);--pvt-toast-color: var(--pvt-toast-text-color-primary)}.pivotick-toast.pivotick-toast-secondary{--pvt-toast-bg: var(--pvt-toast-bg-color-secondary);--pvt-toast-color: var(--pvt-toast-text-color-secondary)}.pivotick-toast.pivotick-toast-info{--pvt-toast-bg: var(--pvt-toast-bg-color-info);--pvt-toast-color: var(--pvt-toast-text-color-info)}.pivotick-toast.pivotick-toast-warning{--pvt-toast-bg: var(--pvt-toast-bg-color-warning);--pvt-toast-color: var(--pvt-toast-text-color-warning)}.pivotick-toast.pivotick-toast-danger{--pvt-toast-bg: var(--pvt-toast-bg-color-danger);--pvt-toast-color: var(--pvt-toast-text-color-danger)}.pivotick-toast.pivotick-toast-success{--pvt-toast-bg: var(--pvt-toast-bg-color-success);--pvt-toast-color: var(--pvt-toast-text-color-success)} +@charset "UTF-8";.pvt-graphcontrols{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;pointer-events:none}.pvt-graphcontrols .pvt-graphcontrols-elements{display:flex;align-items:flex-start;flex-direction:row;gap:12px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-panel{display:flex;flex-direction:column;background-color:color-mix(in srgb,var(--pvt-bg) 80%,white);box-shadow:var(--pvt-graph-navigation-control-container-shadow);border-radius:4px;margin-bottom:6px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-panel .pivotick-divider{border-top:1px solid color-mix(in srgb,var(--pvt-border-color) 40%,transparent);margin:5px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout{pointer-events:all}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout .pvt-graphcontrols-layout-type-container{display:flex;flex-direction:row;align-items:center}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout .pvt-graphcontrols-layout-type-container .pvt-graphcontrols-layout-type-options{max-width:0;display:flex;flex-direction:row;transition:max-width .2s ease-out;overflow:hidden}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout:hover .pvt-graphcontrols-layout-type-options{max-width:unset}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button{border:none;background:none;display:flex;align-items:center;justify-content:center;padding:3px;cursor:pointer;font-size:1rem;width:24px;height:24px;color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);transition:font-size .15s ease}@media(prefers-color-scheme:dark){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button{color:#bbb}}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button.with-text{font-size:.7rem;width:unset;max-width:10em}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:hover:not(:disabled),.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:active:not(:disabled){color:color-mix(in srgb,var(--pvt-text-color-5) 70%,black)}@media(prefers-color-scheme:dark){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:hover:not(:disabled),.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:active:not(:disabled){color:#fff}}@media(prefers-color-scheme:dark){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:disabled{filter:brightness(.6)}}@media(prefers-color-scheme:light){.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:disabled{filter:brightness(2)}}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-layout button:disabled{cursor:not-allowed}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection{opacity:0;transition:opacity .1s ease-out,transform .1s ease-out;transform:translate(-10px);border-radius:2px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection.shown{opacity:100;transform:translate(0);pointer-events:all}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-title{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom:1px solid var(--pvt-tooltip-floating-bg-color);text-align:center;padding:4px 8px;display:none}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar{display:flex;align-items:center;background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom:1px solid var(--pvt-tooltip-floating-bg-color);padding:2px;margin-bottom:4px;border-top-right-radius:4px;border-top-left-radius:4px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar .pvt-action-list{width:100%;display:flex;align-items:center;flex-direction:row;gap:0em}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar .pvt-action-list .pivotick-button{border-radius:4px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-topbar .pvt-action-list .pivotick-button .pvt-icon{font-size:20px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu .pvt-action-item{padding:6px 8px;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu .pvt-action-item .pvt-icon{font-size:20px}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-graphcontrols-selection-mainmenu .pvt-action-item .pvt-action-text{margin-left:1em;text-align:end}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-primary:hover{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-secondary:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-info:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-warning:hover{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-danger:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-graphcontrols .pvt-graphcontrols-elements .pvt-graphcontrols-selection .pvt-action-item-outline-success:hover{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}.pvt-graphnavigation-elements button{border:none;background:none;display:flex;align-items:center;justify-content:center;padding:3px;cursor:pointer;font-size:1rem;color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);transition:font-size .15s ease}@media(prefers-color-scheme:dark){.pvt-graphnavigation-elements button{color:#bbb}}.pvt-graphnavigation-elements button:hover,.pvt-graphnavigation-elements button:active{color:color-mix(in srgb,var(--pvt-text-color-5) 70%,black)}@media(prefers-color-scheme:dark){.pvt-graphnavigation-elements button:hover,.pvt-graphnavigation-elements button:active{color:#fff}}.pvt-graphnavigation-elements .pvt-graphnavigation-zoom-fit{background-color:color-mix(in srgb,var(--pvt-bg) 80%,white);box-shadow:var(--pvt-graph-navigation-control-container-shadow);border-radius:4px;margin-bottom:6px}.pvt-graphnavigation-elements .pvt-graphnavigation-zoom-controls{display:flex;flex-direction:column;background-color:color-mix(in srgb,var(--pvt-bg) 80%,white);box-shadow:var(--pvt-graph-navigation-control-container-shadow);border-radius:4px}.pvt-graphnavigation-elements .pvt-graphnavigation-zoom-controls .pvt-zoom-divider{border-top:1px solid color-mix(in srgb,var(--pvt-border-color) 40%,transparent);margin:0 5px}.pvt-sidebar{position:relative;background:var(--pvt-ui-bg);box-shadow:var(--pvt-sidebar-layout-shadow-right)}.pvt-sidebar .pvt-sidebar-elements{height:100%;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:10px}.pvt-sidebar .pvt-sidebar-elements .enter-active{opacity:1!important;transform:translate(0)!important}.pvt-sidebar .pvt-sidebar-elements .enter-ready{transition:opacity .1s ease,transform .1s ease;opacity:0;transform:translate(-8px)}.pvt-sidebar .pvt-sidebar-elements .pvt-extra-panel{display:flex;flex-direction:column;gap:10px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-header-panel{display:none;min-height:40px;align-items:center;padding:2px 6px;font-weight:300;color:var(--pvt-text-color-5)}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-header-panel.pvt-neighbors-header-panel{display:flex;align-items:center}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel{min-height:32px;padding:6px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel{position:relative;display:flex;flex-direction:column;width:100%;height:var(--pvt-sidebar-width);box-sizing:border-box}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pvt-neighbors-count{padding:4px 10px;font-size:14px;font-weight:300;color:var(--pvt-text-color-5)}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels{height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=egograph]{border:var(--pvt-sidebar-panel-border);height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=egograph] div{height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=egograph] .pivotick .pvt-canvas{background-image:none}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list]{height:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .main-list-container{height:100%;overflow-y:auto}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details{margin-bottom:4px;display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .edge{margin-right:4px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .edge.edge-out{color:var(--pvt-text-color-primary);width:2em!important}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .edge.edge-in{color:var(--pvt-text-color-secondary);width:2em!important}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer{display:flex;flex-direction:row;align-items:center;gap:5px;min-width:0}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer .pvt-neighbors-list__nodename{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer .pvt-neighbors-list__nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d;width:30px;height:30px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbors-list__nodecontainer .pvt-neighbors-list__nodepreview .pvt-mainheader-icon{width:26px;height:26px}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbor-edge-description{margin-left:auto;border-radius:2px;white-space:nowrap}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=list] .edge-details .pvt-neighbor-edge-description.empty-label{color:var(--pvt-text-color-3);font-style:italic}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-panel .pvt-sidebar-body-panel.pvt-neighbors-body-panel .pivotick-tab-panels div[data-tab-panel=stats] .main-stats-container{display:flex;flex-direction:column;gap:10px}.pvt-sidebar .pvt-sidebar-collapse-container{position:absolute;right:-40px;bottom:7px;background-color:var(--pvt-sidebar-collapse-bg);color:var(--pvt-sidebar-collapse-color);box-shadow:var(--pvt-sidebar-collapse-shadow);border:1px solid var(--pvt-sidebar-collapse-border-color);padding:4px;font-size:20px;border-radius:50%;width:26px;height:26px;display:flex;justify-content:center;align-items:center;cursor:pointer}.pvt-sidebar .pvt-sidebar-collapse-container:hover{color:color-mix(in srgb,var(--pvt-sidebar-collapse-color) 70%,black)}.pvt-sidebar .pvt-sidebar-collapse-container:active{color:color-mix(in srgb,var(--pvt-sidebar-collapse-color) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-sidebar .pvt-sidebar-collapse-container .pvt-sidebar-collapse-button{display:flex;justify-content:center;align-items:center;width:24px;height:24px}.pvt-sidebar .pvt-sidebar-collapse-container .pvt-sidebar-collapse-button-expand{display:none}.pvt-sidebar-collapsed .pvt-sidebar-collapse-button-collapse{display:none!important}.pvt-sidebar-collapsed .pvt-sidebar-collapse-button-expand{display:flex!important}.pvt-mainheader-panel{min-height:70px;display:flex;justify-content:flex-start;align-items:center;box-sizing:border-box;padding:10px 12px;box-shadow:var(--pvt-sidebar-layout-shadow-bottom)}.pvt-mainheader-panel>div{display:flex;flex-direction:row;align-items:center;gap:10px}.pvt-mainheader-panel>div .pvt-mainheader-nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d}.pvt-mainheader-panel>div .pvt-mainheader-nodepreview .pvt-mainheader-icon{width:42px;height:42px}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo{flex-grow:1;display:flex;flex-direction:column;justify-content:center;font-family:Segoe UI,sans-serif}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-name{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-subtitle{font-size:12px;color:var(--pvt-text-color-5);text-overflow:ellipsis;overflow:hidden;white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all}.pvt-mainheader-panel>div .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-action{flex-shrink:1}.pvt-aggregated-property-section{margin-bottom:14px}.pvt-aggregated-property-section .pvt-aggregated-property-title{display:inline-block;padding:4px 8px;text-align:left;font-size:.9rem;font-weight:500;color:var(--pvt-text-color-5);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;text-transform:uppercase}.pvt-aggregated-property-section .pvt-aggregated-property-container{margin:0 4px 4px;display:flex;flex-direction:column;gap:2px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row{display:flex;flex-direction:row;align-items:center}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value{flex-grow:1;font-family:monospace;font-size:.8rem}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container{position:relative;margin-right:8px;text-overflow:ellipsis;overflow:hidden;-webkit-user-select:all;user-select:all;font-size:.875rem;font-weight:400;color:var(--pvt-text-color-primary)}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions{display:none;position:absolute;right:4px;flex-direction:row;gap:4px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button{border:none;background:none;padding:0;cursor:pointer;font-size:1rem;color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);transition:font-size .15s ease;max-height:22px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button:hover:not(:disabled),.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button:active:not(:disabled){color:color-mix(in srgb,var(--pvt-text-color-5) 70%,black)}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container .pvt-aggregated-property-actions button:disabled{filter:brightness(2);cursor:not-allowed}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value.code-container:hover .pvt-aggregated-property-actions{display:inline-flex}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-count{--pvt-inline-bar-width: 60px}.pvt-aggregated-property-section .pvt-aggregated-property-container .pvt-aggregated-property-row .pvt-aggregated-property-value-dim{display:inline-block;width:100%;color:var(--pvt-text-color-3);font-style:italic;text-align:start}.pivotick-tab-controls{display:flex;flex-direction:row;gap:4px}.pvt-slide-panel{display:hidden;position:relative;background:var(--pvt-ui-bg);transform:translate(100%);transition:transform .1s ease-in-out;border-top:1px solid var(--pvt-border-color);box-shadow:var(--pvt-sidebar-layout-shadow-left);width:clamp(280px,25vw,400px)}.pvt-slide-panel.open{display:flex;flex-direction:column;transform:translate(0)}.pvt-slide-panel .pvt-slide-panel__header{padding:12px;font-weight:700;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;border-bottom:var(--pvt-sidebar-panel-border)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:active{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:disabled{cursor:not-allowed;transform:none}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black)}.pvt-slide-panel .pvt-slide-panel__header button.pvt-close-button{padding:.25rem .5rem;align-self:flex-start;font-size:1.2rem;line-height:.8rem;margin-left:auto}.pvt-slide-panel .pvt-slide-panel__content{flex-grow:1;padding:16px;overflow-y:auto;overflow-x:hidden}.pvt-slide-panel .pvt-slide-panel__content .pvt-sidebar-separator{border-bottom:var(--pvt-sidebar-panel-border);margin:24px -16px}.pvt-slide-panel .pvt-slide-panel__content .pvt-graph-filter-container{display:flex;flex-direction:column;gap:0px}.pvt-searchbox div.search-container{position:relative;display:flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;padding:6px 12px;border-radius:4px;color:var(--pvt-text-color-4)}.pvt-searchbox div.search-container div.input-container{position:relative;display:flex;width:100%}.pvt-searchbox div.search-container div.input-container span.icon-container{position:absolute;inset-block:0;inset-inline-start:0;display:flex;align-items:center;padding-inline-start:.75rem;pointer-events:none}.pvt-searchbox div.search-container div.input-container span.icon-container svg{width:1em;height:1em;color:var(--pvt-text-color-6);opacity:.7}.pvt-searchbox div.search-container div.input-container input{display:inline-block;width:100%;padding:.5rem .75rem;font-size:1rem;border-radius:.25rem;transition:border-color .2s ease,box-shadow .2s ease}.pvt-searchbox div.search-container div.input-container input::placeholder{opacity:.7}.pvt-searchbox div.search-container div.input-container input:focus{outline:none}.pvt-searchbox div.search-container div.input-container input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.pvt-searchbox div.search-container div.input-container input{background-color:var(--pvt-ui-bg);color:var(--pvt-text-color-6);border:1px solid var(--pvt-border-color)}.pvt-searchbox div.search-container div.input-container input::placeholder{color:var(--pvt-text-color-6);opacity:.7}.pvt-searchbox div.search-container div.input-container input:focus{border-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,black)}.pvt-searchbox div.search-container div.input-container input:disabled{background-color:var(--pvt-bg-color-3);cursor:not-allowed}.pvt-searchbox div.search-container div.input-container input{display:block;width:100%;padding:.8rem;padding-inline-start:2.5rem;padding-inline-end:5rem}.pvt-searchbox div.pvt-search-results{display:flex;flex-direction:column;gap:.5em;padding:6px 12px}.pvt-searchbox div.pvt-search-results .pvt-search-result{border:1px solid var(--pvt-bg-color-8);padding:4px 6px;border-radius:4px;cursor:pointer}.pvt-searchbox div.pvt-search-results .pvt-search-result:hover,.pvt-searchbox div.pvt-search-results .pvt-search-result.active{background-color:var(--pvt-bg-color-8)}.pvt-searchbox div.pvt-search-results .pvt-search-result div{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;gap:8px}.pvt-searchbox div.pvt-search-results .pvt-search-result div .pvt-search-result__nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d;width:36px;height:36px}.pvt-searchbox div.pvt-search-results .pvt-search-result div .pvt-search-result__nodepreview .pvt-mainheader-icon{width:30px;height:30px}.pvt-searchbox div.pvt-search-results .pvt-search-result div .pvt-search-result__name{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all;font-size:1em}.pvt-searchbox div.pvt-search-results .pvt-search-result .pvt-search-result__info{display:flex;gap:.5em;flex-direction:row;padding-left:42px}.pvt-searchbox div.pvt-search-results .pvt-search-result .pvt-search-result__info .pvt-search-result__info_key{font-weight:300;color:var(--pvt-text-color-5);white-space:normal;-webkit-user-select:all;user-select:all;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}.pvt-searchbox div.pvt-search-results .pvt-search-result .pvt-search-result__info .pvt-search-result__info_value{color:var(--pvt-text-color-primary);-webkit-user-select:all;user-select:all;min-height:1em;white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pvt-searchbox .pvt-search-summary{padding:6px 12px;font-weight:300;font-size:.9em;color:var(--pvt-text-color-4)}.pvt-searchbox .pvt-search-hints{padding:6px 12px;display:flex;flex-direction:row;gap:1em;font-size:.9em}.pvt-searchbox .pvt-search-hints span{display:inline-flex;align-items:center;gap:.25em}.pvt-searchbox .pvt-search-hints span .pvt-search-text{line-height:1}.pvt-searchbox .pvt-search-hints span .pvt-search-icon{display:inline-flex;align-items:center;justify-content:center;padding:4px;border-radius:4px;background:var(--pvt-bg-color-8);line-height:.9em}.pvt-searchbox .pvt-search-hints span .pvt-search-icon svg{width:1em;height:1em;color:var(--pvt-text-color-6);opacity:.7}.pvt-toolbar{background:var(--pvt-ui-bg);box-shadow:var(--pvt-sidebar-layout-shadow-bottom);border-left:var(--pvt-sidebar-panel-border)}.pvt-toolbar .pvt-toolbar-elements{display:flex;flex-direction:row;gap:4px;align-items:center;margin:2px 6px;width:100%;padding-left:.5rem}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container{position:relative;display:inline-flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;padding:6px 12px;border-radius:4px;background-color:var(--pvt-bg-color-1);color:var(--pvt-text-color-4);box-shadow:var(--pvt-action-container-shadow)}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container span.action-text{font-size:.8em;margin:0 .25em;-webkit-user-select:none;user-select:none}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container span.action-text .active-filter-subtext{font-weight:400;font-size:.9em;display:inline-flex;flex-direction:row;flex-wrap:nowrap;gap:4px;margin-left:4px}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button div.action-container span.icon-container svg{width:.8rem;height:.8rem;color:var(--pvt-text-color-6);opacity:.7}.pvt-toolbar .pvt-toolbar-elements .pvt-action-button:active{transition:transform .05s ease-out;transform:scale(.95)}.pvt-toolbar .pvt-toolbar-elements .pvt-right{margin-left:auto;display:flex;flex-direction:row;flex-wrap:nowrap;gap:4px}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:active{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:disabled{cursor:not-allowed;transform:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black)}.pvt-toolbar .pvt-toolbar-elements .pvt-right button.pvt-button-filter{padding:.5rem}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group{display:inline-flex;flex-direction:row;flex-wrap:nowrap}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:active{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:disabled{cursor:not-allowed;transform:none}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black)}.pvt-toolbar .pvt-toolbar-elements .pvt-right div.pvt-undoredo-group button{padding:.5rem}.pvt-slide-panel .pvt-hidden-nodes-container h4{margin:0;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list{margin-top:24px;display:flex;flex-direction:column;gap:6px}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list .hidden-node{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;box-orient:vertical;-webkit-user-select:all;user-select:all;-webkit-user-select:auto;user-select:auto;display:flex;flex-direction:row;align-items:baseline;cursor:help}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list .hidden-node .subtext{margin:0 .5em 0 auto;color:var(--pvt-text-color-5);display:inline-flex;gap:.25em}.pvt-slide-panel .pvt-hidden-nodes-container .pvt-hidden-nodes-container-list .hidden-node .subtext .nodeinfo{display:inline-flex;flex-direction:row;align-items:center;gap:2px}.pvt-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--pvt-modal-overlay-bg);display:grid;z-index:1000}.pvt-modal-overlay.pvt-modal-overlay-center{place-items:center}.pvt-modal-overlay.pvt-modal-overlay-top{align-items:start;justify-items:center;padding-top:4rem}.pvt-modal{display:hidden;background:var(--pvt-modal-bg);color:var(--pvt-modal-text);width:100%;max-height:85vh;border-radius:6px;overflow:hidden;box-shadow:var(--pvt-modal-shadow);animation:pvt-modal-in .18s ease-out}.pvt-modal.pvt-modal-open{display:block}.pvt-modal.pvt-modal-sm{max-width:min(100% - 2rem,320px)}.pvt-modal.pvt-modal-md{max-width:min(100% - 2rem,520px)}.pvt-modal.pvt-modal-lg{max-width:min(100% - 2rem,720px)}.pvt-modal.pvt-modal-xl{max-width:min(100% - 2rem,960px)}.pvt-modal.pvt-modal-fluid{width:90%;max-width:none}@media(max-width:600px){.pvt-modal{max-width:calc(100% - 2rem)}}.pvt-modal .pvt-modal__header{padding:1rem;display:flex;align-items:center;font-weight:600;border-bottom:1px solid var(--pvt-border-color)}.pvt-modal .pvt-modal__body{padding:1.5rem;overflow-y:auto}.pvt-modal .pvt-modal__footer{padding:.75rem;display:flex;justify-content:flex-end;gap:.75rem;border-top:1px solid var(--pvt-border-color)}@keyframes pvt-modal-in{0%{opacity:0;transform:translateY(6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.pvt-tooltip{position:absolute;pointer-events:auto;background-color:var(--pvt-menu-bg-color);border:var(--pvt-menu-border-color);box-shadow:var(--pvt-menu-shadow);font-size:13px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.4;white-space:nowrap;left:-10000px;opacity:0;transition:opacity .1s ease-out;z-index:1000}.pvt-tooltip.shown{opacity:100}.pvt-tooltip.pvt-tooltip-floating{border-color:var(--pvt-tooltip-floating-bg-color);z-index:900}.pvt-tooltip .pvt-tooltip-topbar{display:flex;align-items:center;background-color:var(--pvt-tooltip-floating-bg-color);padding:2px}.pvt-tooltip .pvt-tooltip-topbar.draggable{cursor:grab;-webkit-user-select:none;user-select:none}.pvt-tooltip .pvt-tooltip-topbar.draggable :active{cursor:grabbing}.pvt-tooltip .pvt-tooltip-topbar .close-button{margin-left:auto}.pvt-tooltip .pvt-tooltip-container{position:relative;display:flex;flex-direction:column;gap:4px;max-width:500px;max-height:500px;min-width:200px;min-height:100px;resize:auto;overflow:hidden}.pvt-tooltip .pvt-tooltip-container:before{--oversize-container-size: 10px;content:"";position:absolute;top:calc(-1 * var(--oversize-container-size));left:calc(-1 * var(--oversize-container-size));width:calc(100% + 2 * var(--oversize-container-size));height:calc(100% + 2 * var(--oversize-container-size));background:#0000;z-index:-1}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container{display:flex;flex-direction:row;align-items:center;gap:10px;padding:12px 8px 4px;border-bottom:var(--pvt-sidebar-panel-border);background-color:var(--pvt-sidebar-mainpanelheader-bg)}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-topright{position:absolute;top:2px;right:2px;color:var(--pvt-text-color-2)}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodepreview{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:var(--pvt-mainheader-nodepreview-bg);border-radius:8px;box-shadow:0 2px 4px #0000001a,inset 0 0 0 1px #0000000d;width:38px;height:38px}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodepreview .pvt-mainheader-icon{width:32px;height:32px}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo{flex-grow:1;display:flex;flex-direction:column;justify-content:center;font-family:Segoe UI,sans-serif}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-name{font-size:16px;font-weight:600;color:var(--pvt-text-color-6);-webkit-user-select:all;user-select:all;white-space:wrap}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-subtitle{font-size:12px;color:var(--pvt-text-color-5);-webkit-user-select:all;user-select:all;white-space:wrap}.pvt-tooltip .pvt-tooltip-container .pvt-mainheader-container .pvt-mainheader-nodeinfo .pvt-mainheader-nodeinfo-action{flex-shrink:1}.pvt-tooltip .pvt-tooltip-container .pvt-properties-container{margin-bottom:4px}.pvt-tooltip .pvt-tooltip-container .pvt-properties-container dl.pvt-property-list{background:var(--pvt-tooltip-property-list);gap:0px 12px}.pvt-tooltip .pvt-tooltip-container .pvt-properties-container dl.pvt-property-list .pvt-property-row{padding:.2em}.pvt-tooltip .pvt-tooltip-container .pivotick-extra-content-container{padding:8px}.pivotick-shadowlink-container{pointer-events:none;position:absolute;top:0;left:0;width:100%;height:100%}.pivotick-shadowlink-container path.pivotick-shadowlink{stroke:color-mix(in srgb,var(--pvt-edge-stroke) 100%,rgba(255,255,255,0));stroke-width:2;stroke-opacity:.6;stroke-dasharray:var(--pvt-edge-stroke-dasharray);animation:var(--pvt-edge-animation)}.pvt-contextmenu{position:absolute;pointer-events:auto;background-color:var(--pvt-menu-bg-color);border:var(--pvt-menu-border-color);box-shadow:var(--pvt-menu-shadow);font-size:13px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.4;white-space:nowrap;left:-10000px;opacity:0;z-index:1020;transition:opacity .1s ease-out,transform .1s ease-out;transform:translateY(-10px);min-width:200px;border-radius:4px;color:var(--pvt-text-color-5)}.pvt-contextmenu.shown{opacity:100;transform:translateY(0)}.pvt-contextmenu .pvt-contextmenu-topbar{display:flex;align-items:center;background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom:1px solid var(--pvt-tooltip-floating-bg-color);padding:2px;margin-bottom:4px;border-top-right-radius:4px;border-top-left-radius:4px}.pvt-contextmenu .pvt-contextmenu-topbar .pvt-action-list{width:100%;display:flex;flex-direction:row;align-items:center;gap:.5em}.pvt-contextmenu .pvt-contextmenu-topbar .pvt-action-list .pivotick-button{border-radius:4px}.pvt-contextmenu .pvt-contextmenu-topbar .pvt-action-list .pivotick-button .pvt-icon{font-size:20px}.pvt-contextmenu .pvt-contextmenu-mainmenu{display:flex;flex-direction:row;align-items:center;gap:10px;background-color:var(--pvt-sidebar-mainpanelheader-bg);border-bottom-right-radius:4px;border-bottom-left-radius:4px}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list{width:100%}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list .pvt-action-item{padding:6px 8px;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list .pvt-action-item .pvt-icon{font-size:20px}.pvt-contextmenu .pvt-contextmenu-mainmenu .pvt-action-list .pvt-action-item .pvt-action-text{margin-left:1em;text-align:end}.pvt-contextmenu .pvt-action-item-primary{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}.pvt-contextmenu .pvt-action-item-primary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-primary) 80%,#fff)}.pvt-contextmenu .pvt-action-item-secondary{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-contextmenu .pvt-action-item-secondary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary),#000);color:color-mix(in srgb,var(--pvt-text-color-for-primary) 80%,secondary)}.pvt-contextmenu .pvt-action-item-info{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-contextmenu .pvt-action-item-info:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-info) 80%,#fff)}.pvt-contextmenu .pvt-action-item-warning{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}.pvt-contextmenu .pvt-action-item-warning:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-warning) 80%,#fff)}.pvt-contextmenu .pvt-action-item-danger{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-contextmenu .pvt-action-item-danger:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-danger) 80%,#fff)}.pvt-contextmenu .pvt-action-item-success{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}.pvt-contextmenu .pvt-action-item-success:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 80%,#000);color:color-mix(in srgb,var(--pvt-text-color-for-success) 80%,#fff)}.pvt-contextmenu .pvt-action-item-outline-primary:hover{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}.pvt-contextmenu .pvt-action-item-outline-secondary:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}.pvt-contextmenu .pvt-action-item-outline-info:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}.pvt-contextmenu .pvt-action-item-outline-warning:hover{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}.pvt-contextmenu .pvt-action-item-outline-danger:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}.pvt-contextmenu .pvt-action-item-outline-success:hover{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}:root{--pvt-bg: var(--pvt-bg-color-0);--pvt-ui-bg: var(--pvt-bg-color-0);--pvt-border-color: var(--pvt-bg-color-7);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #f2f2f2;--pvt-theme-info: #25B6EB;--pvt-theme-warning: #F59E0B;--pvt-theme-danger: #DC2626;--pvt-theme-success: #16A34A;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #fff;--pvt-text-color-1: #e0e0e0;--pvt-text-color-2: #bbb;--pvt-text-color-3: #999;--pvt-text-color-4: #666;--pvt-text-color-5: #333;--pvt-text-color-6: #000;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), black 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), black 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), black 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), black 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), black 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), black 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #000;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #fff;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #aaaaaa55;--pvt-sidebar-bg: var(--pvt-bg-color-0);--pvt-sidebar-mainpanelheader-bg: var(--pvt-bg-color-1);--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-0);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-layout-shadow-top: rgba(0, 0, 0, .07) 3px -2px 3px 0px, rgba(0, 0, 0, .04) 2px -3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-6);--pvt-tooltip-property-list: var(--pvt-bg-color-2);--pvt-menu-bg-color: var(--pvt-bg-color-1);--pvt-menu-border-color: var(--pvt-text-color-1);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18), rgba(0, 0, 0, .09) 0 -1px 2px;--pvt-modal-bg: var(--pvt-bg-color-0);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: #f5f5f5;--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(0, 0, 0, .22) 0px 0px 4px, rgba(0, 0, 0, .3) 0px 1px 2px;--pvt-selection-color: #f0636a;--pvt-selection-stroke-color: #f0636a;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #007acc;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 2;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: #f0636a;--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-selected-big-animation: glowPulseBigSelected 1.5s infinite;--pvt-node-highlighted-stroke: #007acc;--pvt-node-highlighted-stroke-width: 2;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #333;--pvt-node-cluster-fill: rgba(0, 0, 0, .062745098);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #fff);--pvt-edge-stroke: color-mix(in srgb, #007acc 50%, #fff);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-4);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-6);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px orange);--pvt-edge-label-selected-stroke: orange;--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-edge-label-color);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-4);--pvt-inline-bar-bg: var(--pvt-bg-color-2);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 20%, #fff) 0%, var(--pvt-bg-color-primary) 70%, color-mix(in srgb, var(--pvt-bg-color-primary) 80%, #000) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: color-mix(in srgb, var(--pvt-text-color-6) 15%, transparent) 0px 1px 1px 0px, color-mix(in srgb, var(--pvt-text-color-6) 10%, transparent) 0px 0px 2px 0px, inset 0 1px 2px rgba(0, 0, 0, .05);--pvt-bg-color-0: #fff;--pvt-bg-color-1: #fafafa;--pvt-bg-color-2: #f3f3f3;--pvt-bg-color-3: #ededed;--pvt-bg-color-4: #e6e6e6;--pvt-bg-color-5: #e0e0e0;--pvt-bg-color-6: #d6d6d6;--pvt-bg-color-7: #cccccc;--pvt-bg-color-8: #c2c2c2;--pvt-vibrant-blue: #007acc;--pvt-vibrant-indigo: #7000cc;--pvt-vibrant-lobster: #f0636a;--pvt-vibrant-green: #81dd18;--pvt-vibrant-amaranth: #eb2e53}@media(prefers-color-scheme:dark){:root:not([data-theme]){--pvt-bg: var(--pvt-bg-color-2);--pvt-ui-bg: var(--pvt-bg-color-5);--pvt-border-color: var(--pvt-bg-color-3);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #666666;--pvt-theme-info: #2E67F8;--pvt-theme-warning: #ff8000;--pvt-theme-danger: #EB212E;--pvt-theme-success: #2FF924;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #000;--pvt-text-color-1: #333;--pvt-text-color-2: #666;--pvt-text-color-3: #999;--pvt-text-color-4: #bbb;--pvt-text-color-5: #e0e0e0;--pvt-text-color-6: #fff;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), white 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), white 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), white 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), white 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), white 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), white 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #fff;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #000;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #00000055;--pvt-sidebar-mainpanelheader-bg: unset;--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-6);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-8);--pvt-tooltip-property-list: var(--pvt-bg-color-6);--pvt-menu-bg-color: var(--pvt-bg-color-7);--pvt-menu-border-color: var(--pvt-bg-color-2);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18);--pvt-modal-bg: var(--pvt-bg-color-7);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: var(--pvt-bg-color-4);--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(255, 255, 255, .15) 0px 0px 4px rgba(255, 255, 255, .1) 0px 1px 2px;--pvt-selection-color: #F2545B;--pvt-selection-stroke-color: #F2545B;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #7EA2FB;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 0;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: var(--pvt-selection-color);--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-highlighted-stroke: #7EA2FB;--pvt-node-highlighted-stroke-width: 0;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #fff;--pvt-node-cluster-fill: rgba(255, 255, 255, .0235294118);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #000);--pvt-edge-stroke: color-mix(in srgb, #7EA2FB 50%, #000);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-5);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-5);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px var(--pvt-selection-color));--pvt-edge-label-selected-stroke: var(--pvt-selection-color);--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-text-color-5);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-5);--pvt-inline-bar-bg: var(--pvt-bg-color-6);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 90%, #000) 0%, var(--pvt-bg-color-primary) 60%, color-mix(in srgb, var(--pvt-bg-color-primary) 60%, #fff) 80%, color-mix(in srgb, var(--pvt-bg-color-primary) 30%, #fff) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: inset 0 1px 2px var(--pvt-bg-color-0);--pvt-bg-color-0: #0F0F10;--pvt-bg-color-1: #131314;--pvt-bg-color-2: #171719;--pvt-bg-color-3: #1A1A1D;--pvt-bg-color-4: #1D1D20;--pvt-bg-color-5: #202023;--pvt-bg-color-6: #252528;--pvt-bg-color-7: #343437;--pvt-bg-color-8: #464649;--pvt-vibrant-blue: #7EA2FB;--pvt-vibrant-indigo: #A666F4;--pvt-vibrant-lobster: #F2545B;--pvt-vibrant-green: #85CB33;--pvt-vibrant-amaranth: #eb2e53}}.pivotick[data-theme=light]{--pvt-bg: var(--pvt-bg-color-0);--pvt-ui-bg: var(--pvt-bg-color-0);--pvt-border-color: var(--pvt-bg-color-7);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #f2f2f2;--pvt-theme-info: #25B6EB;--pvt-theme-warning: #F59E0B;--pvt-theme-danger: #DC2626;--pvt-theme-success: #16A34A;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #fff;--pvt-text-color-1: #e0e0e0;--pvt-text-color-2: #bbb;--pvt-text-color-3: #999;--pvt-text-color-4: #666;--pvt-text-color-5: #333;--pvt-text-color-6: #000;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), black 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), black 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), black 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), black 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), black 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), black 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #000;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #fff;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #aaaaaa55;--pvt-sidebar-bg: var(--pvt-bg-color-0);--pvt-sidebar-mainpanelheader-bg: var(--pvt-bg-color-1);--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-0);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-layout-shadow-top: rgba(0, 0, 0, .07) 3px -2px 3px 0px, rgba(0, 0, 0, .04) 2px -3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-6);--pvt-tooltip-property-list: var(--pvt-bg-color-2);--pvt-menu-bg-color: var(--pvt-bg-color-1);--pvt-menu-border-color: var(--pvt-text-color-1);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18), rgba(0, 0, 0, .09) 0 -1px 2px;--pvt-modal-bg: var(--pvt-bg-color-0);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: #f5f5f5;--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(0, 0, 0, .22) 0px 0px 4px, rgba(0, 0, 0, .3) 0px 1px 2px;--pvt-selection-color: #f0636a;--pvt-selection-stroke-color: #f0636a;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #007acc;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 2;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: #f0636a;--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-selected-big-animation: glowPulseBigSelected 1.5s infinite;--pvt-node-highlighted-stroke: #007acc;--pvt-node-highlighted-stroke-width: 2;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #333;--pvt-node-cluster-fill: rgba(0, 0, 0, .062745098);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #fff);--pvt-edge-stroke: color-mix(in srgb, #007acc 50%, #fff);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-4);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-6);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px orange);--pvt-edge-label-selected-stroke: orange;--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-edge-label-color);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-4);--pvt-inline-bar-bg: var(--pvt-bg-color-2);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 20%, #fff) 0%, var(--pvt-bg-color-primary) 70%, color-mix(in srgb, var(--pvt-bg-color-primary) 80%, #000) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: color-mix(in srgb, var(--pvt-text-color-6) 15%, transparent) 0px 1px 1px 0px, color-mix(in srgb, var(--pvt-text-color-6) 10%, transparent) 0px 0px 2px 0px, inset 0 1px 2px rgba(0, 0, 0, .05);--pvt-bg-color-0: #fff;--pvt-bg-color-1: #fafafa;--pvt-bg-color-2: #f3f3f3;--pvt-bg-color-3: #ededed;--pvt-bg-color-4: #e6e6e6;--pvt-bg-color-5: #e0e0e0;--pvt-bg-color-6: #d6d6d6;--pvt-bg-color-7: #cccccc;--pvt-bg-color-8: #c2c2c2;--pvt-vibrant-blue: #007acc;--pvt-vibrant-indigo: #7000cc;--pvt-vibrant-lobster: #f0636a;--pvt-vibrant-green: #81dd18;--pvt-vibrant-amaranth: #eb2e53}.pivotick[data-theme=dark]{--pvt-bg: var(--pvt-bg-color-2);--pvt-ui-bg: var(--pvt-bg-color-5);--pvt-border-color: var(--pvt-bg-color-3);--pvt-theme-primary: #eb2e53;--pvt-theme-secondary: #666666;--pvt-theme-info: #2E67F8;--pvt-theme-warning: #ff8000;--pvt-theme-danger: #EB212E;--pvt-theme-success: #2FF924;--pvt-font-family: system-ui, sans-serif;--pvt-text-color-0: #000;--pvt-text-color-1: #333;--pvt-text-color-2: #666;--pvt-text-color-3: #999;--pvt-text-color-4: #bbb;--pvt-text-color-5: #e0e0e0;--pvt-text-color-6: #fff;--pvt-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary), white 50%);--pvt-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary), white 50%);--pvt-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info), white 50%);--pvt-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning), white 50%);--pvt-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger), white 50%);--pvt-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success), white 50%);--pvt-bg-color-primary: var(--pvt-theme-primary);--pvt-bg-color-secondary: var(--pvt-theme-secondary);--pvt-bg-color-info: var(--pvt-theme-info);--pvt-bg-color-warning: var(--pvt-theme-warning);--pvt-bg-color-danger: var(--pvt-theme-danger);--pvt-bg-color-success: var(--pvt-theme-success);--pvt-text-color-for-primary: #fff;--pvt-text-color-for-secondary: #fff;--pvt-text-color-for-info: #fff;--pvt-text-color-for-warning: #fff;--pvt-text-color-for-danger: #fff;--pvt-text-color-for-success: #000;--pvt-box-shadow-light: rgba(0, 0, 0, .25) 0px 1px 2px 0px;--pvt-box-shadow-medium: rgba(0, 0, 0, .1) 0px 4px 6px -1px, rgba(0, 0, 0, .06) 0px 2px 4px -1px;--pvt-box-shadow-strong: rgba(0, 0, 0, .16) 0px 3px 6px, rgba(0, 0, 0, .23) 0px 3px 6px;--pvt-box-shadow-color-strong: #00000055;--pvt-sidebar-mainpanelheader-bg: unset;--pvt-sidebar-panelheader-bg: var(--pvt-bg-color-4);--pvt-sidebar-panelbody-bg: var(--pvt-bg-color-0);--pvt-sidebar-panel-border: 1px solid var(--pvt-text-color-1);--pvt-sidebar-subpanelheader-bg: var(--pvt-bg-color-2);--pvt-mainheader-nodepreview-bg: var(--pvt-bg-color-6);--pvt-sidebar-layout-shadow-right: rgba(0, 0, 0, .07) 2px 0px 3px 0px, rgba(0, 0, 0, .04) 3px 0px 2px 0px;--pvt-sidebar-layout-shadow-left: rgba(0, 0, 0, .07) -2px 0px 3px 0px, rgba(0, 0, 0, .04) -3px 0px 2px 0px;--pvt-sidebar-layout-shadow-bottom: rgba(0, 0, 0, .07) 3px 2px 3px 0px, rgba(0, 0, 0, .04) 2px 3px 2px 0px;--pvt-sidebar-collapse-bg: var(--pvt-bg);--pvt-sidebar-collapse-color: var(--pvt-text-color-4);--pvt-sidebar-collapse-shadow: var(--pvt-box-shadow-strong);--pvt-tooltip-floating-bg-color: var(--pvt-bg-color-8);--pvt-tooltip-property-list: var(--pvt-bg-color-6);--pvt-menu-bg-color: var(--pvt-bg-color-7);--pvt-menu-border-color: var(--pvt-bg-color-2);--pvt-menu-shadow: var(--pvt-sidebar-layout-shadow-right);--pvt-action-container-shadow: inset 0 1px 2px rgba(255, 255, 255, .12), inset 0 -1px 2px rgba(0, 0, 0, .18);--pvt-modal-bg: var(--pvt-bg-color-7);--pvt-modal-text-color: var(--pvt-text-color-5);--pvt-modal-overlay-bg: rgba(0, 0, 0, .45);--pvt-modal-shadow: 0 20px 40px rgba(0, 0, 0, .25), 0 4px 12px rgba(0, 0, 0, .15);--pvt-toast-bg-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 40%, white);--pvt-toast-bg-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 40%, white);--pvt-toast-bg-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 40%, white);--pvt-toast-bg-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 40%, white);--pvt-toast-bg-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 40%, white);--pvt-toast-bg-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 40%, white);--pvt-toast-text-color-primary: color-mix(in srgb, var(--pvt-bg-color-primary) 70%, black);--pvt-toast-text-color-secondary: color-mix(in srgb, var(--pvt-bg-color-secondary) 70%, black);--pvt-toast-text-color-info: color-mix(in srgb, var(--pvt-bg-color-info) 70%, black);--pvt-toast-text-color-warning: color-mix(in srgb, var(--pvt-bg-color-warning) 70%, black);--pvt-toast-text-color-danger: color-mix(in srgb, var(--pvt-bg-color-danger) 70%, black);--pvt-toast-text-color-success: color-mix(in srgb, var(--pvt-bg-color-success) 70%, black);--pvt-graph-grid-color: var(--pvt-bg-color-4);--pvt-graph-background-image: repeating-linear-gradient(0deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px), repeating-linear-gradient(90deg, var(--pvt-graph-grid-color) 0px, var(--pvt-graph-grid-color) 1px, transparent 1px, transparent 20px);--pvt-graph-navigation-control-container-shadow: rgba(255, 255, 255, .15) 0px 0px 4px rgba(255, 255, 255, .1) 0px 1px 2px;--pvt-selection-color: #F2545B;--pvt-selection-stroke-color: #F2545B;--pvt-selection-rectangle-fill: color-mix(in srgb, var(--pvt-selection-color) 20%, rgba(255, 255, 255, 0));--pvt-selection-rectangle-stroke: color-mix(in srgb, var(--pvt-selection-color) 80%, rgba(255, 255, 255, 0));--pvt-node-color: #7EA2FB;--pvt-node-stroke: #fff;--pvt-node-stroke-width: 0;--pvt-node-text-color: #fff;--pvt-node-icon-font-family: "Font Awesome 7 Free";--pvt-node-icon-font-weight: 900;--pvt-node-selected-color: var(--pvt-selection-color);--pvt-node-selected-stroke: var(--pvt-selection-stroke-color);--pvt-node-selected-stroke-width: 0;--pvt-node-selected-stroke-opacity: 0;--pvt-node-selected-filter: drop-shadow(0 0 2px var(--pvt-node-selected-color));--pvt-node-selected-animation: glowPulseSelected 1.5s infinite;--pvt-node-highlighted-stroke: #7EA2FB;--pvt-node-highlighted-stroke-width: 0;--pvt-node-highlighted-filter: drop-shadow(0 0 2px var(--pvt-node-highlighted-stroke));--pvt-node-highlighted-opacity: 1;--pvt-node-highlighted-animation: glowPulseHighlighted 1.5s infinite;--pvt-node-dash-stroke: #fff;--pvt-node-cluster-fill: rgba(255, 255, 255, .0235294118);--pvt-node-cluster-stroke: color-mix(in srgb, var(--pvt-node-dash-stroke) 60%, #000);--pvt-edge-stroke: color-mix(in srgb, #7EA2FB 50%, #000);--pvt-edge-stroke-width: 2;--pvt-edge-stroke-opacity: 1;--pvt-edge-stroke-dasharray: 6, 4;--pvt-edge-animation: dashmove-edge 1s linear infinite;--pvt-edge-filter: none;--pvt-edge-label-bg: var(--pvt-bg-color-5);--pvt-edge-label-font-family: system-ui, sans-serif;--pvt-edge-label-font-size: 12px;--pvt-edge-label-color: var(--pvt-text-color-5);--pvt-edge-label-stroke: none;--pvt-edge-label-stroke-width: 1;--pvt-edge-selected-stroke: var(--pvt-selection-color);--pvt-edge-selected-stroke-width: 5;--pvt-edge-selected-stroke-opacity: .8;--pvt-edge-selected-filter: drop-shadow(0 0 1px var(--pvt-selection-color));--pvt-edge-label-selected-stroke: var(--pvt-selection-color);--pvt-edge-label-selected-stroke-width: 2;--pvt-edge-label-selected-color: var(--pvt-text-color-5);--pvt-edge-label-selected-font-size: var(--pvt-edge-label-font-size);--pvt-edge-label-selected-bg: var(--pvt-bg-color-5);--pvt-inline-bar-bg: var(--pvt-bg-color-6);--pvt-inline-bar-fill-bg: linear-gradient( 90deg, color-mix(in srgb, var(--pvt-bg-color-primary) 90%, #000) 0%, var(--pvt-bg-color-primary) 60%, color-mix(in srgb, var(--pvt-bg-color-primary) 60%, #fff) 80%, color-mix(in srgb, var(--pvt-bg-color-primary) 30%, #fff) 100% );--pvt-inline-bar-height: .5rem;--pvt-inline-bar-width: 80px;--pvt-inline-bar-shadow: inset 0 1px 2px var(--pvt-bg-color-0);--pvt-bg-color-0: #0F0F10;--pvt-bg-color-1: #131314;--pvt-bg-color-2: #171719;--pvt-bg-color-3: #1A1A1D;--pvt-bg-color-4: #1D1D20;--pvt-bg-color-5: #202023;--pvt-bg-color-6: #252528;--pvt-bg-color-7: #343437;--pvt-bg-color-8: #464649;--pvt-vibrant-blue: #7EA2FB;--pvt-vibrant-indigo: #A666F4;--pvt-vibrant-lobster: #F2545B;--pvt-vibrant-green: #85CB33;--pvt-vibrant-amaranth: #eb2e53}@keyframes glowPulseSelected{0%{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-selected-color))}50%{stroke-width:5;filter:drop-shadow(0 0 3px var(--pvt-node-selected-color))}to{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-selected-color))}}@keyframes glowPulseBigSelected{0%{stroke-width:3;filter:drop-shadow(0 0 5px var(--pvt-node-selected-color))}50%{stroke-width:5;filter:drop-shadow(0 0 7px var(--pvt-node-selected-color))}to{stroke-width:3;filter:drop-shadow(0 0 5px var(--pvt-node-selected-color))}}@keyframes glowPulseHighlighted{0%{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-highlighted-stroke))}50%{stroke-width:5;filter:drop-shadow(0 0 3px var(--pvt-node-highlighted-stroke))}to{stroke-width:3;filter:drop-shadow(0 0 1px var(--pvt-node-highlighted-stroke))}}@keyframes dashmove-edge{to{stroke-dashoffset:-10}}@keyframes dashmove-cluster{to{stroke-dashoffset:-6.2831853072}}.pvt-layout{color:var(--pvt-text-color-6)}.hidden{display:none}.pvt-canvas{display:block;min-height:300px;max-height:100%;background-color:var(--pvt-bg);background-image:var(--pvt-graph-background-image)}.pvt-loading-progress-bar{padding:.75em;background:var(--pvt-menu-bg-color);border:1px solid var(--pvt-menu-border-color);box-shadow:var(--pvt-box-shadow-strong);display:flex;flex-direction:column;align-items:center}.pvt-loading-progress-bar.hidden{visibility:hidden}.pvt-loading-progress-bar div.background{padding:10px;box-sizing:border-box;margin-bottom:.5em}.pvt-loading-progress-bar div.background .track{position:relative;background:#e0e0e0;border-radius:4px;height:8px;rx:4;ry:4;overflow:hidden}.pvt-loading-progress-bar div.background .fill{height:100%;background:var(--pvt-bg-color-primary)}.pvt-loading-progress-bar span.label{text-anchor:middle;font-size:16px;fill:#555}dl.pvt-property-list{margin:0;font-size:.95em;overflow:hidden;display:grid;grid-template-columns:fit-content(120px) 1fr;gap:8px 12px}dl.pvt-property-list .pvt-property-row{display:contents;padding:.25em 0;align-items:center}dl.pvt-property-list .pvt-property-row .pvt-property-name{padding:2px 4px;font-size:.9rem;font-weight:300;color:var(--pvt-text-color-5);text-align:end;align-self:start;white-space:normal;-webkit-user-select:all;user-select:all;overflow:hidden;text-overflow:ellipsis}dl.pvt-property-list .pvt-property-row .pvt-property-value{margin-inline-start:0;font-size:.875rem;font-weight:400;padding:2px 4px;align-self:start;color:var(--pvt-text-color-primary);-webkit-user-select:all;user-select:all;min-height:1em;white-space:normal;overflow:auto;word-break:break-all;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;box-orient:vertical}.pvt-form{display:flex;flex-direction:column;gap:16px}.pvt-form .pvt-form-element label{display:block;font-size:.9em;font-weight:300;color:var(--pvt-text-color-5);text-align:start;align-self:start;white-space:normal;overflow:hidden;text-overflow:ellipsis;margin-bottom:2px}.pvt-form .pvt-form-element input{display:inline-block;width:100%;padding:.5rem .75rem;font-size:1rem;border-radius:.25rem;transition:border-color .2s ease,box-shadow .2s ease}.pvt-form .pvt-form-element input::placeholder{opacity:.7}.pvt-form .pvt-form-element input:focus{outline:none}.pvt-form .pvt-form-element input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.pvt-form .pvt-form-element input{background-color:var(--pvt-ui-bg);color:var(--pvt-text-color-6);border:1px solid var(--pvt-border-color)}.pvt-form .pvt-form-element input::placeholder{color:var(--pvt-text-color-6);opacity:.7}.pvt-form .pvt-form-element input:focus{border-color:color-mix(in srgb,var(--pvt-bg-color-primary) 80%,black)}.pvt-form .pvt-form-element input:disabled{background-color:var(--pvt-bg-color-3);cursor:not-allowed}.pvt-form .pvt-form-element input{box-sizing:border-box;background:var(--pvt-bg-color-7);color:var(--pvt-text-color-4);border-color:var(--pvt-menu-border-color)}.pvt-keyboard-shortcut{padding:4px 6px;font-size:.8em;border-radius:4px;background:transparent;border:1px solid var(--pvt-bg-color-7);-webkit-user-select:none;user-select:none}.pvt-node-selected-highlight>.node{fill:var(--pvt-node-selected-color);stroke:var(--pvt-node-selected-stroke);stroke-width:var(--pvt-node-selected-stroke-width);stroke-opacity:var(--pvt-node-selected-stroke-opacity);filter:var(--pvt-node-selected-filter);animation:var(--pvt-node-selected-animation)}.pvt-node-selected-highlight>.pvt-cluster-area{stroke:var(--pvt-node-selected-stroke)}.pvt-node-selected-highlight.pvt-node-highlighted{animation:var(--pvt-node-selected-big-animation)}.pvt-node-selected-highlight-shadow>*{filter:grayscale(.5);opacity:.5}.pvt-edge-selected-highlight-shadow>*{filter:grayscale(.5);opacity:.5}.pvt-node-highlighted>.node{stroke:var(--pvt-node-highlighted-stroke);stroke-width:var(--pvt-node-highlighted-stroke-width);opacity:var(--pvt-node-highlighted-opacity);filter:var(--pvt-node-highlighted-filter);animation:var(--pvt-node-highlighted-animation)}.pvt-edge-group path{filter:var(--pvt-edge-filter)}.pvt-edge-group path.dashed{stroke-dasharray:var(--pvt-edge-stroke-dasharray)}.pvt-edge-group path.dashed.animated{stroke-dashoffset:0;animation:var(--pvt-edge-animation)}.pvt-edge-group .label-container rect{stroke:var(--pvt-edge-label-stroke);stroke-width:var(--pvt-edge-label-stroke-width);background-color:var(--pvt-edge-label-bg)}.pvt-edge-group .label-container text{color:var(--pvt-edge-label-color);font-family:var(--pvt-edge-label-font-family);font-size:var(--pvt-edge-label-font-size);-webkit-user-select:none;user-select:none}.pvt-edge-group.selected path{stroke:var(--pvt-edge-selected-stroke);stroke-width:var(--pvt-edge-selected-stroke-width);filter:var(--pvt-edge-selected-filter)}.pvt-edge-group.selected .label-container rect{stroke:var(--pvt-edge-label-selected-stroke);stroke-width:var(--pvt-edge-label-selected-stroke-width);background-color:var(--pvt-edge-label-selected-bg)}.pvt-edge-group.selected .label-container text{color:var(--pvt-edge-label-selected-color);font-size:var(--pvt-edge-label-selected-font-size)}.pvt-edge-group.pvt-edge-synthetic path{stroke-dasharray:3}.pvt-node text.icon{-webkit-user-select:none;user-select:none;pointer-events:none}.pvt-node text.icon.icon-unicode{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--pvt-node-icon-font-family, '"Font Awesome 7 Free"');font-feature-settings:normal;font-style:normal;font-synthesis:none;font-variant:normal;font-weight:var(--pvt-node-icon-font-weight, 900);line-height:1;text-align:center;text-rendering:auto}.pvt-node.pvt-node-has-children .node-icon.expand-icon{fill:var(--pvt-bg-color-info)}.pvt-node.pvt-node-has-children .node-icon.expand-icon text{stroke:var(--pvt-text-color-for-info)}.pvt-node.pvt-node-has-children .node-icon.expand-icon:hover{fill:color-mix(in srgb,var(--pvt-bg-color-info) 90%,black)}.pvt-node.pvt-node-has-children .node-icon.expand-icon:active{fill:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon{fill:var(--pvt-bg-color-secondary)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon text{stroke:var(--pvt-text-color-for-secondary)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon:hover{fill:color-mix(in srgb,var(--pvt-bg-color-secondary) 90%,black)}.pvt-node.pvt-node-has-children .node-icon.collapse-icon:active{fill:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black)}.pvt-node.pvt-node-has-children .node-icon{stroke:var(--pvt-bg);stroke-width:1.5;cursor:pointer}.pvt-node.pvt-node-has-children .node-icon text{text-anchor:middle;dominant-baseline:central;pointer-events:none}.pvt-node.pvt-node-has-children.pvt-node-expanded>.node{filter:drop-shadow(2px 2px 3px var(--pvt-box-shadow-color-strong))}.pvt-node.pvt-node-has-children:not(.pvt-node-expanded)>.node{stroke-width:1;stroke-linecap:round;stroke:var(--pvt-node-dash-stroke);stroke-dasharray:3.1415926536}.pvt-node.pvt-node-has-children:not(.pvt-node-expanded)>.node:hover{animation:dashmove-cluster 1s linear infinite}.pvt-cluster-area{fill:var(--pvt-node-cluster-fill);stroke-dasharray:4 2;stroke-width:2;stroke-linecap:round;stroke:var(--pvt-node-cluster-stroke);stroke-dasharray:3 3.16}svg[data-renderer-drag-enabled="1"] .pvt-node:hover{cursor:grab}.pvt-selection-rectangle{fill:var(--pvt-selection-rectangle-fill);stroke:var(--pvt-selection-rectangle-stroke);stroke-width:2px}.pvt-icon.fixed-width{width:1em}button.pivotick-button-primary{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-primary .pvt-icon{margin-right:.2em!important}button.pivotick-button-primary{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}button.pivotick-button-primary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 90%,black)}button.pivotick-button-primary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-primary:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-secondary{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-secondary .pvt-icon{margin-right:.2em!important}button.pivotick-button-secondary{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}button.pivotick-button-secondary:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 90%,black)}button.pivotick-button-secondary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-secondary:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-info{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-info .pvt-icon{margin-right:.2em!important}button.pivotick-button-info{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}button.pivotick-button-info:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 90%,black)}button.pivotick-button-info:active{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-info:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-warning{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-warning .pvt-icon{margin-right:.2em!important}button.pivotick-button-warning{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}button.pivotick-button-warning:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 90%,black)}button.pivotick-button-warning:active{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-warning:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-danger{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-danger .pvt-icon{margin-right:.2em!important}button.pivotick-button-danger{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}button.pivotick-button-danger:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 90%,black)}button.pivotick-button-danger:active{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-danger:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-success{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-success .pvt-icon{margin-right:.2em!important}button.pivotick-button-success{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}button.pivotick-button-success:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 90%,black)}button.pivotick-button-success:active{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-success:disabled{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 75%,black);cursor:not-allowed;transform:none}button.pivotick-button-link{display:inline-flex;align-items:center;justify-content:center;border:none;padding:.5rem 1rem;font-size:.9rem;font-weight:600;border-radius:.25rem;cursor:pointer;transition:background-color .1s ease}button.pivotick-button-link .pvt-icon{margin-right:.2em!important}button.pivotick-button-link{background-color:transparent;color:var(--pvt-text-color-6)}button.pivotick-button-link:hover{color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white)}button.pivotick-button-link:active{color:color-mix(in srgb,var(--pvt-text-color-5) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-link:disabled{color:color-mix(in srgb,var(--pvt-text-color-5) 80%,white);cursor:not-allowed;transform:none}button.pivotick-button-outline-primary{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-primary:hover{background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}button.pivotick-button-outline-primary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-primary:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-primary:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-primary) 85%,black)}button.pivotick-button-outline-secondary{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-secondary:hover{background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}button.pivotick-button-outline-secondary:active{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-secondary:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-secondary:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-secondary) 85%,black)}button.pivotick-button-outline-info{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-info:hover{background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}button.pivotick-button-outline-info:active{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-info:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-info:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-info) 85%,black)}button.pivotick-button-outline-warning{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-warning:hover{background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}button.pivotick-button-outline-warning:active{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-warning:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-warning:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-warning) 85%,black)}button.pivotick-button-outline-danger{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-danger:hover{background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}button.pivotick-button-outline-danger:active{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-danger:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-danger:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-danger) 85%,black)}button.pivotick-button-outline-success{display:inline-flex;align-items:center;justify-content:center;padding:.5rem 1rem;font-size:.9rem;font-weight:600;cursor:pointer;border-radius:.25rem;transition:background-color .1s ease;background-color:transparent;color:var(--pvt-text-color);border:none}button.pivotick-button-outline-success:hover{background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}button.pivotick-button-outline-success:active{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 85%,black);transition:transform .05s ease-out;transform:scale(.95)}button.pivotick-button-outline-success:disabled{cursor:not-allowed;transform:none}button.pivotick-button-outline-success:disabled:hover{background-color:color-mix(in srgb,var(--pvt-bg-color-success) 85%,black)}button.pivotick-button-block{width:100%}button.pivotick-button-sm{padding:.25rem .4rem;font-size:.8rem;font-weight:600;border-radius:.25rem}button.pivotick-button-xs{padding:.1rem .25rem;font-size:.75rem;font-weight:600;border-radius:.25rem}.pivotick{width:100%;height:100%;color:var(--pvt-text-color-6);background-color:var(--pvt-bg);font-family:var(--pvt-font-family);position:relative;overflow:hidden}.pvt-layout{--pvt-sidebar-width: 340px;--pvt-toolbar-height: 48px;position:relative;width:100%;height:100%;display:grid;grid-template-columns:auto 1fr;grid-template-rows:var(--pvt-toolbar-height) 1fr;grid-template-areas:"sidebar toolbar" "sidebar canvas"}.pvt-layout.mode-static,.pvt-layout.mode-viewer{grid-template-columns:0px 1fr;grid-template-rows:0px 1fr}.pvt-layout.mode-light{grid-template-columns:0px 1fr;grid-template-rows:var(--pvt-toolbar-height) 1fr}.pvt-layout.mode-full.sidebar-collapsed{grid-template-columns:0px 1fr}.pvt-sidebar{width:var(--pvt-sidebar-width);grid-area:sidebar;height:100%;transition:width .1s ease-out}.pvt-sidebar .pvt-sidebar-elements{opacity:100%}.pvt-sidebar .pvt-sidebar-elements .pvt-sidebar-separator{border-bottom:var(--pvt-sidebar-panel-border)}.pvt-sidebar.pvt-sidebar-collapsed{width:0px}.pvt-sidebar.pvt-sidebar-collapsed .pvt-sidebar-elements{opacity:0%}.pvt-canvas{grid-area:canvas;height:100%;width:100%;position:relative;overflow:hidden}.pvt-canvas .pvt-slide-panel{position:absolute;top:0;bottom:0;right:0;max-width:30%;min-width:220px;overflow-y:auto;height:100%;z-index:1000}.pvt-canvas .pvt-notification{position:absolute;top:1em;right:3em;max-width:280px;display:flex;flex-direction:column;gap:4px}.pvt-toolbar{grid-area:toolbar;height:100%;width:100%;z-index:10;display:flex;flex-direction:row;align-items:center}.pvt-graphnavigation{position:absolute;top:1rem;right:1rem;z-index:5}.pvt-graphcontrols{position:absolute;top:1rem;left:1rem;z-index:5}.pivotick-inline-bar-container{position:relative;display:inline-block;height:var(--pvt-inline-bar-height);width:var(--pvt-inline-bar-width);background:var(--pvt-inline-bar-bg);box-shadow:var(--pvt-inline-bar-shadow);border-radius:4px;overflow:hidden;vertical-align:middle}.pivotick-inline-bar-container .pivotick-inline-bar-fill{display:block;height:100%;background:var(--pvt-inline-bar-fill-bg);background-repeat:no-repeat;border-radius:inherit;transition:width .4s cubic-bezier(.2,.9,.3,1),background-size .4s cubic-bezier(.2,.9,.3,1)}.pivotick-inline-bar-percent{white-space:"nowrap";width:36px;text-align:right;color:"var(--pvt-text-color-4)"}span.pivotick-badge-primary{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-primary);color:var(--pvt-text-color-for-primary)}span.pivotick-badge-secondary{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-secondary);color:var(--pvt-text-color-for-secondary)}span.pivotick-badge-info{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-info);color:var(--pvt-text-color-for-info)}span.pivotick-badge-warning{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-warning);color:var(--pvt-text-color-for-warning)}span.pivotick-badge-danger{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-danger);color:var(--pvt-text-color-for-danger)}span.pivotick-badge-success{display:inline-block;padding:.2rem .5rem;font-size:.9rem;font-weight:600;border-radius:16px;transition:background-color .1s ease;background-color:var(--pvt-bg-color-success);color:var(--pvt-text-color-for-success)}span.pivotick-badge-sm{padding:.15rem .25rem;font-size:.8rem}span.pivotick-badge-xs{padding:.05rem .15rem;font-size:.75rem}span.pivotick-badge-xxs{padding:.025rem .1rem;font-size:.6rem}.pvt-picker{position:relative;width:100%;font-family:var(--pvt-font-family)}.pvt-picker__control{display:flex;flex-wrap:wrap;align-items:center;cursor:text}.pvt-picker__input{flex:1;min-width:80px;border:none;outline:none;background:transparent;color:var(--pvt-text-color-6);font-size:.9rem;padding:.5rem .75rem}.pvt-picker__input:disabled{cursor:default;opacity:.7}.pvt-picker__input-wrap{flex:1;position:relative;display:flex;align-items:center;min-width:80px;border-radius:.35rem;cursor:text}.pvt-picker__input-wrap:focus-within{border-color:var(--pvt-text-color-6, #888);box-shadow:0 0 0 2px var(--pvt-bg-color-7, rgba(0, 0, 0, .1))}.pvt-picker__single-close{position:absolute;right:.35rem;width:1.4rem;height:1.4rem;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:none;border:none;color:var(--pvt-text-color-4, #999);cursor:pointer;font-size:.95rem;line-height:1;transition:opacity .15s ease}.pvt-picker__single-close:hover{opacity:1}.pvt-picker__placeholder{color:var(--pvt-text-color-6);opacity:.7;-webkit-user-select:none;user-select:none}.pvt-picker__chips{display:flex;flex-wrap:wrap;gap:.25rem;flex:1;min-width:80px;padding:.5rem .75rem;border:1px solid var(--pvt-menu-border-color, #ccc);border-radius:.35rem;background:var(--pvt-bg, #fff);cursor:text}.pvt-picker__chip{display:flex;align-items:center;gap:.3rem;background:var(--pvt-bg-color-8, #e8edf2);border:1px solid var(--pvt-menu-border-color, #bbb);border-radius:.35rem;padding:.15rem 0;font-size:.82rem;-webkit-user-select:none;user-select:none}.pvt-picker__chip-label{padding:.15rem .35rem;white-space:nowrap}.pvt-picker__chip-remove{display:flex;align-items:center;justify-content:center;width:1.2rem;height:1.2rem;margin-right:.2rem;background:transparent;border:none;color:var(--pvt-text-color-4, #888);cursor:pointer;font-size:1rem;line-height:1;opacity:.7;transition:opacity .15s ease}.pvt-picker__chip-remove:hover{opacity:1;color:var(--pvt-text-color-6, #555)}.pvt-picker__clear{position:absolute;right:0;width:1.6rem;height:1.6rem;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:none;border:none;color:var(--pvt-text-color-4, #999);cursor:pointer;font-size:.95rem;line-height:1;transition:opacity .15s ease}.pvt-picker__clear:hover{opacity:1}.pvt-picker__dropdown{position:absolute;top:100%;left:0;right:0;background:var(--pvt-bg-color-7);border:1px solid var(--pvt-menu-border-color);box-shadow:var(--pvt-sidebar-layout-shadow-bottom);max-height:250px;overflow-y:auto;z-index:1000;opacity:0;transform:translateY(-6px);pointer-events:none}.pvt-picker__dropdown.open{opacity:1;transform:translateY(0);pointer-events:auto;transition:opacity .1s ease,transform .1s ease}.pvt-picker__search{padding:1px}.pvt-picker__search-input,.pvt-form .pvt-form-element .pvt-picker__search-input{width:100%;font-size:.9rem;color:var(--pvt-text-color-6);box-sizing:border-box;border-radius:0;border-color:var(--pvt-menu-border-color);background:var(--pvt-bg-color-6)}.pvt-picker__search-input::placeholder,.pvt-form .pvt-form-element .pvt-picker__search-input::placeholder{color:var(--pvt-text-color-6);opacity:.7}.pvt-picker__no-options{padding:.75rem;text-align:center;color:var(--pvt-text-color-4, #999);font-size:.9rem}.pvt-picker__option{padding:.5rem .75rem;cursor:pointer;color:var(--pvt-text-color-primary, #333);background:transparent;border-bottom:1px solid var(--pvt-bg-color-7, #eee);font-size:.9rem}.pvt-picker__option:hover{background:var(--pvt-bg-color-5, #f5f5f5)}.pvt-picker__option.focused{background:var(--pvt-bg-color-5, #f0f0f0)}.pvt-picker__option.focused-selected{font-weight:600;color:var(--pvt-text-color-6, #444)}.pvt-picker__option.selected{background:var(--pvt-bg-color-7, #e8edf2);color:var(--pvt-text-color-6, #555);font-weight:500}.pvt-picker__option.selected:after{content:" ✓";float:right;font-weight:600}.pvt-picker__option.disabled{background:var(--pvt-bg-color-7, #eee);cursor:not-allowed;opacity:.6}.pivotick-toast{min-width:250px;background-color:var(--pvt-toast-bg);box-shadow:0 4px 6px #00000026;border:1px solid color-mix(in srgb,var(--pvt-toast-bg) 85%,black);border-radius:4px;color:var(--pvt-toast-color);opacity:0;transform:translate(20px);transition:opacity .3s ease,transform .3s ease;z-index:1000}.pivotick-toast .pivotick-toast-title{font-weight:600;padding:.5em .75em}.pivotick-toast .pivotick-toast-body{padding:.5em .75em;border-top:1px solid color-mix(in srgb,var(--pvt-toast-bg) 85%,black)}.pivotick-toast.show{opacity:1;transform:translate(0)}.pivotick-toast.pivotick-toast-primary{--pvt-toast-bg: var(--pvt-toast-bg-color-primary);--pvt-toast-color: var(--pvt-toast-text-color-primary)}.pivotick-toast.pivotick-toast-secondary{--pvt-toast-bg: var(--pvt-toast-bg-color-secondary);--pvt-toast-color: var(--pvt-toast-text-color-secondary)}.pivotick-toast.pivotick-toast-info{--pvt-toast-bg: var(--pvt-toast-bg-color-info);--pvt-toast-color: var(--pvt-toast-text-color-info)}.pivotick-toast.pivotick-toast-warning{--pvt-toast-bg: var(--pvt-toast-bg-color-warning);--pvt-toast-color: var(--pvt-toast-text-color-warning)}.pivotick-toast.pivotick-toast-danger{--pvt-toast-bg: var(--pvt-toast-bg-color-danger);--pvt-toast-color: var(--pvt-toast-text-color-danger)}.pivotick-toast.pivotick-toast-success{--pvt-toast-bg: var(--pvt-toast-bg-color-success);--pvt-toast-color: var(--pvt-toast-text-color-success)} diff --git a/var/www/static/image/lookyloo.png b/var/www/static/image/lookyloo.png new file mode 100644 index 00000000..1a018dad Binary files /dev/null and b/var/www/static/image/lookyloo.png differ diff --git a/var/www/static/js/assets/SimulationWorker-kgekWV9K.js b/var/www/static/js/assets/SimulationWorker-kgekWV9K.js deleted file mode 100644 index 6836ef75..00000000 --- a/var/www/static/js/assets/SimulationWorker-kgekWV9K.js +++ /dev/null @@ -1 +0,0 @@ -var Jo=Object.defineProperty;var ta=(Q,X,st)=>X in Q?Jo(Q,X,{enumerable:!0,configurable:!0,writable:!0,value:st}):Q[X]=st;var T=(Q,X,st)=>ta(Q,typeof X!="symbol"?X+"":X,st);(function(){"use strict";function Q(e){const t=+this._x.call(null,e),n=+this._y.call(null,e);return X(this.cover(t,n),t,n,e)}function X(e,t,n,i){if(isNaN(t)||isNaN(n))return e;var r,o=e._root,a={data:i},l=e._x0,c=e._y0,s=e._x1,h=e._y1,g,d,p,x,y,_,w,b;if(!o)return e._root=a,e;for(;o.length;)if((y=t>=(g=(l+s)/2))?l=g:s=g,(_=n>=(d=(c+h)/2))?c=d:h=d,r=o,!(o=o[w=_<<1|y]))return r[w]=a,e;if(p=+e._x.call(null,o.data),x=+e._y.call(null,o.data),t===p&&n===x)return a.next=o,r?r[w]=a:e._root=a,e;do r=r?r[w]=new Array(4):e._root=new Array(4),(y=t>=(g=(l+s)/2))?l=g:s=g,(_=n>=(d=(c+h)/2))?c=d:h=d;while((w=_<<1|y)===(b=(x>=d)<<1|p>=g));return r[b]=o,r[w]=a,e}function st(e){var t,n,i=e.length,r,o,a=new Array(i),l=new Array(i),c=1/0,s=1/0,h=-1/0,g=-1/0;for(n=0;nh&&(h=r),og&&(g=o));if(c>h||s>g)return this;for(this.cover(c,s).cover(h,g),n=0;ne||e>=r||i>t||t>=o;)switch(s=(th||(l=x.y0)>g||(c=x.x1)=w)<<1|e>=_)&&(x=d[d.length-1],d[d.length-1]=d[d.length-1-y],d[d.length-1-y]=x)}else{var b=e-+this._x.call(null,p.data),S=t-+this._y.call(null,p.data),v=b*b+S*S;if(v=(d=(a+c)/2))?a=d:c=d,(y=g>=(p=(l+s)/2))?l=p:s=p,t=n,!(n=n[_=y<<1|x]))return this;if(!n.length)break;(t[_+1&3]||t[_+2&3]||t[_+3&3])&&(i=t,w=_)}for(;n.data!==e;)if(r=n,!(n=n.next))return this;return(o=n.next)&&delete n.next,r?(o?r.next=o:delete r.next,this):t?(o?t[_]=o:delete t[_],(n=t[0]||t[1]||t[2]||t[3])&&n===(t[3]||t[2]||t[1]||t[0])&&!n.length&&(i?i[w]=n:this._root=n),this):(this._root=o,this)}function En(e){for(var t=0,n=e.length;td.index){var P=p-I.x-I.vx,V=x-I.y-I.vy,H=P*P+V*V;Hp+k||Dx+k||Ns.r&&(s.r=s[h].r)}function c(){if(t){var s,h=t.length,g;for(n=new Array(h),s=0;s[t(C,D,a),C])),v;for(_=0,l=new Array(w);_{}};function Jt(){for(var e=0,t=arguments.length,n={},i;e=0&&(i=n.slice(r+1),n=n.slice(0,r)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:i}})}At.prototype=Jt.prototype={constructor:At,on:function(e,t){var n=this._,i=$n(e+"",n),r,o=-1,a=i.length;if(arguments.length<2){for(;++o0)for(var n=new Array(r),i=0,r,o;i=0&&e._call.call(void 0,t),e=e._next;--ot}function Ne(){J=(Dt=gt.now())+Mt,ot=ht=0;try{Kn()}finally{ot=0,Zn(),J=0}}function Yn(){var e=gt.now(),t=e-Dt;t>Ce&&(Mt-=t,Dt=e)}function Zn(){for(var e,t=Ct,n,i=1/0;t;)t._call?(i>t._time&&(i=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:Ct=n);dt=e,ee(i)}function ee(e){if(!ot){ht&&(ht=clearTimeout(ht));var t=e-J;t>24?(e<1/0&&(ht=setTimeout(Ne,e-gt.now()-Mt)),ft&&(ft=clearInterval(ft))):(ft||(Dt=gt.now(),ft=setInterval(Yn,Ce)),ot=1,De(Ne))}}const Qn=1664525,Jn=1013904223,Ee=4294967296;function ti(){let e=1;return()=>(e=(Qn*e+Jn)%Ee)/Ee}function ei(e){return e.x}function ni(e){return e.y}var ii=10,ri=Math.PI*(3-Math.sqrt(5));function si(e){var t,n=1,i=.001,r=1-Math.pow(i,1/300),o=0,a=.6,l=new Map,c=Ie(g),s=Jt("tick","end"),h=ti();e==null&&(e=[]);function g(){d(),s.call("tick",t),n1?(_==null?l.delete(y):l.set(y,x(_)),t):l.get(y)},find:function(y,_,w){var b=0,S=e.length,v,C,D,N,I;for(w==null?w=1/0:w*=w,b=0;b1?(s.on(y,_),t):s.on(y)}}}function oi(){var e,t,n,i,r=L(-30),o,a=1,l=1/0,c=.81;function s(p){var x,y=e.length,_=Zt(e,ei,ni).visitAfter(g);for(i=p,x=0;x=l)return;(p.data!==t||p.next)&&(w===0&&(w=Y(n),v+=w*w),b===0&&(b=Y(n),v+=b*b),vn}function a(l){for(let c=0,s=i.length;c{i=l,o()},a.x=function(l){return arguments.length?(e=l,a):e},a.y=function(l){return arguments.length?(t=l,a):t},a.strength=function(l){return arguments.length?(n=l,o(),a):n},a}var ne="http://www.w3.org/1999/xhtml",ze={svg:"http://www.w3.org/2000/svg",xhtml:ne,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Oe(e){var t=e+="",n=t.indexOf(":");return n>=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),ze.hasOwnProperty(t)?{space:ze[t],local:e}:e}function li(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===ne&&t.documentElement.namespaceURI===ne?t.createElement(e):t.createElementNS(n,e)}}function ui(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Be(e){var t=Oe(e);return(t.local?ui:li)(t)}function ci(){}function Pe(e){return e==null?ci:function(){return this.querySelector(e)}}function hi(e){typeof e!="function"&&(e=Pe(e));for(var t=this._groups,n=t.length,i=new Array(n),r=0;r=S&&(S=b+1);!(C=_[S])&&++S=0;)(a=i[r])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function Pi(e){e||(e=Li);function t(g,d){return g&&d?e(g.__data__,d.__data__):!g-!d}for(var n=this._groups,i=n.length,r=new Array(i),o=0;ot?1:e>=t?0:NaN}function ji(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Gi(){return Array.from(this)}function Ui(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?Ji:typeof t=="function"?er:tr)(e,t,n??"")):ir(this.node(),e)}function ir(e,t){return e.style.getPropertyValue(t)||Ge(e).getComputedStyle(e,null).getPropertyValue(t)}function rr(e){return function(){delete this[e]}}function sr(e,t){return function(){this[e]=t}}function or(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function ar(e,t){return arguments.length>1?this.each((t==null?rr:typeof t=="function"?or:sr)(e,t)):this.node()[e]}function Ue(e){return e.trim().split(/^|\s+/)}function ie(e){return e.classList||new He(e)}function He(e){this._node=e,this._names=Ue(e.getAttribute("class")||"")}He.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function Ve(e,t){for(var n=ie(e),i=-1,r=t.length;++i=0&&(n=t.slice(i+1),t=t.slice(0,i)),{type:t,name:n}})}function zr(e){return function(){var t=this.__on;if(t){for(var n=0,i=-1,r=t.length,o;n()=>e;function se(e,{sourceEvent:t,subject:n,target:i,identifier:r,active:o,x:a,y:l,dx:c,dy:s,dispatch:h}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:s,enumerable:!0,configurable:!0},_:{value:h}})}se.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function Xr(e){return!e.ctrlKey&&!e.button}function Kr(){return this.parentNode}function Yr(e,t){return t??{x:e.x,y:e.y}}function Zr(){return navigator.maxTouchPoints||"ontouchstart"in this}function Qr(){var e=Xr,t=Kr,n=Yr,i=Zr,r={},o=Jt("start","drag","end"),a=0,l,c,s,h,g=0;function d(v){v.on("mousedown.drag",p).filter(i).on("touchstart.drag",_).on("touchmove.drag",w,Wr).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(v,C){if(!(h||!e.call(this,v,C))){var D=S(this,t.call(this,v,C),v,C,"mouse");D&&(Nt(v.view).on("mousemove.drag",x,pt).on("mouseup.drag",y,pt),$r(v.view),re(v),s=!1,l=v.clientX,c=v.clientY,D("start",v))}}function x(v){if(at(v),!s){var C=v.clientX-l,D=v.clientY-c;s=C*C+D*D>g}r.mouse("drag",v)}function y(v){Nt(v.view).on("mousemove.drag mouseup.drag",null),qr(v.view,s),at(v),r.mouse("end",v)}function _(v,C){if(e.call(this,v,C)){var D=v.changedTouches,N=t.call(this,v,C),I=D.length,B,k;for(B=0;Bt.to)}getConnectingNodes(){return[...this.edgesIn].map(t=>t.from)}getEdgesOut(){return[...this.edgesOut]}getEdgesIn(){return[...this.edgesIn]}getStyle(){return this.style}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`node-${this.domID}`):null}toDict(t=!1){const n={id:this.id,data:this.data,style:this.style,weight:this.weight};return t||(n.x=this.x,n.y=this.y,n.vx=this.vx,n.vy=this.vy,n.fx=this.fx,n.fy=this.fy),this.hasChildren()&&(n.children=this.children.map(i=>i.toDict(t))),n}clone(){const t={...this.data},n={...this.style},i=new An(this.id,t,n);return i.x=this.x,i.y=this.y,i.vx=this.vx,i.vy=this.vy,i.fx=this.fx,i.fy=this.fy,i.weight=this.weight,i.frozen=this.frozen,i.visible=this.visible,i.expanded=this.expanded,i.isChild=this.isChild,i.childrenDepth=this.childrenDepth,i.isParent=this.isParent,i.parentNode=this.parentNode,i._circleRadius=this._circleRadius,i.children=this.children.map(r=>r.clone()),i}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}freeze(){this.frozen=!0,this.fx=this.x,this.fy=this.y}unfreeze(){this.frozen=!1,this.fx=void 0,this.fy=void 0}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}toggleExpand(t){t===void 0?this.expanded?this.collapse():this.expand():t?this.expand():this.collapse(),this.markDirty()}expand(){this.expanded=!0,this._original_object&&(this._original_object.expanded=!0)}collapse(){this.expanded=!1,this._original_object&&(this._original_object.expanded=!1)}degree(){return this.edgesOut.size+this.edgesIn.size}setCircleRadius(t){this._circleRadius=t}getCircleRadius(){return this._circleRadius}setCircleRadiusCollapsed(t){this._circleRadiusCollapsed=t}getCircleRadiusCollapsed(){return this._circleRadiusCollapsed}setChildren(t){this.children=t,this.hasChildren()?this.isParent=!0:this.isParent=!1}hasChildren(){return this.children.length>0}markAsChild(t,n){this.isChild=!0,this.childrenDepth=n,this.parentNode=t}markAsParent(){this.isParent=!0}setSubgraph(t){this._subgraph=t}getSubgraph(){return this._subgraph}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setDeepestNodeClone(t){this._deepest_node_clone=t}getDeepestNodeClone(){return this._deepest_node_clone}};class kt{constructor(t,n,i,r,o,a=null,l){T(this,"id");T(this,"from");T(this,"to");T(this,"directed");T(this,"data");T(this,"style");T(this,"visible");T(this,"isSynthetic");T(this,"syntheticTerminalNode");T(this,"_original_object");T(this,"_subgraphFromNode");T(this,"_subgraphToNode");T(this,"_dirty");T(this,"domID");this.id=t,this.domID=Xe(),this.from=n,this.to=i,this.directed=a,this.data=r??{},this.style=o??{},this.visible=!0,this._dirty=!0,this.isSynthetic=l!==void 0,this.syntheticTerminalNode=l,this.from.registerEdgeOut(this),this.to.registerEdgeIn(this)}get source(){return this.from}get target(){return this.to}getData(){return this.data}setData(t){this.data=t,this.markDirty()}updateData(t){this.data={...this.data,...t},this.markDirty()}getStyle(){return this.style}getEdgeStyle(){var t;return((t=this.style)==null?void 0:t.edge)??{}}getLabelStyle(){var t;return((t=this.style)==null?void 0:t.label)??{}}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`edge-${this.domID}`):null}setFrom(t){this.from=t}setTo(t){this.to=t}toDict(){return{id:this.id,from:this.from.id,to:this.to.id,data:this.data,style:this.style}}clone(){const t={...this.data},n={...this.style},i=new kt(this.id,this.from.clone(),this.to.clone(),t,n,this.directed);return i.visible=this.visible,i}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setSubgraphFromNode(t){this._subgraphFromNode=t}setSubgraphToNode(t){this._subgraphToNode=t}getSubgraphFromNode(){return this._subgraphFromNode}getSubgraphToNode(){return this._subgraphToNode}}const Jr=(e,t,n,i,r)=>new Promise((o,a)=>{const l=new Worker(self.location.href,{type:"module"});l.postMessage({source:"simulation-worker-wrapper",nodes:e,edges:t,options:n,canvasBCR:i}),l.onmessage=c=>{const{type:s,progress:h,nodes:g,edges:d,elapsedTime:p}=c.data;if(s==="tick"&&typeof h=="number"){r==null||r(h,p);return}s==="done"&&(o({nodes:g,edges:d}),l.terminate())},l.onerror=a});var Ft=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ts(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var yt={exports:{}};yt.exports;var Ye;function es(){return Ye||(Ye=1,(function(e,t){var n=200,i="__lodash_hash_undefined__",r=800,o=16,a=9007199254740991,l="[object Arguments]",c="[object Array]",s="[object AsyncFunction]",h="[object Boolean]",g="[object Date]",d="[object Error]",p="[object Function]",x="[object GeneratorFunction]",y="[object Map]",_="[object Number]",w="[object Null]",b="[object Object]",S="[object Proxy]",v="[object RegExp]",C="[object Set]",D="[object String]",N="[object Undefined]",I="[object WeakMap]",B="[object ArrayBuffer]",k="[object DataView]",P="[object Float32Array]",V="[object Float64Array]",H="[object Int8Array]",lt="[object Int16Array]",ue="[object Int32Array]",_t="[object Uint8Array]",Gt="[object Uint8ClampedArray]",ce="[object Uint16Array]",Ut="[object Uint32Array]",vt=/[\\^$.*+?()[\]{}|]/g,Os=/^\[object .+?Constructor\]$/,Bs=/^(?:0|[1-9]\d*)$/,R={};R[P]=R[V]=R[H]=R[lt]=R[ue]=R[_t]=R[Gt]=R[ce]=R[Ut]=!0,R[l]=R[c]=R[B]=R[h]=R[k]=R[g]=R[d]=R[p]=R[y]=R[_]=R[b]=R[v]=R[C]=R[D]=R[I]=!1;var en=typeof Ft=="object"&&Ft&&Ft.Object===Object&&Ft,Ps=typeof self=="object"&&self&&self.Object===Object&&self,wt=en||Ps||Function("return this")(),nn=t&&!t.nodeType&&t,xt=nn&&!0&&e&&!e.nodeType&&e,rn=xt&&xt.exports===nn,he=rn&&en.process,sn=(function(){try{var u=xt&&xt.require&&xt.require("util").types;return u||he&&he.binding&&he.binding("util")}catch{}})(),on=sn&&sn.isTypedArray;function Ls(u,f,m){switch(m.length){case 0:return u.call(f);case 1:return u.call(f,m[0]);case 2:return u.call(f,m[0],m[1]);case 3:return u.call(f,m[0],m[1],m[2])}return u.apply(f,m)}function js(u,f){for(var m=-1,A=Array(u);++m-1}function lo(u,f){var m=this.__data__,A=qt(m,u);return A<0?(++this.size,m.push([u,f])):m[A][1]=f,this}K.prototype.clear=ro,K.prototype.delete=so,K.prototype.get=oo,K.prototype.has=ao,K.prototype.set=lo;function ut(u){var f=-1,m=u==null?0:u.length;for(this.clear();++f1?m[M-1]:void 0,z=M>2?m[2]:void 0;for(F=u.length>3&&typeof F=="function"?(M--,F):void 0,z&&Po(m[0],m[1],z)&&(F=M<3?void 0:F,M=1),f=Object(f);++A-1&&u%1==0&&u0){if(++f>=r)return arguments[0]}else f=0;return u.apply(void 0,arguments)}}function $o(u){if(u!=null){try{return Vt.call(u)}catch{}try{return u+""}catch{}}return""}function Yt(u,f){return u===f||u!==u&&f!==f}var me=pn((function(){return arguments})())?pn:function(u){return St(u)&&Z.call(u,"callee")&&!Xs.call(u,"callee")},_e=Array.isArray;function ve(u){return u!=null&&wn(u.length)&&!we(u)}function qo(u){return St(u)&&ve(u)}var vn=Ys||Qo;function we(u){if(!rt(u))return!1;var f=Xt(u);return f==p||f==x||f==s||f==S}function wn(u){return typeof u=="number"&&u>-1&&u%1==0&&u<=a}function rt(u){var f=typeof u;return u!=null&&(f=="object"||f=="function")}function St(u){return u!=null&&typeof u=="object"}function Xo(u){if(!St(u)||Xt(u)!=b)return!1;var f=hn(u);if(f===null)return!0;var m=Z.call(f,"constructor")&&f.constructor;return typeof m=="function"&&m instanceof m&&Vt.call(m)==$s}var xn=on?Gs(on):To;function Ko(u){return Fo(u,bn(u))}function bn(u){return ve(u)?wo(u):Ao(u)}var Yo=Ro(function(u,f,m){yn(u,f,m)});function Zo(u){return function(){return u}}function Sn(u){return u}function Qo(){return!1}e.exports=Yo})(yt,yt.exports)),yt.exports}var ns=es(),Rt=ts(ns);function is(e){var t=0,n=e.children,i=n&&n.length;if(!i)t=1;else for(;--i>=0;)t+=n[i].value;e.value=t}function rs(){return this.eachAfter(is)}function ss(e,t){let n=-1;for(const i of this)e.call(t,i,++n,this);return this}function os(e,t){for(var n=this,i=[n],r,o,a=-1;n=i.pop();)if(e.call(t,n,++a,this),r=n.children)for(o=r.length-1;o>=0;--o)i.push(r[o]);return this}function as(e,t){for(var n=this,i=[n],r=[],o,a,l,c=-1;n=i.pop();)if(r.push(n),o=n.children)for(a=0,l=o.length;a=0;)n+=i[r].value;t.value=n})}function cs(e){return this.eachBefore(function(t){t.children&&t.children.sort(e)})}function hs(e){for(var t=this,n=fs(t,e),i=[t];t!==n;)t=t.parent,i.push(t);for(var r=i.length;e!==n;)i.splice(r,0,e),e=e.parent;return i}function fs(e,t){if(e===t)return e;var n=e.ancestors(),i=t.ancestors(),r=null;for(e=n.pop(),t=i.pop();e===t;)r=e,e=n.pop(),t=i.pop();return r}function ds(){for(var e=this,t=[e];e=e.parent;)t.push(e);return t}function gs(){return Array.from(this)}function ps(){var e=[];return this.eachBefore(function(t){t.children||e.push(t)}),e}function ys(){var e=this,t=[];return e.each(function(n){n!==e&&t.push({source:n.parent,target:n})}),t}function*ms(){var e=this,t,n=[e],i,r,o;do for(t=n.reverse(),n=[];e=t.pop();)if(yield e,i=e.children)for(r=0,o=i.length;r=0;--l)r.push(o=a[l]=new mt(a[l])),o.parent=i,o.depth=i.depth+1;return n.eachBefore(bs)}function _s(){return zt(this).eachBefore(xs)}function vs(e){return e.children}function ws(e){return Array.isArray(e)?e[1]:null}function xs(e){e.data.value!==void 0&&(e.value=e.data.value),e.data=e.data.data}function bs(e){var t=0;do e.height=t;while((e=e.parent)&&e.height<++t)}function mt(e){this.data=e,this.depth=this.height=0,this.parent=null}mt.prototype=zt.prototype={constructor:mt,count:rs,each:ss,eachAfter:as,eachBefore:os,find:ls,sum:us,sort:cs,path:hs,ancestors:ds,descendants:gs,leaves:ps,links:ys,copy:_s,[Symbol.iterator]:ms};function Ss(e,t){return e.parent===t.parent?1:2}function oe(e){var t=e.children;return t?t[0]:e.t}function ae(e){var t=e.children;return t?t[t.length-1]:e.t}function Ts(e,t,n){var i=n/(t.i-e.i);t.c-=i,t.s+=n,e.c+=i,t.z+=n,t.m+=n}function As(e){for(var t=0,n=0,i=e.children,r=i.length,o;--r>=0;)o=i[r],o.z+=t,o.m+=t,t+=o.s+(n+=o.c)}function Cs(e,t,n){return e.a.parent===t.parent?e.a:n}function Ot(e,t){this._=e,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=t}Ot.prototype=Object.create(mt.prototype);function Ds(e){for(var t=new Ot(e,0),n,i=[t],r,o,a,l;n=i.pop();)if(o=n._.children)for(n.children=new Array(l=o.length),a=l-1;a>=0;--a)i.push(r=n.children[a]=new Ot(o[a],a)),r.parent=n;return(t.parent=new Ot(null,0)).children=[t],t}function Ze(){var e=Ss,t=1,n=1,i=null;function r(s){var h=Ds(s);if(h.eachAfter(o),h.parent.m=-h.z,h.eachBefore(a),i)s.eachBefore(c);else{var g=s,d=s,p=s;s.eachBefore(function(b){b.xd.x&&(d=b),b.depth>p.depth&&(p=b)});var x=g===d?1:e(g,d)/2,y=x-g.x,_=t/(d.x+x+y),w=n/(p.depth||1);s.eachBefore(function(b){b.x=(b.x+y)*_,b.y=b.depth*w})}return s}function o(s){var h=s.children,g=s.parent.children,d=s.i?g[s.i-1]:null;if(h){As(s);var p=(h[0].z+h[h.length-1].z)/2;d?(s.z=d.z+e(s._,d._),s.m=s.z-p):s.z=p}else d&&(s.z=d.z+e(s._,d._));s.parent.A=l(s,d,s.parent.A||g[0])}function a(s){s._.x=s.z+s.parent.m,s.m+=s.parent.m}function l(s,h,g){if(h){for(var d=s,p=s,x=h,y=d.parent.children[0],_=d.m,w=p.m,b=x.m,S=y.m,v;x=ae(x),d=oe(d),x&&d;)y=oe(y),p=ae(p),p.a=s,v=x.z+b-d.z-_+e(x._,d._),v>0&&(Ts(Cs(x,s,g),s,v),_+=v,w+=v),b+=x.m,_+=d.m,S+=y.m,w+=p.m;x&&!ae(p)&&(p.t=x,p.m+=b-w),d&&!oe(y)&&(y.t=d,y.m+=_-S,g=s)}return g}function c(s){s.x*=t,s.y=s.depth*n}return r.separation=function(s){return arguments.length?(e=s,r):e},r.size=function(s){return arguments.length?(i=!1,t=+s[0],n=+s[1],r):i?null:[t,n]},r.nodeSize=function(s){return arguments.length?(i=!0,t=+s[0],n=+s[1],r):i?[t,n]:null},r}function Bt(e,t){const n={};for(const a of e)n[a.id]=[];for(const{source:a,target:l}of t)n[a.id]||(n[a.id]=[]),n[a.id].push(l.id);const i=new Set,r=new Set,o=a=>{if(!i.has(a)&&(i.add(a),r.add(a),n[a]))for(const l of n[a]){if(!i.has(l)&&o(l))return!0;if(r.has(l))return!0}return r.delete(a),!1};return e.some(a=>o(a.id))}function Qe(e,t){const n=new Set(t.map(i=>i.target.id));for(const i of e)if(!n.has(i.id))return i;return e[0]}function Ms(e,t){const n=new Map;for(const c of e)n.set(c.id,[]);for(const c of t)n.get(c.from.id)||console.log(c),n.get(c.from.id).push(c.to);const i=new Map,r=new Map;function o(c,s=new Set){if(r.has(c))return new Set(r.get(c));const h=new Set;for(const g of n.get(c.id)??[])if(!s.has(g)){s.add(g),h.add(g);const d=o(g,s);for(const p of d)h.add(p)}return r.set(c,h),i.set(c,h.size),h}for(const c of e)i.has(c)||o(c);let a=null,l=-1;for(const c of e){const s=i.get(c)??0;s>l&&(l=s,a=c)}return a??e[0]}function Is(e,t){const n=new Map,i=new Map;for(const s of e)n.set(s.id,[]),i.set(s.id,0);for(const s of t)s.directed!==!1&&(n.get(s.from.id).push(s.to),i.set(s.to.id,(i.get(s.to.id)||0)+1));const r=[],o=e.filter(s=>i.get(s.id)===0);for(;o.length;){const s=o.shift();r.push(s);for(const h of n.get(s.id))i.set(h.id,i.get(h.id)-1),i.get(h.id)===0&&o.push(h)}if(r.length!==e.length)return console.warn("Graph has a cycle! Min-max distance root undefined."),e[0];const a=new Map;for(let s=r.length-1;s>=0;s--){const h=r[s];let g=0;for(const d of n.get(h.id))g=Math.max(g,1+(a.get(d.id)||0));a.set(h.id,g)}let l=null,c=1/0;for(const s of e){const h=a.get(s.id);hi.get(s.id)===0);for(;o.length;){const s=o.shift();r.push(s);for(const h of n.get(s.id))i.set(h.id,i.get(h.id)-1),i.get(h.id)===0&&o.push(h)}if(r.length!==e.length)return console.warn("Graph has a cycle! Cannot minimize DAG height."),e[0];const a=new Map;for(let s=r.length-1;s>=0;s--){const h=r[s];let g=0;for(const d of n.get(h.id))g=Math.max(g,1+(a.get(d.id)??0));a.set(h.id,g)}let l=null,c=1/0;for(const s of e){const h=a.get(s.id);h{const i=n.from;n.setFrom(n.to),n.setTo(i)}),t}setSizes(){const t=this.graph.renderer.getCanvas();if(!t)throw new Error("Canvas element is not defined in the graph renderer.");this.canvasBCR=t.getBoundingClientRect()}setNodePositions(t,n){for(const i of t){const r=this.graph.getMutableNode(i.data.id);if(r)if(n.radial){const o=i.x??0,a=i.y??0;r.x=a*Math.cos(o-Math.PI/2),r.y=a*Math.sin(o-Math.PI/2),r.fx=r.x,r.fy=r.y}else n.horizontal?(r.x=i.y,r.fx=i.y,r.y=i.x,delete r.fy):(r.x=i.x,r.y=i.y,r.fy=i.y,delete r.fx)}}unsetNodePositions(){this.graph.getMutableNodes().forEach(t=>{delete t.fy,delete t.fx})}registerForces(){const t=this.options.strength??.1;if(this.options.radial){const n=ke(i=>(this.levels[i.id]??1)*100,0,0).strength(t);this.simulation.force("tree-radial",n)}else this.simulation.force("tree-y",Re(n=>{var i,r;return this.options.horizontal?((i=this.positionedNodesByID.get(n.id))==null?void 0:i.x)??0:((r=this.positionedNodesByID.get(n.id))==null?void 0:r.y)??0}).strength(t)),this.simulation.force("tree-x",Fe(n=>{var i,r;return this.options.horizontal?((i=this.positionedNodesByID.get(n.id))==null?void 0:i.y)??0:((r=this.positionedNodesByID.get(n.id))==null?void 0:r.x)??0}).strength(t));j.adjustOtherSimulationForces(this.simulationForces,this.options)}unregisterLayout(){this.unregisterForces(),this.unsetNodePositions()}unregisterForces(){this.simulation.force("tree-radial",null),this.simulation.force("tree-y",null),this.simulation.force("tree-x",null),j.resetOtherSimulationForces(this.simulationForces,this.originalForceStrength)}static registerForcesOnSimulation(t,n,i,r,o,a,l=this){const c=Rt({},le,o),s=c.strength??.1,h=a.width,g=a.height,d=[h/2,g/2];if(Bt(t,n))return;const{levels:p}=l.buildLevels(t,n,void 0,c.rootIdAlgorithmFinder),{nodeById:x}=l.buildTree(t,n,c,a);if(c.radial){const y=ke(_=>(p[_.id]??1)*100,d[0],d[1]).strength(s);i.force("tree-radial",y)}else i.force("tree-y",Re(y=>{var _,w;return c.horizontal?((_=x.get(y.id))==null?void 0:_.x)??0:((w=x.get(y.id))==null?void 0:w.y)??0}).strength(s)),i.force("tree-x",Fe(y=>{var _,w;return c.horizontal?((_=x.get(y.id))==null?void 0:_.y)??0:((w=x.get(y.id))==null?void 0:w.x)??0}).strength(s));l.adjustOtherSimulationForces(r,c)}static adjustOtherSimulationForces(t,n){n!=null&&n.radial?(t.link.strength(0),t.charge.strength(0),t.center.strength(0),t.gravity.strength(0)):(t.link.strength(0),t.charge.strength(0),t.gravity.strength(1e-5),t.center.strength(1e-5))}static resetOtherSimulationForces(t,n){t.link.strength(n.link),t.charge.strength(n.charge),t.center.strength(n.center),t.gravity.strength(n.gravity)}static simulationDone(t,n,i,r){const o=Rt({},le,r);for(const a of t)o.radial?(a.fx=a.x,a.fy=a.y):o.horizontal?(a.fx=a.x,delete a.fy):(a.fy=a.y,delete a.fx)}static buildTree(t,n,i,r){if(!t.length)return{root:null,nodes:[],nodeById:new Map};if(Bt(t,n))return console.warn("Cycle detected in graph. Tree layout will not be computed."),{root:null,nodes:[],nodeById:new Map};const o=new Map;for(const y of t){const _=y;_.children=[],o.set(y.id,_)}for(const y of n){const _=o.get(y.source.id),w=o.get(y.target.id);_&&w&&(_.children.push(w),w.parent=_)}const a=i.rootId||j.findRootId(t,n,i.rootIdAlgorithmFinder),l=o.get(a);if(!l)throw new Error(`Root node with id "${a}" not found.`);const c=i.radialGap,s=i.radial?2*Math.PI:r.width,h=i.radial?c:r.height,g=Ze();i.radial?g.size([s,h]):g.size([s,h]).separation((y,_)=>{var b,S;const w=((S=(b=y.parent)==null?void 0:b.children)==null?void 0:S.length)??1;return y.parent===_.parent?1.5/w:1.5});const d=zt(l),p=g(d),x=new Map;return p.descendants().forEach(y=>{x.set(y.data.id,y)}),{root:p,nodes:p.descendants(),nodeById:x}}static buildLevels(t,n,i,r){if(!t.length)return{levels:{},maxDepth:0,nodeCountPerLevel:{}};const o=i||j.findRootId(t,n,r),a={[o]:0},l={};for(const d of t)l[d.id]=[];for(const{source:d,target:p}of n)l[d.id].push(p.id);const c=[o];let s=0;for(;s{var b,S;const w=((S=(b=y.parent)==null?void 0:b.children)==null?void 0:S.length)??1;return y.parent===_.parent?1.5/w:1.5});const d=zt(l),p=g(d),x=new Map;return p.descendants().forEach(y=>{x.set(y.data.id,y)}),{root:p,nodes:p.descendants(),nodeById:x}}}function ks(e){var n;const t=(n=e.getData())==null?void 0:n.label;return typeof t=="string"?t:""}function Fs(e=0,t=0,n=.001,i=()=>!0){let r=[];function o(){if(!r.length)return;let a=0,l=0,c=0;r.forEach((s,h)=>{i(s,h,r)&&(s.x==null||s.y==null||(a+=s.x,l+=s.y,c++))}),c&&(a=(a/c-e)*n,l=(l/c-t)*n,r.forEach((s,h)=>{i(s,h,r)&&(s.x==null||s.y==null||(s.x-=a,s.y-=l))}))}return o.initialize=a=>{r=a},o.x=function(a){return arguments.length?(e=a,o):e},o.y=function(a){return arguments.length?(t=a,o):t},o.strength=function(a){return arguments.length?(n=a,o):n},o.filter=function(a){return arguments.length?(i=a,o):i},o}const tt={d3Alpha:1,d3AlphaMin:.001,d3AlphaDecay:.05,d3AlphaTarget:0,d3VelocityDecay:.45,d3LinkDistance:40,d3LinkStrength:null,d3ManyBodyStrength:-150,d3ManyBodyTheta:.9,d3CollideRadius:12,d3CollideStrength:1,d3CollideIterations:1,d3CenterStrength:1,d3GravityStrength:.01,enabled:!0,cooldownTime:2e3,useWorker:!0,warmupTicks:"auto",freezeNodesOnDrag:!0,layout:{type:"force"},callbacks:{onInit:()=>{},onStart:()=>{},onStop:()=>{},onTick:()=>{}}};class et{constructor(t,n={}){T(this,"simulation");T(this,"graph");T(this,"canvas");T(this,"graphInteraction");T(this,"layout");T(this,"canvasBCR");T(this,"animationFrameId",null);T(this,"startSimulationTime",0);T(this,"engineRunning",!1);T(this,"slowTickThresholdReached",!1);T(this,"lastTickTime",0);T(this,"avgTickDuration",0);T(this,"SLOW_TICK_THRESHOLD",50);T(this,"dragInProgress",!1);T(this,"dragSelection",[]);T(this,"totalTickCount",0);T(this,"options");T(this,"callbacks");T(this,"simulationForces");T(this,"scaledForces",{d3ManyBodyStrength:tt.d3ManyBodyStrength,d3CollideStrength:tt.d3CollideStrength});if(this.graph=t,this.options=Rt({},tt,n),this.callbacks=this.options.callbacks??{},this.canvas=this.graph.renderer.getCanvas(),!this.canvas)throw new Error("Canvas element is not defined in the graph renderer.");if(this.canvasBCR=this.canvas.getBoundingClientRect(),this.graphInteraction=this.graph.renderer.getGraphInteraction(),!this.graphInteraction)throw new Error("Graph interaction is not available.");const i=et.initSimulationForces(this.options,this.canvasBCR);this.simulation=i.simulation,this.simulationForces=i.simulationForces,this.scaledForces.d3ManyBodyStrength=this.options.d3ManyBodyStrength||tt.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=this.options.d3CollideStrength||tt.d3CollideStrength,this.options.layout.type==="tree"?this.layout=new j(this.graph,this.simulation,this.simulationForces,this.options.layout):this.options.layout.type==="egoTree"&&(this.layout=new Es(this.graph,this.simulation,this.simulationForces,this.options.layout)),this.callbacks.onInit&&this.callbacks.onInit(this)}static initSimulationForces(t,n){const i={link:Vn(),charge:oi(),center:Fs(),collide:Un(),gravity:ai()},r=si().force("link",i.link).force("charge",i.charge).force("center",i.center).force("collide",i.collide).force("gravity",i.gravity);return this.initSimulationForceCenter(i.center,t),this.initSimulationForceGravity(i.gravity,t,n),this.initSimulationForceLink(i.link,t),this.initSimulationForceCharge(i.charge,t),this.initSimulationForceCollide(i.collide,t),r.alphaMin(t.d3AlphaMin),r.alphaDecay(t.d3AlphaDecay),r.alphaTarget(0),r.velocityDecay(t.d3VelocityDecay),{simulation:r,simulationForces:i}}static initSimulationForceCenter(t,n){t.x(0).y(0).strength(.05).filter(i=>!i.isChild)}static initSimulationForceGravity(t,n,i){t.x(i.width/2).y(i.height/2).strength(r=>(r.degree()??0)===0?n.d3GravityStrength:0)}static initSimulationForceLink(t,n){t.distance(i=>{const r=ks(i);if(!r||r==="")return n.d3LinkDistance;const o=r.length*10;return Math.max(n.d3LinkDistance,o)}),n.d3LinkStrength&&t.strength(n.d3LinkStrength)}static initSimulationForceCharge(t,n){t.theta(n.d3ManyBodyTheta).strength(i=>{const r=i,o=n.d3ManyBodyStrength,a=r.getCircleRadius(),l=10+Math.sqrt(a-10);let c=r.weight??1;return c*=r.isParent?10:1,o*(l*l)/100*c})}static initSimulationForceCollide(t,n){t.radius(i=>{const r=i;return r.expanded?1.2*r.getCircleRadius()+20:r.getCircleRadius()?1.2*r.getCircleRadius():n.d3CollideRadius}).strength(n.d3CollideStrength)}static initSimulationForceClusterRadialConstraint(t,n){t.strength(n.d3CollideStrength)}update(){this.layout&&this.layout.update();const t=this.graph.getMutableNodes().filter(i=>i.visible);this.simulation.nodes(t);const n=this.simulation.force("link");n&&n.id(i=>i.id).links(this.getActiveEdges()),this.restart()}getActiveEdges(){const t=this.graph.getMutableEdges().filter(i=>{if(!i.visible)return!1;const r=i.source,o=i.target;return!(r.isChild||o.isChild)}),n=this.getClusterLinks();return[...t,...n]}getClusterLinks(){return this.graph.getMutableEdges().filter(n=>n.visible)}scaleSimulationOptions(){const t=et.scaleSimulationOptions(this.options,this.canvasBCR,this.graph.getNodeCount());this.scaledForces.d3ManyBodyStrength=t.d3ManyBodyStrength??tt.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=t.d3CollideStrength??tt.d3CollideStrength}static scaleSimulationOptions(t,n,i){const r=i/(n.width*n.height),o=Math.min(2,75e-6/r);return{d3ManyBodyStrength:t.d3ManyBodyStrength*o,d3CollideStrength:t.d3ManyBodyStrength*o}}applyScalledSimulationOptions(){et.initSimulationForceCharge(this.simulationForces.charge,this.options),et.initSimulationForceCollide(this.simulationForces.collide,this.options)}enable(){this.avgTickDuration=0,this.options.enabled=!0,this.start(!1)}disable(){this.options.enabled=!1,this.stop()}pause(){this.engineRunning=!1,this.slowTickThresholdReached=!1}restart(){this.startSimulationTime=new Date().getTime(),this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1}async start(t=!0){if(t&&await this.runSimulationWorkerRouter(),!this.options.enabled){this.engineRunning=!1;return}this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1,this.callbacks.onStart&&this.callbacks.onStart(this),this.animationFrameId===null&&this.startAnimationLoop()}stop(){this.engineRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.simulation.stop(),this.callbacks.onStop&&this.callbacks.onStop(this)}startAnimationLoop(){const t=()=>{this.animationFrameId=requestAnimationFrame(t),this.simulationTick()};this.engineRunning=!0,this.simulation.alpha(.01).restart(),this.animationFrameId=requestAnimationFrame(t)}simulationTick(){this.engineRunning&&(!this.dragInProgress&&(new Date().getTime()-this.startSimulationTime>this.options.cooldownTime||this.options.d3AlphaMin>0&&this.simulation.alpha()this.SLOW_TICK_THRESHOLD&&(this.slowTickThresholdReached=!0,this.disable(),(i=this.graph.UIManager.graphControls)==null||i.updatePhysicSimulationIndicator(!1),this.graph.UIManager.showNotification({level:"warning",title:"Physics engine running slow",message:"The physic has been disabled."}))}async waitForSimulationStop(){if(this.engineRunning)return new Promise(t=>{const n=this.callbacks.onStop;this.callbacks.onStop=i=>{n==null||n(i),this.callbacks.onStop=n,t()}})}isEnabled(){return this.options.enabled}async computeGraph(t={}){var h;const{runSimulation:n}=await Promise.resolve().then(function(){return zs}),i=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!i)return;const r=this.graph.getMutableNodes(),o=this.graph.getNodes().map(g=>(g.fx=void 0,g.fy=void 0,g)),a=this.graph.getEdges(),{callbacks:l,...c}=this.options;Object.assign(c,t);const{nodes:s}=n(o,a,c,i);s.forEach((g,d)=>{r[d].x=g.x,r[d].y=g.y,g.fx?r[d].fx=g.fx:r[d].fx=void 0,g.fy?r[d].fy=g.fy:r[d].fy=void 0}),this.graph.updateData(r,void 0,!1)}async runSimulationWorkerRouter(t={}){this.options.useWorker?await this.runSimulationWorker(t):(await this.computeGraph(t),this.graph.updateLayoutProgress(100,0,"done"))}async runSimulationWorker(t={}){var h;const n=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!n)return;const i=this.graph.getMutableNodes(),r=this.graph.getNodes().map(g=>(g.fx=void 0,g.fy=void 0,g)),o=this.graph.getEdges(),a=(g,d)=>{this.graph.updateLayoutProgress(g,d,"simulation")},{callbacks:l,...c}=this.options;Object.assign(c,t);const{nodes:s}=await Jr(r,o,c,n,a);this.graph.updateLayoutProgress(100,0,"rendering"),s.forEach((g,d)=>{i[d].x=g.x,i[d].y=g.y,g.fx?i[d].fx=g.fx:i[d].fx=void 0,g.fy?i[d].fy=g.fy:i[d].fy=void 0}),this.graph.updateData(i,void 0,!1),this.graph.updateLayoutProgress(100,0,"done")}reheat(t=.7){this.restart(),this.simulation.alpha(t).restart()}createDragBehavior(){return Qr().on("start.draggedelement",(t,n)=>{this.graphInteraction.hasActiveMultiselection()?this.dragSelection=this.graphInteraction.getSelectedNodes().map(i=>{const{node:r}=i;return r.freeze(),{node:r,dx:r.x-n.x,dy:r.y-n.y}}):(this.dragSelection=[],n.freeze())}).on("drag.draggedelement",(t,n)=>{if(!this.dragInProgress&&this.isEnabled()&&(this.dragInProgress=!0,this.restart(),this.simulation.alphaTarget(.3).restart()),this.graphInteraction.hasActiveMultiselection()?this.dragSelection.forEach(({node:i,dx:r,dy:o})=>{i.fx=t.x+r,i.fy=t.y+o,i.x=t.x+r,i.y=t.y+o}):(n.fx=t.x,n.fy=t.y,n.x=t.x,n.y=t.y),this.graphInteraction.dragging(t.sourceEvent,t.subject),!this.engineRunning||!this.isEnabled()){const i=this.graphInteraction.hasActiveMultiselection()?this.dragSelection.map(r=>r.node):[n];this.graph.nextTickFor(i)}}).on("end.draggedelement",(t,n)=>{!t.active&&this.dragInProgress&&(this.dragInProgress=!1,this.restart(),this.simulation.alphaTarget(this.options.d3AlphaTarget).restart()),this.options.freezeNodesOnDrag||(this.graphInteraction.hasActiveMultiselection()?(this.dragSelection.forEach(({node:i})=>i.unfreeze()),this.dragSelection=[]):n.unfreeze()),this.graphInteraction.dragended(t.sourceEvent,t.subject)})}isDragging(){return this.dragInProgress}getForceSimulation(){return this.simulationForces}getSimulation(){return this.simulation}async changeLayout(t,n={}){var i;this.layout&&((i=this.layout)==null||i.unregisterLayout(),this.layout=void 0),n=n??{},n.layout=n.layout??{},n.layout.type=t,t==="force"?this.applyScalledSimulationOptions():t==="tree"&&(this.layout=new j(this.graph,this.simulation,this.simulationForces,n.layout)),this.options.layout.type=t,this.update(),this.pause(),await this.runSimulationWorkerRouter(n),this.restart(),await this.waitForSimulationStop(),this.graph.renderer.fitAndCenter()}}const Je=1e4,Pt=2e4,Lt=.15*Pt;self.onmessage=e=>{var y,_,w,b;if(e.data.source!=="simulation-worker-wrapper")return;const{nodes:t,edges:n,options:i,canvasBCR:r}=e.data,o=t.map(S=>{const v=new Ke(S.id,S.data,S.style);return v.setCircleRadius(S._circleRadius??10),v}),a=new Map(o.map(S=>[S.id,S]));(y=i.layout)==null||y.type;const{simulation:l,simulationForces:c}=et.initSimulationForces(i,r),s=[];for(const S of n){const v=a.get(S.from.id),C=a.get(S.to.id);if(v&&C){const D=S.style??{};s.push(new kt(S.id,v,C,S.data,D,S.directed))}}l.nodes(o);const h=l.force("link");h&&h.id(S=>S.id).links(s),(((_=i.layout)==null?void 0:_.type)==="tree"||((w=i.layout)==null?void 0:w.type)==="egoTree")&&j.registerForcesOnSimulation(o,s,l,c,i.layout,r,j);let g=i.warmupTicks||Pt;g=g==="auto"?Pt:g,g=g-Lt;let d=.3;l.alphaTarget(d);const p=new Date().getTime();let x;for(let S=0;SJe||new Date().getTime()-p>i.cooldownTime||jt(i,l,d)&&new Date().getTime()-p>i.cooldownTime*.15);++S)S%5===0&&(x=tn(S,new Date().getTime()-p,i),postMessage({type:"tick",progress:x,elapsedTime:new Date().getTime()-p})),l.tick();d=0,l.alphaTarget(d),l.alpha(1);for(let S=0;Si.cooldownTime*.15);++S)l.tick(),S%5===0&&(x=tn(g+S,new Date().getTime()-p,i),postMessage({type:"tick",progress:x,elapsedTime:new Date().getTime()-p}));postMessage({type:"tick",progress:1,elapsedTime:new Date().getTime()-p}),((b=i.layout)==null?void 0:b.type)==="tree"&&j.simulationDone(o,s,l,i.layout),postMessage({type:"done",nodes:o.map(S=>S.toDict()),edges:s.map(S=>S.toDict())})};function Rs(e,t,n,i){var p,x,y,_;const r=e.map(w=>{const b=new Ke(w.id,w.getData(),w.getStyle());return b.weight=w.weight||1,b.setCircleRadius(w.getCircleRadius()),b}),o=new Map(r.map(w=>[w.id,w]));(p=n.layout)==null||p.type;const{simulation:a,simulationForces:l}=et.initSimulationForces(n,i),c=[];for(const w of t){const b=o.get(w.from.id),S=o.get(w.to.id);if(b&&S){const v=w.getStyle()??{};c.push(new kt(w.id,b,S,w.getData(),v,w.directed))}}a.nodes(r);const s=a.force("link");s&&s.id(w=>w.id).links(c),(((x=n.layout)==null?void 0:x.type)==="tree"||((y=n.layout)==null?void 0:y.type)==="egoTree")&&j.registerForcesOnSimulation(r,c,a,l,n.layout,i,j);let h;n.warmupTicks==="auto"||n.warmupTicks==null?h=Pt:h=n.warmupTicks,h=h-Lt;let g=.3;a.alphaTarget(g);const d=new Date().getTime();for(let w=0;wJe||new Date().getTime()-d>n.cooldownTime||jt(n,a,g)&&new Date().getTime()-d>n.cooldownTime*.15);++w)a.tick();g=0,a.alphaTarget(g),a.alpha(1);for(let w=0;wn.cooldownTime*.15);++w)a.tick();return((_=n.layout)==null?void 0:_.type)==="tree"&&j.simulationDone(r,c,a,n.layout),{nodes:r,edges:c}}function tn(e,t,n){return t/n.cooldownTime}function jt(e,t,n){return e.d3AlphaMin>0&&t.alpha()-nW in bt?Qd(bt,W,{enumerable:!0,configurable:!0,writable:!0,value:Et}):bt[W]=Et;var f=(bt,W,Et)=>Jd(bt,typeof W!="symbol"?W+"":W,Et);function W(i,...t){if(typeof i=="string")return i;if(typeof i=="function"){const e=i(...t);return typeof e=="string"?e:void 0}}function Et(i,...t){if(typeof i=="boolean")return i;if(typeof i=="function"){const e=i(...t);return typeof e=="boolean"?e:void 0}}function xe(i,...t){if(typeof i=="number")return i;if(typeof i=="function"){const e=i(...t);return typeof e=="number"?e:void 0}}function ui(i,...t){if(Array.isArray(i))return i;if(typeof i=="function"){const e=i(...t);return Array.isArray(e)?e:[]}return[]}function wt(i,...t){if(i instanceof HTMLElement)return i;if(typeof i=="string"){const e=document.createElement("template"),n=i.trim();if(e.innerHTML=n,e.content.firstElementChild)return e.content.firstElementChild;const r=document.createElement("span");return r.textContent=n,r}else if(typeof i=="function"){const e=i(...t);if(typeof e=="string"){const n=document.createElement("template");if(n.innerHTML=e,n.content.firstElementChild)return n.content.firstElementChild;const r=document.createElement("span");return r.textContent=e,r}else return e}}function di(i){const t=document.createElement("i");t.className=i,document.body.appendChild(t);let r=getComputedStyle(t).getPropertyValue("--fa").replace(/["']/g,"");const s=parseInt(r.slice(1),16);return r=String.fromCharCode(s),document.body.removeChild(t),r}function ht(i){i.variant=i.variant??"primary";const{variant:t,size:e,onClick:n,onClickArgs:r,iconUnicode:s,iconClass:o,svgIcon:a,imagePath:c,text:l,...h}=i,u=document.createElement("button");u.classList.add("pivotick-button"),u.classList.add(`pivotick-button-${t}`),e&&u.classList.add(`pivotick-button-${e}`);for(const[m,v]of Object.entries(h))m==="class"?Array.isArray(v)?u.classList.add(...v):u.classList.add(String(v)):m in u?u[m]=v:u.setAttribute(m,String(v));let d;s&&(d=X({iconUnicode:s})),o&&(d=X({iconClass:o})),a&&(d=X({svgIcon:a})),c&&(d=X({imagePath:c})),d&&u.append(d);const p=document.createElement("text");if(l&&(d&&(d.style.marginRight="0.1em"),p.textContent=l),u.append(p),typeof n=="function"){const m=r??[];u.addEventListener("click",v=>{n(v,...m)})}return u}const ls="outline-primary";function cs(i,t={},e=[]){const n=document.createElementNS("http://www.w3.org/2000/svg",i);for(const[r,s]of Object.entries(t))Array.isArray(s)?n.setAttribute(r,s.join(" ")):n.setAttribute(r,s.toString());for(const r of e)typeof r=="string"?n.appendChild(document.createTextNode(r)):n.appendChild(r);return n}function I(i,t={},e=[]){const n=document.createElement(i);for(const[r,s]of Object.entries(t))Array.isArray(s)?n.setAttribute(r,s.join(" ")):n.setAttribute(r,s.toString());for(const r of e)typeof r=="string"?n.appendChild(document.createTextNode(r)):n.appendChild(r);return n}function st(i){const t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstElementChild}function Ce(i,t){const e=I("dl",{class:"pvt-property-list"});for(const n of i){const r=wt(n.name,t)||"",s=wt(n.value,t)||"",o=I("dl",{class:"pvt-property-row"},[I("dt",{class:"pvt-property-name"},[r]),I("dd",{class:"pvt-property-value"},[s])]);e.append(o)}return e}function _e(i,t,e){const n=I("div",{class:"pvt-action-list"}),r=Array.isArray(e)?e[0]:e;return t.forEach(s=>{if(s.visible=s.visible??!0,Et(s.visible,r)??!0){const a=hs(i,s,e);n.appendChild(a)}}),n}function Me(i,t,e){const n=I("div",{class:"pvt-action-list"}),r=Array.isArray(e)?e[0]:e;return t.forEach(s=>{if(s.visible=s.visible??!0,Et(s.visible,r)??!0){const a=us(i,s,e);n.appendChild(a)}}),n}function hs(i,t,e){t.variant=t.variant??ls;const{onclick:n,...r}=t,s=I("span",{class:["pvt-action-item",`pvt-action-item-${t.variant}`],style:`${t.flushRight?"margin-left: auto;":""}`},[ht({size:"sm",...r})]);return typeof n=="function"&&s.addEventListener("click",o=>{n.call(i,o,e)}),s}function us(i,t,e){const n=I("div",{class:["pvt-action-item",`pvt-action-item-${t.variant}`]},[X({fixedWidth:!0,...t}),I("span",{class:"pvt-action-text",title:t.title??""},[t.text??""])]);return typeof t.onclick=="function"&&n.addEventListener("click",r=>{t.onclick.call(i,r,e)}),n}function cn(i=8,t="id-"){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",n=e+"0123456789-_";let r=e.charAt(Math.floor(Math.random()*e.length));for(let s=1;s{var b;const m=new AbortController,{signal:v}=m;r=!0,t.style.transition="none",s=p.clientX,o=p.clientY,a=i.offsetLeft,c=i.offsetTop,l=i.getBoundingClientRect(),h=e.getBoundingClientRect(),(b=n.onDragStart)==null||b.call(n,p,i),document.addEventListener("mousemove",u,{signal:v}),document.addEventListener("mouseup",y=>{m.abort(),d(y)},{signal:v})});function u(p){var x;if(!r||!h||!l)return;const m=p.clientX-s,v=p.clientY-o;let b=a+m,y=c+v;const _=l.width,E=l.height;b=Math.max(h.left,Math.min(b,h.right-_)),y=Math.max(h.top,Math.min(y,h.bottom-E)),i.style.left=b+"px",i.style.top=y+"px",(x=n.onDrag)==null||x.call(n,p,i)}function d(p){var m;r=!1,i.style.transition="",(m=n.onDragStop)==null||m.call(n,p,i)}}let ut=class as{constructor(t,e,n,r=cn(),s=[]){f(this,"id");f(this,"data");f(this,"children");f(this,"style");f(this,"edgesOut");f(this,"edgesIn");f(this,"defaultCircleRadius",10);f(this,"x");f(this,"y");f(this,"vx");f(this,"vy");f(this,"fx");f(this,"fy");f(this,"weight");f(this,"frozen");f(this,"visible");f(this,"expanded");f(this,"isChild");f(this,"childrenDepth");f(this,"isParent");f(this,"parentNode");f(this,"_original_object");f(this,"_deepest_node_clone");f(this,"_subgraph");f(this,"_circleRadius",this.defaultCircleRadius);f(this,"_circleRadiusCollapsed",this.defaultCircleRadius);f(this,"_dirty");f(this,"domID");this.id=t,this.domID=r,this.data=e??{},this.style=n??{},this.children=[],this.isParent=!1,this.setChildren(s),this._dirty=!0,this.frozen=!1,this.visible=!0,this.expanded=!1,this.isChild=!1,this.childrenDepth=0,this.edgesOut=new Set,this.edgesIn=new Set}getData(){return this.data}setData(t){this.data=t,this.markDirty()}updateData(t){this.data={...this.data,...t},this.markDirty()}registerEdgeOut(t){this.edgesOut.add(t)}registerEdgeIn(t){this.edgesIn.add(t)}emptyEdges(){this.edgesOut.clear(),this.edgesIn.clear()}getConnectedNodes(){return[...this.edgesOut].map(t=>t.to)}getConnectingNodes(){return[...this.edgesIn].map(t=>t.from)}getEdgesOut(){return[...this.edgesOut]}getEdgesIn(){return[...this.edgesIn]}getStyle(){return this.style}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`node-${this.domID}`):null}toDict(t=!1){const e={id:this.id,data:this.data,style:this.style,weight:this.weight};return t||(e.x=this.x,e.y=this.y,e.vx=this.vx,e.vy=this.vy,e.fx=this.fx,e.fy=this.fy),this.hasChildren()&&(e.children=this.children.map(n=>n.toDict(t))),e}clone(){const t={...this.data},e={...this.style},n=new as(this.id,t,e);return n.x=this.x,n.y=this.y,n.vx=this.vx,n.vy=this.vy,n.fx=this.fx,n.fy=this.fy,n.weight=this.weight,n.frozen=this.frozen,n.visible=this.visible,n.expanded=this.expanded,n.isChild=this.isChild,n.childrenDepth=this.childrenDepth,n.isParent=this.isParent,n.parentNode=this.parentNode,n._circleRadius=this._circleRadius,n.children=this.children.map(r=>r.clone()),n}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}freeze(){this.frozen=!0,this.fx=this.x,this.fy=this.y}unfreeze(){this.frozen=!1,this.fx=void 0,this.fy=void 0}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}toggleExpand(t){t===void 0?this.expanded?this.collapse():this.expand():t?this.expand():this.collapse(),this.markDirty()}expand(){this.expanded=!0,this._original_object&&(this._original_object.expanded=!0)}collapse(){this.expanded=!1,this._original_object&&(this._original_object.expanded=!1)}degree(){return this.edgesOut.size+this.edgesIn.size}setCircleRadius(t){this._circleRadius=t}getCircleRadius(){return this._circleRadius}setCircleRadiusCollapsed(t){this._circleRadiusCollapsed=t}getCircleRadiusCollapsed(){return this._circleRadiusCollapsed}setChildren(t){this.children=t,this.hasChildren()?this.isParent=!0:this.isParent=!1}hasChildren(){return this.children.length>0}markAsChild(t,e){this.isChild=!0,this.childrenDepth=e,this.parentNode=t}markAsParent(){this.isParent=!0}setSubgraph(t){this._subgraph=t}getSubgraph(){return this._subgraph}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setDeepestNodeClone(t){this._deepest_node_clone=t}getDeepestNodeClone(){return this._deepest_node_clone}};class dt{constructor(t,e,n,r,s,o=null,a){f(this,"id");f(this,"from");f(this,"to");f(this,"directed");f(this,"data");f(this,"style");f(this,"visible");f(this,"isSynthetic");f(this,"syntheticTerminalNode");f(this,"_original_object");f(this,"_subgraphFromNode");f(this,"_subgraphToNode");f(this,"_dirty");f(this,"domID");this.id=t,this.domID=cn(),this.from=e,this.to=n,this.directed=o,this.data=r??{},this.style=s??{},this.visible=!0,this._dirty=!0,this.isSynthetic=a!==void 0,this.syntheticTerminalNode=a,this.from.registerEdgeOut(this),this.to.registerEdgeIn(this)}get source(){return this.from}get target(){return this.to}getData(){return this.data}setData(t){this.data=t,this.markDirty()}updateData(t){this.data={...this.data,...t},this.markDirty()}getStyle(){return this.style}getEdgeStyle(){var t;return((t=this.style)==null?void 0:t.edge)??{}}getLabelStyle(){var t;return((t=this.style)==null?void 0:t.label)??{}}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`edge-${this.domID}`):null}setFrom(t){this.from=t}setTo(t){this.to=t}toDict(){return{id:this.id,from:this.from.id,to:this.to.id,data:this.data,style:this.style}}clone(){const t={...this.data},e={...this.style},n=new dt(this.id,this.from.clone(),this.to.clone(),t,e,this.directed);return n.visible=this.visible,n}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setSubgraphFromNode(t){this._subgraphFromNode=t}setSubgraphToNode(t){this._subgraphToNode=t}getSubgraphFromNode(){return this._subgraphFromNode}getSubgraphToNode(){return this._subgraphToNode}}var hn="http://www.w3.org/1999/xhtml";const pi={svg:"http://www.w3.org/2000/svg",xhtml:hn,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Se(i){var t=i+="",e=t.indexOf(":");return e>=0&&(t=i.slice(0,e))!=="xmlns"&&(i=i.slice(e+1)),pi.hasOwnProperty(t)?{space:pi[t],local:i}:i}function ps(i){return function(){var t=this.ownerDocument,e=this.namespaceURI;return e===hn&&t.documentElement.namespaceURI===hn?t.createElement(i):t.createElementNS(e,i)}}function fs(i){return function(){return this.ownerDocument.createElementNS(i.space,i.local)}}function fi(i){var t=Se(i);return(t.local?fs:ps)(t)}function gs(){}function un(i){return i==null?gs:function(){return this.querySelector(i)}}function ms(i){typeof i!="function"&&(i=un(i));for(var t=this._groups,e=t.length,n=new Array(e),r=0;r=E&&(E=_+1);!(N=b[E])&&++E=0;)(o=n[r])&&(s&&o.compareDocumentPosition(s)^4&&s.parentNode.insertBefore(o,s),s=o);return this}function Gs(i){i||(i=$s);function t(u,d){return u&&d?i(u.__data__,d.__data__):!u-!d}for(var e=this._groups,n=e.length,r=new Array(n),s=0;st?1:i>=t?0:NaN}function qs(){var i=arguments[0];return arguments[0]=this,i.apply(null,arguments),this}function js(){return Array.from(this)}function Us(){for(var i=this._groups,t=0,e=i.length;t1?this.each((t==null?no:typeof t=="function"?ro:io)(i,t,e??"")):jt(this.node(),i)}function jt(i,t){return i.style.getPropertyValue(t)||bi(i).getComputedStyle(i,null).getPropertyValue(t)}function oo(i){return function(){delete this[i]}}function ao(i,t){return function(){this[i]=t}}function lo(i,t){return function(){var e=t.apply(this,arguments);e==null?delete this[i]:this[i]=e}}function co(i,t){return arguments.length>1?this.each((t==null?oo:typeof t=="function"?lo:ao)(i,t)):this.node()[i]}function wi(i){return i.trim().split(/^|\s+/)}function dn(i){return i.classList||new xi(i)}function xi(i){this._node=i,this._names=wi(i.getAttribute("class")||"")}xi.prototype={add:function(i){var t=this._names.indexOf(i);t<0&&(this._names.push(i),this._node.setAttribute("class",this._names.join(" ")))},remove:function(i){var t=this._names.indexOf(i);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(i){return this._names.indexOf(i)>=0}};function Ci(i,t){for(var e=dn(i),n=-1,r=t.length;++n=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}})}function Bo(i){return function(){var t=this.__on;if(t){for(var e=0,n=-1,r=t.length,s;e{}};function ee(){for(var i=0,t=arguments.length,e={},n;i=0&&(n=e.slice(r+1),e=e.slice(0,r)),e&&!t.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:n}})}ke.prototype=ee.prototype={constructor:ke,on:function(i,t){var e=this._,n=Xo(i+"",e),r,s=-1,o=n.length;if(arguments.length<2){for(;++s0)for(var e=new Array(r),n=0,r,s;n=0&&i._call.call(void 0,t),i=i._next;--Vt}function Ai(){zt=(Ae=se.now())+Te,Vt=ne=0;try{Ko()}finally{Vt=0,Jo(),zt=0}}function Qo(){var i=se.now(),t=i-Ae;t>ki&&(Te-=t,Ae=i)}function Jo(){for(var i,t=Ne,e,n=1/0;t;)t._call?(n>t._time&&(n=t._time),i=t,t=t._next):(e=t._next,t._next=null,t=i?i._next=e:Ne=e);re=i,gn(n)}function gn(i){if(!Vt){ne&&(ne=clearTimeout(ne));var t=i-zt;t>24?(i<1/0&&(ne=setTimeout(Ai,i-se.now()-Te)),ie&&(ie=clearInterval(ie))):(ie||(Ae=se.now(),ie=setInterval(Qo,ki)),Vt=1,Ni(Ai))}}function Ti(i,t,e){var n=new Ie;return t=t==null?0:+t,n.restart(r=>{n.stop(),i(r+t)},t,e),n}var ta=ee("start","end","cancel","interrupt"),ea=[],Ii=0,Li=1,mn=2,Le=3,Di=4,vn=5,De=6;function Pe(i,t,e,n,r,s){var o=i.__transition;if(!o)i.__transition={};else if(e in o)return;na(i,e,{name:t,index:n,group:r,on:ta,tween:ea,time:s.time,delay:s.delay,duration:s.duration,ease:s.ease,timer:null,state:Ii})}function yn(i,t){var e=xt(i,t);if(e.state>Ii)throw new Error("too late; already scheduled");return e}function Mt(i,t){var e=xt(i,t);if(e.state>Le)throw new Error("too late; already running");return e}function xt(i,t){var e=i.__transition;if(!e||!(e=e[t]))throw new Error("transition not found");return e}function na(i,t,e){var n=i.__transition,r;n[t]=e,e.timer=fn(s,0,e.time);function s(l){e.state=Li,e.timer.restart(o,e.delay,e.time),e.delay<=l&&o(l-e.delay)}function o(l){var h,u,d,p;if(e.state!==Li)return c();for(h in n)if(p=n[h],p.name===e.name){if(p.state===Le)return Ti(o);p.state===Di?(p.state=De,p.timer.stop(),p.on.call("interrupt",i,i.__data__,p.index,p.group),delete n[h]):+hmn&&n.state>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):e===8?Oe(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):e===4?Oe(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=sa.exec(i))?new pt(t[1],t[2],t[3],1):(t=oa.exec(i))?new pt(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=aa.exec(i))?Oe(t[1],t[2],t[3],t[4]):(t=la.exec(i))?Oe(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=ca.exec(i))?Gi(t[1],t[2]/100,t[3]/100,1):(t=ha.exec(i))?Gi(t[1],t[2]/100,t[3]/100,t[4]):Fi.hasOwnProperty(i)?Bi(Fi[i]):i==="transparent"?new pt(NaN,NaN,NaN,0):null}function Bi(i){return new pt(i>>16&255,i>>8&255,i&255,1)}function Oe(i,t,e,n){return n<=0&&(i=t=e=NaN),new pt(i,t,e,n)}function pa(i){return i instanceof oe||(i=ce(i)),i?(i=i.rgb(),new pt(i.r,i.g,i.b,i.opacity)):new pt}function wn(i,t,e,n){return arguments.length===1?pa(i):new pt(i,t,e,n??1)}function pt(i,t,e,n){this.r=+i,this.g=+t,this.b=+e,this.opacity=+n}bn(pt,wn,Pi(oe,{brighter(i){return i=i==null?ze:Math.pow(ze,i),new pt(this.r*i,this.g*i,this.b*i,this.opacity)},darker(i){return i=i==null?ae:Math.pow(ae,i),new pt(this.r*i,this.g*i,this.b*i,this.opacity)},rgb(){return this},clamp(){return new pt(Ot(this.r),Ot(this.g),Ot(this.b),Be(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ri,formatHex:Ri,formatHex8:fa,formatRgb:Hi,toString:Hi}));function Ri(){return`#${Bt(this.r)}${Bt(this.g)}${Bt(this.b)}`}function fa(){return`#${Bt(this.r)}${Bt(this.g)}${Bt(this.b)}${Bt((isNaN(this.opacity)?1:this.opacity)*255)}`}function Hi(){const i=Be(this.opacity);return`${i===1?"rgb(":"rgba("}${Ot(this.r)}, ${Ot(this.g)}, ${Ot(this.b)}${i===1?")":`, ${i})`}`}function Be(i){return isNaN(i)?1:Math.max(0,Math.min(1,i))}function Ot(i){return Math.max(0,Math.min(255,Math.round(i)||0))}function Bt(i){return i=Ot(i),(i<16?"0":"")+i.toString(16)}function Gi(i,t,e,n){return n<=0?i=t=e=NaN:e<=0||e>=1?i=t=NaN:t<=0&&(i=NaN),new Ct(i,t,e,n)}function $i(i){if(i instanceof Ct)return new Ct(i.h,i.s,i.l,i.opacity);if(i instanceof oe||(i=ce(i)),!i)return new Ct;if(i instanceof Ct)return i;i=i.rgb();var t=i.r/255,e=i.g/255,n=i.b/255,r=Math.min(t,e,n),s=Math.max(t,e,n),o=NaN,a=s-r,c=(s+r)/2;return a?(t===s?o=(e-n)/a+(e0&&c<1?0:o,new Ct(o,a,c,i.opacity)}function ga(i,t,e,n){return arguments.length===1?$i(i):new Ct(i,t,e,n??1)}function Ct(i,t,e,n){this.h=+i,this.s=+t,this.l=+e,this.opacity=+n}bn(Ct,ga,Pi(oe,{brighter(i){return i=i==null?ze:Math.pow(ze,i),new Ct(this.h,this.s,this.l*i,this.opacity)},darker(i){return i=i==null?ae:Math.pow(ae,i),new Ct(this.h,this.s,this.l*i,this.opacity)},rgb(){var i=this.h%360+(this.h<0)*360,t=isNaN(i)||isNaN(this.s)?0:this.s,e=this.l,n=e+(e<.5?e:1-e)*t,r=2*e-n;return new pt(xn(i>=240?i-240:i+120,r,n),xn(i,r,n),xn(i<120?i+240:i-120,r,n),this.opacity)},clamp(){return new Ct(qi(this.h),Re(this.s),Re(this.l),Be(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const i=Be(this.opacity);return`${i===1?"hsl(":"hsla("}${qi(this.h)}, ${Re(this.s)*100}%, ${Re(this.l)*100}%${i===1?")":`, ${i})`}`}}));function qi(i){return i=(i||0)%360,i<0?i+360:i}function Re(i){return Math.max(0,Math.min(1,i||0))}function xn(i,t,e){return(i<60?t+(e-t)*i/60:i<180?e:i<240?t+(e-t)*(240-i)/60:t)*255}const ji=i=>()=>i;function ma(i,t){return function(e){return i+e*t}}function va(i,t,e){return i=Math.pow(i,e),t=Math.pow(t,e)-i,e=1/e,function(n){return Math.pow(i+n*t,e)}}function ya(i){return(i=+i)==1?Ui:function(t,e){return e-t?va(t,e,i):ji(isNaN(t)?e:t)}}function Ui(i,t){var e=t-i;return e?ma(i,e):ji(isNaN(i)?t:i)}const Vi=(function i(t){var e=ya(t);function n(r,s){var o=e((r=wn(r)).r,(s=wn(s)).r),a=e(r.g,s.g),c=e(r.b,s.b),l=Ui(r.opacity,s.opacity);return function(h){return r.r=o(h),r.g=a(h),r.b=c(h),r.opacity=l(h),r+""}}return n.gamma=i,n})(1);function Lt(i,t){return i=+i,t=+t,function(e){return i*(1-e)+t*e}}var Cn=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,_n=new RegExp(Cn.source,"g");function ba(i){return function(){return i}}function wa(i){return function(t){return i(t)+""}}function xa(i,t){var e=Cn.lastIndex=_n.lastIndex=0,n,r,s,o=-1,a=[],c=[];for(i=i+"",t=t+"";(n=Cn.exec(i))&&(r=_n.exec(t));)(s=r.index)>e&&(s=t.slice(e,s),a[o]?a[o]+=s:a[++o]=s),(n=n[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:Lt(n,r)})),e=_n.lastIndex;return e180?h+=360:h-l>180&&(l+=360),d.push({i:u.push(r(u)+"rotate(",null,n)-2,x:Lt(l,h)})):h&&u.push(r(u)+"rotate("+h+n)}function a(l,h,u,d){l!==h?d.push({i:u.push(r(u)+"skewX(",null,n)-2,x:Lt(l,h)}):h&&u.push(r(u)+"skewX("+h+n)}function c(l,h,u,d,p,m){if(l!==u||h!==d){var v=p.push(r(p)+"scale(",null,",",null,")");m.push({i:v-4,x:Lt(l,u)},{i:v-2,x:Lt(h,d)})}else(u!==1||d!==1)&&p.push(r(p)+"scale("+u+","+d+")")}return function(l,h){var u=[],d=[];return l=i(l),h=i(h),s(l.translateX,l.translateY,h.translateX,h.translateY,u,d),o(l.rotate,h.rotate,u,d),a(l.skewX,h.skewX,u,d),c(l.scaleX,l.scaleY,h.scaleX,h.scaleY,u,d),l=h=null,function(p){for(var m=-1,v=d.length,b;++m=0&&(t=t.slice(0,e)),!t||t==="start"})}function rl(i,t,e){var n,r,s=il(t)?yn:Mt;return function(){var o=s(this,i),a=o.on;a!==n&&(r=(n=a).copy()).on(t,e),o.on=r}}function sl(i,t){var e=this._id;return arguments.length<2?xt(this.node(),e).on.on(i):this.each(rl(e,i,t))}function ol(i){return function(){var t=this.parentNode;for(var e in this.__transition)if(+e!==i)return;t&&t.removeChild(this)}}function al(){return this.on("end.remove",ol(this._id))}function ll(i){var t=this._name,e=this._id;typeof i!="function"&&(i=un(i));for(var n=this._groups,r=n.length,s=new Array(r),o=0;o()=>i;function Nn(i,{sourceEvent:t,subject:e,target:n,identifier:r,active:s,x:o,y:a,dx:c,dy:l,dispatch:h}){Object.defineProperties(this,{type:{value:i,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:s,enumerable:!0,configurable:!0},x:{value:o,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:h}})}Nn.prototype.on=function(){var i=this._.on.apply(this._,arguments);return i===this._?this:i};function Pl(i){return!i.ctrlKey&&!i.button}function Fl(){return this.parentNode}function zl(i,t){return t??{x:i.x,y:i.y}}function Ol(){return navigator.maxTouchPoints||"ontouchstart"in this}function Bl(){var i=Pl,t=Fl,e=zl,n=Ol,r={},s=ee("start","drag","end"),o=0,a,c,l,h,u=0;function d(x){x.on("mousedown.drag",p).filter(n).on("touchstart.drag",b).on("touchmove.drag",y,Dl).on("touchend.drag touchcancel.drag",_).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(x,N){if(!(h||!i.call(this,x,N))){var D=E(this,t.call(this,x,N),x,N,"mouse");D&&(Q(x.view).on("mousemove.drag",m,he).on("mouseup.drag",v,he),tr(x.view),kn(x),l=!1,a=x.clientX,c=x.clientY,D("start",x))}}function m(x){if(Xt(x),!l){var N=x.clientX-a,D=x.clientY-c;l=N*N+D*D>u}r.mouse("drag",x)}function v(x){Q(x.view).on("mousemove.drag mouseup.drag",null),er(x.view,l),Xt(x),r.mouse("end",x)}function b(x,N){if(i.call(this,x,N)){var D=x.changedTouches,P=t.call(this,x,N),B=D.length,j,H;for(j=0;j()=>i;function Rl(i,{sourceEvent:t,target:e,transform:n,dispatch:r}){Object.defineProperties(this,{type:{value:i,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},transform:{value:n,enumerable:!0,configurable:!0},_:{value:r}})}function Tt(i,t,e){this.k=i,this.x=t,this.y=e}Tt.prototype={constructor:Tt,scale:function(i){return i===1?this:new Tt(this.k*i,this.x,this.y)},translate:function(i,t){return i===0&t===0?this:new Tt(this.k,this.x+this.k*i,this.y+this.k*t)},apply:function(i){return[i[0]*this.k+this.x,i[1]*this.k+this.y]},applyX:function(i){return i*this.k+this.x},applyY:function(i){return i*this.k+this.y},invert:function(i){return[(i[0]-this.x)/this.k,(i[1]-this.y)/this.k]},invertX:function(i){return(i-this.x)/this.k},invertY:function(i){return(i-this.y)/this.k},rescaleX:function(i){return i.copy().domain(i.range().map(this.invertX,this).map(i.invert,i))},rescaleY:function(i){return i.copy().domain(i.range().map(this.invertY,this).map(i.invert,i))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var qe=new Tt(1,0,0);Tt.prototype;function An(i){i.stopImmediatePropagation()}function ue(i){i.preventDefault(),i.stopImmediatePropagation()}function Hl(i){return(!i.ctrlKey||i.type==="wheel")&&!i.button}function Gl(){var i=this;return i instanceof SVGElement?(i=i.ownerSVGElement||i,i.hasAttribute("viewBox")?(i=i.viewBox.baseVal,[[i.x,i.y],[i.x+i.width,i.y+i.height]]):[[0,0],[i.width.baseVal.value,i.height.baseVal.value]]):[[0,0],[i.clientWidth,i.clientHeight]]}function nr(){return this.__zoom||qe}function $l(i){return-i.deltaY*(i.deltaMode===1?.05:i.deltaMode?1:.002)*(i.ctrlKey?10:1)}function ql(){return navigator.maxTouchPoints||"ontouchstart"in this}function jl(i,t,e){var n=i.invertX(t[0][0])-e[0][0],r=i.invertX(t[1][0])-e[1][0],s=i.invertY(t[0][1])-e[0][1],o=i.invertY(t[1][1])-e[1][1];return i.translate(r>n?(n+r)/2:Math.min(0,n)||Math.max(0,r),o>s?(s+o)/2:Math.min(0,s)||Math.max(0,o))}function Ul(){var i=Hl,t=Gl,e=jl,n=$l,r=ql,s=[0,1/0],o=[[-1/0,-1/0],[1/0,1/0]],a=250,c=Aa,l=ee("start","zoom","end"),h,u,d,p=500,m=150,v=0,b=10;function y(S){S.property("__zoom",nr).on("wheel.zoom",B,{passive:!1}).on("mousedown.zoom",j).on("dblclick.zoom",H).filter(r).on("touchstart.zoom",V).on("touchmove.zoom",it).on("touchend.zoom touchcancel.zoom",rt).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}y.transform=function(S,T,k,A){var F=S.selection?S.selection():S;F.property("__zoom",nr),S!==F?N(S,T,k,A):F.interrupt().each(function(){D(this,arguments).event(A).start().zoom(null,typeof T=="function"?T.apply(this,arguments):T).end()})},y.scaleBy=function(S,T,k,A){y.scaleTo(S,function(){var F=this.__zoom.k,z=typeof T=="function"?T.apply(this,arguments):T;return F*z},k,A)},y.scaleTo=function(S,T,k,A){y.transform(S,function(){var F=t.apply(this,arguments),z=this.__zoom,O=k==null?x(F):typeof k=="function"?k.apply(this,arguments):k,q=z.invert(O),Y=typeof T=="function"?T.apply(this,arguments):T;return e(E(_(z,Y),O,q),F,o)},k,A)},y.translateBy=function(S,T,k,A){y.transform(S,function(){return e(this.__zoom.translate(typeof T=="function"?T.apply(this,arguments):T,typeof k=="function"?k.apply(this,arguments):k),t.apply(this,arguments),o)},null,A)},y.translateTo=function(S,T,k,A,F){y.transform(S,function(){var z=t.apply(this,arguments),O=this.__zoom,q=A==null?x(z):typeof A=="function"?A.apply(this,arguments):A;return e(qe.translate(q[0],q[1]).scale(O.k).translate(typeof T=="function"?-T.apply(this,arguments):-T,typeof k=="function"?-k.apply(this,arguments):-k),z,o)},A,F)};function _(S,T){return T=Math.max(s[0],Math.min(s[1],T)),T===S.k?S:new Tt(T,S.x,S.y)}function E(S,T,k){var A=T[0]-k[0]*S.k,F=T[1]-k[1]*S.k;return A===S.x&&F===S.y?S:new Tt(S.k,A,F)}function x(S){return[(+S[0][0]+ +S[1][0])/2,(+S[0][1]+ +S[1][1])/2]}function N(S,T,k,A){S.on("start.zoom",function(){D(this,arguments).event(A).start()}).on("interrupt.zoom end.zoom",function(){D(this,arguments).event(A).end()}).tween("zoom",function(){var F=this,z=arguments,O=D(F,z).event(A),q=t.apply(F,z),Y=k==null?x(q):typeof k=="function"?k.apply(F,z):k,R=Math.max(q[1][0]-q[0][0],q[1][1]-q[0][1]),tt=F.__zoom,vt=typeof T=="function"?T.apply(F,z):T,lt=c(tt.invert(Y).concat(R/tt.k),vt.invert(Y).concat(R/vt.k));return function(gt){if(gt===1)gt=vt;else{var ct=lt(gt),Qt=R/ct[2];gt=new Tt(Qt,Y[0]-ct[0]*Qt,Y[1]-ct[1]*Qt)}O.zoom(null,gt)}})}function D(S,T,k){return!k&&S.__zooming||new P(S,T)}function P(S,T){this.that=S,this.args=T,this.active=0,this.sourceEvent=null,this.extent=t.apply(S,T),this.taps=0}P.prototype={event:function(S){return S&&(this.sourceEvent=S),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(S,T){return this.mouse&&S!=="mouse"&&(this.mouse[1]=T.invert(this.mouse[0])),this.touch0&&S!=="touch"&&(this.touch0[1]=T.invert(this.touch0[0])),this.touch1&&S!=="touch"&&(this.touch1[1]=T.invert(this.touch1[0])),this.that.__zoom=T,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(S){var T=Q(this.that).datum();l.call(S,this.that,new Rl(S,{sourceEvent:this.sourceEvent,target:y,transform:this.that.__zoom,dispatch:l}),T)}};function B(S,...T){if(!i.apply(this,arguments))return;var k=D(this,T).event(S),A=this.__zoom,F=Math.max(s[0],Math.min(s[1],A.k*Math.pow(2,n.apply(this,arguments)))),z=kt(S);if(k.wheel)(k.mouse[0][0]!==z[0]||k.mouse[0][1]!==z[1])&&(k.mouse[1]=A.invert(k.mouse[0]=z)),clearTimeout(k.wheel);else{if(A.k===F)return;k.mouse=[z,A.invert(z)],Fe(this),k.start()}ue(S),k.wheel=setTimeout(O,m),k.zoom("mouse",e(E(_(A,F),k.mouse[0],k.mouse[1]),k.extent,o));function O(){k.wheel=null,k.end()}}function j(S,...T){if(d||!i.apply(this,arguments))return;var k=S.currentTarget,A=D(this,T,!0).event(S),F=Q(S.view).on("mousemove.zoom",Y,!0).on("mouseup.zoom",R,!0),z=kt(S,k),O=S.clientX,q=S.clientY;tr(S.view),An(S),A.mouse=[z,this.__zoom.invert(z)],Fe(this),A.start();function Y(tt){if(ue(tt),!A.moved){var vt=tt.clientX-O,lt=tt.clientY-q;A.moved=vt*vt+lt*lt>v}A.event(tt).zoom("mouse",e(E(A.that.__zoom,A.mouse[0]=kt(tt,k),A.mouse[1]),A.extent,o))}function R(tt){F.on("mousemove.zoom mouseup.zoom",null),er(tt.view,A.moved),ue(tt),A.event(tt).end()}}function H(S,...T){if(i.apply(this,arguments)){var k=this.__zoom,A=kt(S.changedTouches?S.changedTouches[0]:S,this),F=k.invert(A),z=k.k*(S.shiftKey?.5:2),O=e(E(_(k,z),A,F),t.apply(this,T),o);ue(S),a>0?Q(this).transition().duration(a).call(N,O,A,S):Q(this).call(y.transform,O,A,S)}}function V(S,...T){if(i.apply(this,arguments)){var k=S.touches,A=k.length,F=D(this,T,S.changedTouches.length===A).event(S),z,O,q,Y;for(An(S),O=0;O=(u=(a+l)/2))?a=u:l=u,(b=e>=(d=(c+h)/2))?c=d:h=d,r=s,!(s=s[y=b<<1|v]))return r[y]=o,i;if(p=+i._x.call(null,s.data),m=+i._y.call(null,s.data),t===p&&e===m)return o.next=s,r?r[y]=o:i._root=o,i;do r=r?r[y]=new Array(4):i._root=new Array(4),(v=t>=(u=(a+l)/2))?a=u:l=u,(b=e>=(d=(c+h)/2))?c=d:h=d;while((y=b<<1|v)===(_=(m>=d)<<1|p>=u));return r[_]=s,r[y]=o,i}function Xl(i){var t,e,n=i.length,r,s,o=new Array(n),a=new Array(n),c=1/0,l=1/0,h=-1/0,u=-1/0;for(e=0;eh&&(h=r),su&&(u=s));if(c>h||l>u)return this;for(this.cover(c,l).cover(h,u),e=0;ei||i>=r||n>t||t>=s;)switch(l=(th||(a=m.y0)>u||(c=m.x1)=y)<<1|i>=b)&&(m=d[d.length-1],d[d.length-1]=d[d.length-1-v],d[d.length-1-v]=m)}else{var _=i-+this._x.call(null,p.data),E=t-+this._y.call(null,p.data),x=_*_+E*E;if(x=(d=(o+c)/2))?o=d:c=d,(v=u>=(p=(a+l)/2))?a=p:l=p,t=e,!(e=e[b=v<<1|m]))return this;if(!e.length)break;(t[b+1&3]||t[b+2&3]||t[b+3&3])&&(n=t,y=b)}for(;e.data!==i;)if(r=e,!(e=e.next))return this;return(s=e.next)&&delete e.next,r?(s?r.next=s:delete r.next,this):t?(s?t[b]=s:delete t[b],(e=t[0]||t[1]||t[2]||t[3])&&e===(t[3]||t[2]||t[1]||t[0])&&!e.length&&(n?n[y]=e:this._root=e),this):(this._root=s,this)}function tc(i){for(var t=0,e=i.length;td.index){var V=p-B.x-B.vx,it=m-B.y-B.vy,rt=V*V+it*it;rtp+H||Dm+H||Pl.r&&(l.r=l[h].r)}function c(){if(t){var l,h=t.length,u;for(e=new Array(h),l=0;l[t(N,D,o),N])),x;for(b=0,a=new Array(y);b<_;++b)x=i[b],x.index=b,typeof x.source!="object"&&(x.source=sr(E,x.source)),typeof x.target!="object"&&(x.target=sr(E,x.target)),a[x.source.index]=(a[x.source.index]||0)+1,a[x.target.index]=(a[x.target.index]||0)+1;for(b=0,c=new Array(_);b<_;++b)x=i[b],c[b]=a[x.source.index]/(a[x.source.index]+a[x.target.index]);n=new Array(_),m(),s=new Array(_),v()}}function m(){if(o)for(var b=0,y=i.length;b(i=(fc*i+gc)%or)/or}function vc(i){return i.x}function yc(i){return i.y}var bc=10,wc=Math.PI*(3-Math.sqrt(5));function xc(i){var t,e=1,n=.001,r=1-Math.pow(n,1/300),s=0,o=.6,a=new Map,c=fn(u),l=ee("tick","end"),h=mc();i==null&&(i=[]);function u(){d(),l.call("tick",t),e1?(b==null?a.delete(v):a.set(v,m(b)),t):a.get(v)},find:function(v,b,y){var _=0,E=i.length,x,N,D,P,B;for(y==null?y=1/0:y*=y,_=0;_1?(l.on(v,b),t):l.on(v)}}}function Cc(){var i,t,e,n,r=et(-30),s,o=1,a=1/0,c=.81;function l(p){var m,v=i.length,b=Tn(i,vc,yc).visitAfter(u);for(n=p,m=0;m=a)return;(p.data!==t||p.next)&&(y===0&&(y=Dt(e),x+=y*y),_===0&&(_=Dt(e),x+=_*_),xr){const h=r/l,u=o*h,d=a*h;s.x=u,s.y=d}}}return n.initialize=r=>{e=r},n}class _c{static globalToLocal(t,e,n){const r=n.x??0,s=n.y??0;return{x:t-r,y:e-s}}static localToGlobal(t,e,n){const r=n.x??0,s=n.y??0;return{x:t+r,y:e+s}}}class J{constructor(t){f(this,"nodeDrawer");f(this,"edgeDrawer");this.nodeDrawer=t}render(t,e,n){this.edgeDrawer||(this.edgeDrawer=this.nodeDrawer.graphSvgRenderer.edgeDrawer);let r=t.select(".pvt-cluster-area");if(r.empty()){r=t.append("circle").classed("pvt-cluster-area",!0).lower();const u=J.buildGradientForNode(t.node().querySelector(".node"),r,e);u&&r.style("stroke",`color-mix(in srgb, ${u} 70%, transparent)`)}const s=J.updateToNewRadiusExpanded(this.nodeDrawer.graph,e);r.attr("r",0).attr("_final_r",s).attr("cx",0).attr("cy",0),r.transition().duration(250).attr("r",s);const o=new Set,a=e.children.flatMap(u=>[...u.getEdgesOut()??[],...u.getEdgesIn()??[]]).filter(u=>o.has(u.id)?!1:(o.add(u.id),!0)),c=t.node(),l=this.createSubgraph(e.children,a,c,e,this.nodeDrawer.graph);e.setSubgraph(l),t.select(":scope > .zoom-layer").attr("opacity",0).transition().duration(250).attr("opacity",1),J.toggleSyntheticEdges(e);let h=this.nodeDrawer.graph.getParentGraph();for(;h;)h.renderer.update(!1),h=h.getParentGraph();return n&&requestAnimationFrame(()=>{n(s)}),r}createSubgraph(t,e,n,r,s){const o=d=>{d.getMutableNodes().forEach(p=>{let m=s.getMutableNode(p.id);m=m.getOriginalObject()??m,p.setOriginalObject(m),m.setDeepestNodeClone(p),p.isChild=!0}),d.getMutableEdges().forEach(p=>{let m=s.getMutableEdge(p.id);m&&(m=m.getOriginalObject()??m,p.setOriginalObject(m))}),t.forEach(p=>{var m;if(((m=p.parentNode)==null?void 0:m.id)===r.id){const v=d.getMutableNode(p.id);v&&(v.parentNode=r)}}),s.getMutableEdges().forEach(p=>{const m=p.getOriginalObject()??p,v=d.getMutableNode(p.from.id),b=d.getMutableNode(p.to.id);v&&m.setSubgraphFromNode(v),b&&m.setSubgraphToNode(b)})},a={UI:{mode:"viewer",tooltip:{enabled:!1},contextMenu:{enabled:!1},navigation:{enabled:!1}},render:{...this.nodeDrawer.graph.getOptions().render,zoomEnabled:!1,zoomAnimationDuration:100,beforeRender:o},simulation:{useWorker:!1,warmupTicks:10,cooldownTime:50,freezeNodesOnDrag:!1},callbacks:{onNodeSelect:d=>{const p=s.getMutableNode(d.id);p&&s.selectElement(p)},onNodesSelect:d=>{const p=h.renderer.getGraphInteraction().getSelectedNodeIDs();if(p===null)return;const m=p.map(v=>{const b=s.getMutableNode(v);return{node:b,element:b==null?void 0:b.getGraphElement()}});s.renderer.getGraphInteraction().addNodesToSelection(m)},onEdgeSelect:d=>{const p=s.getMutableEdge(d.id);p&&s.selectElement(p)},onNodeHoverIn:(d,p)=>{var m;(m=s.UIManager.tooltip)==null||m.openForNodeOnElement(d,p)}},parentGraph:this.nodeDrawer.graph},c={nodes:[...t].map(d=>d.toDict(!0)),edges:[...e].map(d=>d.toDict())},l=document.createElement("div"),h=new ft(l,c,a),u=l.querySelector(".zoom-layer");return n.appendChild(u),h.getMutableNodes().forEach(d=>{J.toggleSyntheticEdges(d)}),h.on("ready",()=>{h.simulation.getSimulation().force("center",Vl(0,0)).force("constrainParent",Ln(r.getCircleRadius(),10)),h.simulation.restart()}),h.renderer.getGraphInteraction().on("dragended",()=>{}),h.renderer.getGraphInteraction().on("simulationTick",()=>{h.getMutableNodes().filter(p=>p.visible).forEach(p=>{const m=p.x??0,v=p.y??0;this.updatePositionOnRealChild(m,v,p.id)})}),s.renderer.getGraphInteraction().on("dragging",()=>{this.updatePositionOnAllRealChildren(s)}),s.renderer.getGraphInteraction().on("simulationTick",()=>{this.updatePositionOnAllRealChildren(s)}),s.renderer.getGraphInteraction().on("canvasClick",()=>{h.deselectAll()}),h}updatePositionOnAllRealChildren(t){t.getMutableNodes().filter(e=>e.isParent&&e.expanded).forEach(e=>{const n=e.children,r=e.getSubgraph(),s=new Map;r&&(r.getMutableNodes().forEach(o=>{s.set(o.id,o)}),this.updatePositionOnAllRealChildren(r)),n.forEach(o=>{const a=s.get(o.id);!a||!a.x||!a.y||this.updatePositionOnRealChild(a.x,a.y,o.id)})})}updatePositionOnRealChild(t,e,n){const r=this.nodeDrawer.graph.getMutableNode(n),s=r==null?void 0:r.parentNode;if(r&&s){const o=_c.localToGlobal(t,e,s);r.x=o.x,r.y=o.y,this.nodeDrawer.graph.renderer.nextTickFor([r]);const a=this.nodeDrawer.graph.getParentGraph();a&&a.renderer.nodeDrawer.clusterDrawer.updatePositionOnRealChild(t,e,n)}}static toggleSyntheticEdges(t){if(t.expanded){t.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{n.hide()});const e=t.getOriginalObject()??t;e.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{n.hide()}),e.children.forEach(n=>{n.getEdgesIn().filter(r=>!e.children.includes(r.from)).forEach(r=>{r.show()})})}else{t.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{n.show()});const e=t.getOriginalObject()??t;e.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{t.visible&&n.show()}),J.hideNestedEdges(e)}}static hideNestedEdges(t){t.children.forEach(e=>{J.hideNestedEdges(e),e.getEdgesIn().filter(n=>!t.children.includes(n.from)).forEach(n=>{n.hide()})})}static collapseAllOpenedClusters(t){t.children.forEach(e=>{J.collapseAllOpenedClusters(e),e.collapse(),e.setCircleRadius(e.getCircleRadiusCollapsed())})}static updateToNewRadiusExpanded(t,e){const n=J.getRadiusForClusterNode(e);e.expanded||e.setCircleRadiusCollapsed(e.getCircleRadius()),e.setCircleRadius(n);const r=t.getParentGraph();if(r){const s=J.updateParentGraph(r,e,n);s&&t.simulation.getSimulation().force("link",null).force("constrainParent",Ln(s,10)),r.getParentGraph()&&e.parentNode&&J.updateToNewRadiusExpanded(r,e.parentNode)}return n}static updateToNewRadiusCollapsed(t,e,n){const r=e?t.getCircleRadiusCollapsed():J.getRadiusForClusterNode(t);if(t.setCircleRadius(r),n){J.updateParentGraph(n,t,r);const s=n.getParentGraph();t.parentNode&&J.updateToNewRadiusCollapsed(t.parentNode,!1,s)}}static getRadiusForClusterNode(t){if(!t.expanded)return t.getCircleRadius()+4;const e=50,n=16,s=t.children.reduce((a,c)=>{const l=c.getCircleRadius();return a+l+n},0)/t.children.length,o=Math.sqrt(t.children.length)*(2*s)+e;return Math.max(50,o)}static updateParentGraph(t,e,n){var a;const r=t.getMutableNode(e.id);r==null||r.setCircleRadius(n);const s=e.getOriginalObject();s&&s.setCircleRadius(n);const o=e.parentNode;if(o){const c=J.getRadiusForClusterNode(o);o.setCircleRadius(c),t.onChange(),t.simulation.reheat(.1);const l=(a=o.getGraphElement())==null?void 0:a.querySelector("& > .pvt-cluster-area");if(l){const h=Q(l);h.attr("_final_r",c).transition().duration(250).attr("r",c),je.handleChildrenExpanded(t,o,h)}return c}}static buildGradientForNode(t,e,n){if(t){const r=getComputedStyle(t).fill,s=`color-mix(in srgb, ${r} 40%, transparent)`,o=`pvt-cluster-area-${n.id}`,a=t.closest(".pvt-canvas-element"),c=a==null?void 0:a.querySelector("defs");if(!c)return;const l=c.appendChild(document.createElementNS("http://www.w3.org/2000/svg","radialGradient"));l.setAttribute("id",o);const h=document.createElementNS("http://www.w3.org/2000/svg","stop");h.setAttribute("offset","90%"),h.setAttribute("stop-color","#ffffff00"),l.appendChild(h);const u=document.createElementNS("http://www.w3.org/2000/svg","stop");return u.setAttribute("offset","100%"),u.setAttribute("stop-color",s),l.appendChild(u),e.style("fill",`url(#${o})`),r}}}Q.prototype.transition=En;class je{constructor(t,e,n){f(this,"graph");f(this,"rendererOptions");f(this,"graphSvgRenderer");f(this,"clusterDrawer");f(this,"renderCB");var r;this.graphSvgRenderer=n,this.graph=e,this.rendererOptions=t,this.renderCB=(r=this.rendererOptions)==null?void 0:r.renderNode,this.clusterDrawer=new J(this)}render(t,e){var n,r;if(this.renderCB){const s=t.append("foreignObject"),o=(n=this==null?void 0:this.renderCB)==null?void 0:n.call(this,e);s.attr("width",20).attr("height",20),typeof o=="string"?s.text(o):o instanceof HTMLElement&&((r=s.node())==null||r.append(o)),requestAnimationFrame(()=>{const a=s.node();if(!a)return;const c=a.firstElementChild;if(!c)return;const l=c.getBoundingClientRect(),h=Math.ceil(l.width),u=Math.ceil(l.height);s.attr("width",h).attr("height",u),s.attr("x",-h/2).attr("y",-u/2),this.rendererOptions.enableNodeExpansion&&(!e.hasChildren()||!e.expanded)&&e.setCircleRadius(.5*Math.max(h,u))})}else this.defaultNodeRender(t,e),requestAnimationFrame(()=>{const s=t.node();if(!s)return;let o=50,a=50;const c=s.querySelector(".node").getBBox();c.width>0&&c.height>0&&(o=Math.ceil(c.width),a=Math.ceil(c.height)),this.rendererOptions.enableNodeExpansion&&(!e.hasChildren()||!e.expanded)&&(this.getNodeStyle(e).shape=="square"?e.setCircleRadius(Math.SQRT1_2*Math.max(o,a)):e.setCircleRadius(.5*Math.max(o,a)))});if(this.rendererOptions.enableNodeExpansion&&e.hasChildren()){if(e.expanded){const s=this.clusterDrawer.render(t,e,()=>{je.handleChildrenExpanded(this.graph,e,s)});requestAnimationFrame(()=>{J.updateToNewRadiusExpanded(this.graph,e)})}requestAnimationFrame(()=>{this.addExpandCollapseIcons(t,e)})}}updatePositions(t){t.attr("transform",e=>{const n=e.x&&isFinite(e.x)?e.x:0,r=e.y&&isFinite(e.y)?e.y:0;return`translate(${n},${r})`})}defaultNodeRender(t,e){const n=this.getNodeStyle(e);this.genericNodeRender(t,n,e)}mergeNodeStylingOptions(t){return{shape:(t==null?void 0:t.shape)??this.rendererOptions.defaultNodeStyle.shape,strokeColor:(t==null?void 0:t.strokeColor)??this.rendererOptions.defaultNodeStyle.strokeColor,strokeWidth:(t==null?void 0:t.strokeWidth)??this.rendererOptions.defaultNodeStyle.strokeWidth,fontFamily:(t==null?void 0:t.fontFamily)??this.rendererOptions.defaultNodeStyle.fontFamily,size:(t==null?void 0:t.size)??this.rendererOptions.defaultNodeStyle.size,color:(t==null?void 0:t.color)??this.rendererOptions.defaultNodeStyle.color,textColor:(t==null?void 0:t.textColor)??this.rendererOptions.defaultNodeStyle.textColor,textVerticalShift:(t==null?void 0:t.textVerticalShift)??this.rendererOptions.defaultNodeStyle.textVerticalShift,iconUnicode:(t==null?void 0:t.iconUnicode)??this.rendererOptions.defaultNodeStyle.iconUnicode,iconClass:(t==null?void 0:t.iconClass)??this.rendererOptions.defaultNodeStyle.iconClass,svgIcon:(t==null?void 0:t.svgIcon)??this.rendererOptions.defaultNodeStyle.svgIcon,imagePath:(t==null?void 0:t.imagePath)??this.rendererOptions.defaultNodeStyle.imagePath,text:(t==null?void 0:t.text)??this.rendererOptions.defaultNodeStyle.text,html:(t==null?void 0:t.html)??this.rendererOptions.defaultNodeStyle.html}}computeNodeStyle(t){let e={};if(this.rendererOptions.nodeStyleMap&&typeof this.rendererOptions.nodeTypeAccessor=="function"){const s=this.rendererOptions.nodeTypeAccessor(t);s&&(e=this.rendererOptions.nodeStyleMap[s]??{})}const n=t.getStyle();let r={};return n.styleCb?r=n.styleCb(t):r={shape:(n==null?void 0:n.shape)??(e==null?void 0:e.shape),strokeColor:(n==null?void 0:n.strokeColor)??(e==null?void 0:e.strokeColor),strokeWidth:(n==null?void 0:n.strokeWidth)??(e==null?void 0:e.strokeWidth),fontFamily:(n==null?void 0:n.fontFamily)??(e==null?void 0:e.fontFamily),size:(n==null?void 0:n.size)??(e==null?void 0:e.size),color:(n==null?void 0:n.color)??(e==null?void 0:e.color),textColor:(n==null?void 0:n.textColor)??(e==null?void 0:e.textColor),textVerticalShift:(n==null?void 0:n.textVerticalShift)??(e==null?void 0:e.textVerticalShift),iconUnicode:(n==null?void 0:n.iconUnicode)??(e==null?void 0:e.iconUnicode),iconClass:(n==null?void 0:n.iconClass)??(e==null?void 0:e.iconClass),svgIcon:(n==null?void 0:n.svgIcon)??(e==null?void 0:e.svgIcon),imagePath:(n==null?void 0:n.imagePath)??(e==null?void 0:e.imagePath),text:(n==null?void 0:n.text)??(e==null?void 0:e.text),html:(n==null?void 0:n.html)??(e==null?void 0:e.html)},this.mergeNodeStylingOptions(r)}getNodeStyle(t){const e=this.computeNodeStyle(t);return typeof e.shape=="function"&&(e.shape=e.shape(t)),e.strokeWidth=e.strokeWidth!==void 0?W(e.strokeWidth.toString(),t)??"var(--pvt-node-stroke-width, 2)":"var(--pvt-node-stroke-width, 2)",e.strokeColor=e.strokeColor!==void 0?W(e.strokeColor,t)??"var(--pvt-node-stroke, #fff)":"var(--pvt-node-stroke, #fff)",e.size=e.size!==void 0?xe(e.size,t)??10:10,e.color=e.color!==void 0?W(e.color,t)??"var(--pvt-node-color, #007acc)":"var(--pvt-node-color, #007acc)",e.textColor=e.textColor!==void 0?W(e.textColor,t)??"var(--pvt-node-text-color, #fff)":"var(--pvt-node-text-color, #fff)",e.textVerticalShift=e.textVerticalShift!==void 0?xe(e.textVerticalShift,t)??0:0,e.text=e.text!==void 0?W(e.text,t):void 0,e.iconUnicode=e.iconUnicode!==void 0?W(e.iconUnicode,t):void 0,e.iconClass=e.iconClass!==void 0?W(e.iconClass,t):void 0,e.svgIcon=e.svgIcon!==void 0?W(e.svgIcon,t):void 0,e.imagePath=e.imagePath!==void 0?W(e.imagePath,t):void 0,e}isCustomShape(t){return typeof t=="object"&&t!==null&&"d"in t}genericNodeRender(t,e,n){var o,a,c;e.size=e.size,e.shape=e.shape,e.text=e.text,e.textVerticalShift=e.textVerticalShift;let r=e.shape;e.shape=="square"?r="rect":(this.isCustomShape(e.shape)||["triangle","hexagon"].includes(e.shape))&&(r="path");const s=t.append(r).attr("stroke",e.strokeColor).attr("stroke-width",e.strokeWidth).attr("fill",e.color).classed("node",!0);switch(e.shape){case"circle":s.attr("r",e.size),n.setCircleRadius(e.size);break;case"square":s.attr("width",e.size*2).attr("height",e.size*2).attr("x",-e.size).attr("y",-e.size),n.setCircleRadius(Math.SQRT1_2*e.size);break;case"triangle":{const l=[[0,-e.size],[e.size,e.size],[-e.size,e.size]].map(h=>h.join(",")).join(" ");s.attr("d",`M${l}Z`),n.setCircleRadius(e.size);break}case"hexagon":{const l=Math.PI/3,h=Array.from({length:6},(u,d)=>{const p=l*d;return[Math.cos(p)*e.size,Math.sin(p)*e.size]}).map(u=>u.join(",")).join(" ");s.attr("d",`M${h}Z`),n.setCircleRadius(e.size);break}default:this.isCustomShape(e.shape)?(s.attr("d",e.shape.d),n.setCircleRadius(15)):(s.attr("r",e.size),n.setCircleRadius(e.size));break}if(e.iconUnicode||e.iconClass)t.append("text").attr("fill",e.textColor).attr("text-anchor","middle").attr("dominant-baseline","central").attr("font-size",e.size*1.2).attr("class","node-content icon "+(e.iconUnicode?"icon-unicode":e.iconClass??"")).text(e.iconUnicode??di(e.iconClass??"")??"☐");else if(e.svgIcon){const l=document.createElementNS("http://www.w3.org/2000/svg","svg");l.innerHTML=e.svgIcon,((o=l.children[0])==null?void 0:o.nodeName)==="svg"&&(l.children[0].removeAttribute("width"),l.children[0].removeAttribute("height")),t.append(()=>l).attr("class","node-content").attr("x",-e.size*.7).attr("y",-e.size*.7).attr("width",e.size*1.4).attr("height",e.size*1.4).attr("color",e.strokeColor)}else if(e.imagePath)t.append("image").attr("class","node-content").attr("xlink:href",e.imagePath).attr("x",-e.size*.6).attr("y",-e.size*.6).attr("width",e.size*1.2).attr("height",e.size*1.2);else if(e.html){const l=t.append("foreignObject"),h=e.html(n);l.attr("width",e.size*2).attr("height",e.size*2).attr("x",-e.size).attr("y",-e.size),typeof h=="string"?l.text(h):h instanceof HTMLElement&&((a=l.node())==null||a.append(h))}if(e.text){const[l,h]=this.computeTextLayout(e.text,e.size,e.textVerticalShift),d=(c=t.append("text").attr("text-anchor","middle").attr("y",-e.textVerticalShift*(e.size+l/2*1.2)).attr("dominant-baseline","central").attr("font-size",l).attr("font-family",e.fontFamily).attr("fill",e.textColor).text(h).node())==null?void 0:c.getBBox();Math.abs(e.textVerticalShift)>=1&&d&&t.insert("rect","text").attr("x",d.x-4).attr("y",d.y-2).attr("width",d.width+8).attr("height",d.height+4).attr("fill",gr.backgroundColor).attr("rx",2).attr("ry",2)}}checkForHighlight(t,e){this.isNodeSelected(e)?this.highlightSelection(t,e):this.deHighlightSelection(t,e)}isNodeSelected(t){var a;const e=this.graphSvgRenderer.getGraphInteraction(),n=e.getSelectedNode(),r=e.getSelectedNodeIDs(),s=((a=n==null?void 0:n.node)==null?void 0:a.id)===t.id,o=Array.isArray(r)?r.includes(t.id):!1;return s||o}deHighlightSelection(t,e){t.classed("pvt-node-selected-highlight",!1),this.rendererOptions.enableFocusMode&&(this.graph.getMutableNodes().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-node-selected-highlight-shadow",!1)}),this.graph.getMutableEdges().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!1)}))}highlightSelection(t,e){this.rendererOptions.enableFocusMode&&(this.graph.getMutableNodes().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-node-selected-highlight-shadow",!0)}),this.graph.getMutableEdges().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!0)}),t.classed("pvt-node-selected-highlight-shadow",!1)),t.classed("pvt-node-selected-highlight",!0),this.rendererOptions.enableFocusMode&&(e.getEdgesOut().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!1);const s=n.to.getGraphElement();s==null||s.classList.toggle("pvt-node-selected-highlight-shadow",!1)}),e.getEdgesIn().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!1);const s=n.from.getGraphElement();s==null||s.classList.toggle("pvt-node-selected-highlight-shadow",!1)}))}computeTextLayout(t,e,n=0){const r=e*.9,s=Math.abs(n)>=1?r*5:r*2,o=Math.max(12,r*.5),a=o*.55,c=Math.floor(s/a)-1;if(t.length>c&&t.length>7){const l=Math.max(6,s/a)-1,h=3,u=l-h;t=t.slice(0,u)+"…"+t.slice(t.length-h)}return[o,t]}addExpandCollapseIcons(t,e){const s=(o,a)=>{this.graph.UIManager.tooltip&&this.graph.UIManager.tooltip.hide(o),this.graph.toggleExpandNode(o),a||(this.graph.simulation.reheat(.05),this.graph.renderer.fitAndCenter())};t.each((o,a,c)=>{const l=Q(c[a]);l.selectAll(":scope > .node-icon").remove();const h=(o.getCircleRadius()+2)/Math.sqrt(2),u=l.append("g").classed("node-icon",!0).classed(o.expanded?"collapse-icon":"expand-icon",!0).attr("transform",o.expanded?`translate(${h}, ${h})`:`translate(${h}, ${-h})`);u.append("title").text(o.expanded?"Collapse nodes":"Expand node"),u.append("circle").attr("r",8).style("cursor","pointer").on("click",d=>{d.stopPropagation(),s(o,!o.expanded)}),l.select(o.expanded?":scope > .collapse-icon":":scope > .expand-icon").append("text").text(o.expanded?"-":"+")})}static handleChildrenExpanded(t,e,n){var h,u;t.simulation.reheat(.1);const r=Number(n.attr("_final_r")),o=(r+2)/Math.sqrt(2),a=(h=e.getGraphElement())==null?void 0:h.querySelector("& > .node");a&&Q(a).transition().duration(250).on("end",()=>{t.renderer.fitAndCenter()}).attr("transform",`translate(${-o}, ${-o})`);const c=(u=e.getGraphElement())==null?void 0:u.querySelector("& > .node-icon");c&&Q(c).transition().duration(250).attr("transform",e.expanded?`translate(${o}, ${o})`:`translate(${o}, ${-o})`);const l=e.getSubgraph();l&&l.simulation.getSimulation().force("constrainParent",Ln(Number(r),10))}}function Mc(i){return i*Math.PI/180}function de(i){for(;i<0;)i+=2*Math.PI;for(;i>=2*Math.PI;)i-=2*Math.PI;return i}function Sc(i){let{rx:t,ry:e}=i;const{xAxisRotation:n,from:r,to:s}=i,o=Mc(n),a=Math.cos(o),c=Math.sin(o),l=(r.x-s.x)/2,h=(r.y-s.y)/2,u=a*l+c*h,d=-c*l+a*h;let p=t*t,m=e*e;const v=u*u,b=d*d,y=v/p+b/m;if(y>1){const A=Math.sqrt(y);t*=A,e*=A,p=t*t,m=e*e}const _=1,E=p*m-p*b-m*v,x=p*b+m*v,N=_*Math.sqrt(Math.max(0,E/x)),D=N*(t*d/e),P=N*(-(e*u)/t),B=a*D-c*P+(r.x+s.x)/2,j=c*D+a*P+(r.y+s.y)/2;function H(A,F,z,O){const q=A*z+F*O,Y=Math.sqrt(A*A+F*F)*Math.sqrt(z*z+O*O);let R=Math.acos(Math.min(Math.max(q/Y,-1),1));return A*O-F*z<0&&(R=-R),R}const V=(u-D)/t,it=(d-P)/e,rt=(-u-D)/t,S=(-d-P)/e;let T=H(1,0,V,it),k=H(V,it,rt,S);return k<0&&(k+=2*Math.PI),T=de(T),k=de(k),{cx:B,cy:j,startAngle:T,deltaAngle:k,rx:t,ry:e,xAxisRotation:n}}function Ec(i,t,e,n,r,s){const o=n-i,a=r-t,c=Math.sqrt(o*o+a*a);if(c>e+s)return[];if(c=0?t<=n?i>=t&&i<=n:i>=t||i<=n:n<=t?i<=t&&i>=n:i<=t||i>=n}function Nc(i,t){const{cx:e,cy:n,startAngle:r,deltaAngle:s}=t;for(const o of i){const a=Math.atan2(o.y-n,o.x-e);if(kc(a,r,s))return o}return null}function hr(i,t){const e=Sc(i);if(e.rx===e.ry&&e.xAxisRotation===0){const n=Ec(e.cx,e.cy,e.rx,t.cx,t.cy,t.r),r=Nc(n,e);return r||null}else return console.log("Arc is elliptical or rotated, numerical methods needed for intersection."),null}function Ac(i){if(!i)return null;const t=i.getAttribute("d");if(!t)return null;const e=Pc(t);if(!e)return null;const{x0:n,y0:r,x1:s,y1:o}=e,a=s-n,c=o-r,l={x:n+a/2,y:r+c/2};return{length:Math.sqrt(a*a+c*c),midpoint:l}}function Tc(i){if(!i)return null;const t=i.getAttribute("d");if(!t)return null;const e=Lc(t);if(!e)return null;const n=e.to.x-e.from.x,r=e.to.y-e.from.y,s=Math.hypot(n,r),o=e.rx,a=2*Math.asin(Math.min(s/(2*o),1)),c=o*a,l=(e.from.x+e.to.x)/2,h=(e.from.y+e.to.y)/2,u=Math.sqrt(Math.max(0,o*o-(s/2)**2)),d=-r/s,p=n/s,m=e.sweepFlag!==e.largeArcFlag?1:-1,v=l+m*u*d,b=h+m*u*p,y=Math.atan2(e.from.y-b,e.from.x-v);let E=Math.atan2(e.to.y-b,e.to.x-v)-y;for(;E>Math.PI;)E-=2*Math.PI;for(;E<-Math.PI;)E+=2*Math.PI;e.sweepFlag&&E<0&&(E+=2*Math.PI),!e.sweepFlag&&E>0&&(E-=2*Math.PI);const x=y+E/2,N={x:v+o*Math.cos(x),y:b+o*Math.sin(x)};return{length:c,midpoint:N}}function Ic(i){if(!i)return null;const t=i.getAttribute("d");if(!t)return null;const e=Dc(t);if(!e)return null;const n=.5,r=Math.pow(1-n,3)*e.x0+3*Math.pow(1-n,2)*n*e.px0+3*(1-n)*n*n*e.px1+n*n*n*e.x1,s=Math.pow(1-n,3)*e.y0+3*Math.pow(1-n,2)*n*e.py0+3*(1-n)*n*n*e.py1+n*n*n*e.y1;return{length:Math.hypot(r,s),midpoint:{x:r,y:s}}}function Lc(i){if(!i)return null;const t=Dn(i);return t.length!==9||t[0][0]!=="M"||t[2][0]!=="A"?null:{from:{x:parseFloat(t[0].slice(1)),y:parseFloat(t[1])},to:{x:parseFloat(t[7]),y:parseFloat(t[8])},rx:parseFloat(t[2].slice(1)),ry:parseFloat(t[3]),xAxisRotation:0,largeArcFlag:!1,sweepFlag:!0}}function Dc(i){if(!i)return null;const t=Dn(i);return t.length!==10||t[0][0]!=="M"||t[3][0]!=="C"?null:{x0:parseFloat(t[1]),y0:parseFloat(t[2]),x1:parseFloat(t[8]),y1:parseFloat(t[9]),px0:parseFloat(t[4]),py0:parseFloat(t[5]),px1:parseFloat(t[6]),py1:parseFloat(t[7])}}function Pc(i){if(!i)return null;const t=Dn(i);return t.length!==6||t[0]!=="M"||t[3]!=="L"?null:{x0:parseFloat(t[1]),y0:parseFloat(t[2]),x1:parseFloat(t[4]),y1:parseFloat(t[5])}}function Dn(i){const t=[];let e="",n=0,r=i.length-1;for(;n<=r&&(i[n]===" "||i[n]===` +`||i[n]===" "||i[n]===",");)n++;for(;r>=n&&(i[r]===" "||i[r]===` +`||i[r]===" "||i[r]===",");)r--;for(let s=n;s<=r;s++){const o=i[s];o===" "||o===","||o===` +`||o===" "?e&&(t.push(e),e=""):e+=o}return e&&t.push(e),t}function Rt(i,t){var n;if(t.nodeHeaderMap.title)return W(t.nodeHeaderMap.title,i)||"Could not resolve title";const e=(n=i.getData())==null?void 0:n.label;return typeof e=="string"?e:"Optional name or label"}function ur(i,t){var n;if(t.nodeHeaderMap.subtitle)return W(t.nodeHeaderMap.subtitle,i)||null;const e=(n=i.getData())==null?void 0:n.description;return typeof e=="string"?e:"Optional subtitle or description"}function pe(i,t){var n;if(t.edgeHeaderMap.title)return W(t.edgeHeaderMap.title,i)||"";const e=(n=i.getData())==null?void 0:n.label;return typeof e=="string"?e:"Optional name or label"}function dr(i,t){var n;if(t.edgeHeaderMap.subtitle)return W(t.edgeHeaderMap.subtitle,i)||null;const e=(n=i.getData())==null?void 0:n.label;return typeof e=="string"?e:"Optional subtitle or description"}function pr(i){var e;const t=(e=i.getData())==null?void 0:e.label;return typeof t=="string"?t:""}function Pn(i,t){const e=i.getData(),n=[];if(t.nodePropertiesMap)return ui(t.nodePropertiesMap,i);for(const[r,s]of Object.entries(e))r&&s&&n.push({name:r,value:s});return n}function Fn(i,t){const e=i.getData(),n=[];if(t.edgePropertiesMap)return ui(t.edgePropertiesMap,i);for(const[r,s]of Object.entries(e))r&&s&&n.push({name:r,value:s});return n}class Fc{constructor(t,e,n){f(this,"graph");f(this,"rendererOptions");f(this,"graphSvgRenderer");f(this,"renderLabelCB");var r;this.graphSvgRenderer=n,this.graph=e,this.rendererOptions=t,this.renderLabelCB=(r=this.rendererOptions)==null?void 0:r.renderLabel}render(t,e){this.defaultEdgeRender(t,e)}defaultEdgeRender(t,e){var s,o;const n=this.getEdgeStyle(e),r=this.getLabelStyle(e);if(this.graph.getOptions().isDirected||e.directed){const a=this.genericEdgeRender(t,n);this.drawEdgeMarker(a,n,e)}if(this.renderLabelCB){const a=t.append("g").classed("label-container",!0).append("foreignObject"),c=(s=this==null?void 0:this.renderLabelCB)==null?void 0:s.call(this,e);a.attr("width",200).attr("height",100),typeof c=="string"?a.text(c):c instanceof HTMLElement&&((o=a.node())==null||o.append(c)),requestAnimationFrame(()=>{const l=a.node();if(!l)return;const h=l.firstElementChild;if(!h)return;const u=h.getBoundingClientRect(),d=Math.ceil(u.width),p=Math.ceil(u.height);a.attr("width",d).attr("height",p),a.attr("x",-d/2).attr("y",-p/2),this.highlightSelection(t,e)})}else this.defaultLabelRender(t,e,r),this.highlightSelection(t,e)}getLabelStyle(t){var r,s,o,a;let e;const n=t.getLabelStyle();return n&&n.styleCb?e=n.styleCb(t):e={backgroundColor:(r=t.getLabelStyle())==null?void 0:r.backgroundColor,fontSize:(s=t.getLabelStyle())==null?void 0:s.fontSize,fontFamily:(o=t.getLabelStyle())==null?void 0:o.fontFamily,color:(a=t.getLabelStyle())==null?void 0:a.color},this.mergeLabelStylingOptions(e)}mergeLabelStylingOptions(t){return{backgroundColor:(t==null?void 0:t.backgroundColor)??this.rendererOptions.defaultLabelStyle.backgroundColor,fontSize:(t==null?void 0:t.fontSize)??this.rendererOptions.defaultLabelStyle.fontSize,fontFamily:(t==null?void 0:t.fontFamily)??this.rendererOptions.defaultLabelStyle.fontFamily,color:(t==null?void 0:t.color)??this.rendererOptions.defaultLabelStyle.color}}getEdgeStyle(t){var s;let e;const n=t.getEdgeStyle();n&&n.styleCb?e=n.styleCb(t):e={strokeColor:n==null?void 0:n.strokeColor,strokeWidth:n==null?void 0:n.strokeWidth,opacity:n==null?void 0:n.opacity,curveStyle:n==null?void 0:n.curveStyle,dashed:n==null?void 0:n.dashed,animateDash:n==null?void 0:n.animateDash,rotateLabel:n==null?void 0:n.rotateLabel,markerEnd:n==null?void 0:n.markerEnd,markerStart:n==null?void 0:n.markerStart};const r=this.mergeEdgeStylingOptions(e);if(r.strokeColor=r.strokeColor!==void 0?W(r.strokeColor,t)??"var(--pvt-edge-stroke, #999)":"var(--pvt-edge-stroke, #999)",r.strokeWidth=r.strokeWidth!==void 0?xe(r.strokeWidth,t)??2:2,r.opacity=r.opacity!==void 0?xe(r.opacity,t)??1:1,r.curveStyle=r.curveStyle!==void 0?W(r.curveStyle,t):"bidirectional",r.markerEnd=r.markerEnd!==void 0?W(r.markerEnd,t):void 0,r.markerStart=r.markerStart!==void 0?W(r.markerStart,t):void 0,r.dashed=r.dashed!==void 0?Et(r.dashed,t):void 0,r.animateDash=r.animateDash!==void 0?Et(r.animateDash,t):void 0,t.to.parentNode&&t.to.parentNode===t.from){r.curveStyle="straight";const a=(s=(t.getSubgraphFromNode()??t.from).getGraphElement())==null?void 0:s.querySelector(".node");a&&(r.strokeColor=getComputedStyle(a).fill,r.markerStart="bigcircle",r.markerEnd="arrow")}return r}mergeEdgeStylingOptions(t){return{strokeColor:(t==null?void 0:t.strokeColor)??this.rendererOptions.defaultEdgeStyle.strokeColor,strokeWidth:(t==null?void 0:t.strokeWidth)??this.rendererOptions.defaultEdgeStyle.strokeWidth,opacity:(t==null?void 0:t.opacity)??this.rendererOptions.defaultEdgeStyle.opacity,curveStyle:(t==null?void 0:t.curveStyle)??this.rendererOptions.defaultEdgeStyle.curveStyle,dashed:(t==null?void 0:t.dashed)??this.rendererOptions.defaultEdgeStyle.dashed,animateDash:(t==null?void 0:t.animateDash)??this.rendererOptions.defaultEdgeStyle.animateDash,rotateLabel:(t==null?void 0:t.rotateLabel)??this.rendererOptions.defaultEdgeStyle.rotateLabel,markerEnd:(t==null?void 0:t.markerEnd)??this.rendererOptions.defaultEdgeStyle.markerEnd,markerStart:(t==null?void 0:t.markerStart)??this.rendererOptions.defaultEdgeStyle.markerStart}}genericEdgeRender(t,e){const n=t.append("path").attr("stroke",e.strokeColor??"var(--pvt-edge-stroke)").attr("stroke-width",e.strokeWidth??"var(--pvt-edge-stroke-width)").attr("stroke-opacity",e.opacity);return e.dashed&&(n.classed("dashed",!0),e.animateDash&&n.classed("animated",!0)),n}drawEdgeMarker(t,e,n){if(!this.rendererOptions.markerStyleMap)return;const r=e.markerEnd,s=e.markerStart;r&&this.rendererOptions.markerStyleMap[r]&&t.attr("marker-end",`url(#${r})`),s&&this.rendererOptions.markerStyleMap[s]&&t.attr("marker-start",`url(#${s})`)}updatePositions(t){const e=t.selectAll("path"),n=t.selectAll("g.label-container");e.attr("d",r=>this.linkPathRouter(r)),n.attr("transform",(r,s,o)=>{const{from:a,to:c}=r,l=this.getEdgeStyle(r),h=o[s].parentNode;let u=null;h&&h instanceof Element&&(u=Q(h).select("path").node());let d,p,m={x:0,y:0},v=0;if(a===c){const b=u?Ic(u):void 0,{length:y=0,midpoint:_={x:0,y:0}}=b??{};v=y,m=_}else if(l.curveStyle==="straight"){const b=u?Ac(u):void 0,{length:y=0,midpoint:_={x:0,y:0}}=b??{};v=y,m=_}else{const b=u?Tc(u):void 0,{length:y=0,midpoint:_={x:0,y:0}}=b??{};v=y,m=_}if(u&&v>0)d=m.x,p=m.y,a===c&&(d+=12,p-=4);else{const b=r.source.x??0,y=r.source.y??0,_=r.target.x??0,E=r.target.y??0;d=(b+_)/2,p=(y+E)/2}if(d=isFinite(d)?d:0,p=isFinite(p)?p:0,l.rotateLabel){const b=(r.target.x??0)-(r.source.x??0),y=(r.target.y??0)-(r.source.y??0),_=Math.atan2(y,b)*180/Math.PI,E=_>90||_<-90?_+180:_;return`translate(${d}, ${p}) rotate(${E})`}else return`translate(${d}, ${p})`})}linkPathRouter(t){const{from:e,to:n}=t;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;if(e===n)return this.linkSelfLoop(t);const r=n.getConnectedNodes(),s=this.getEdgeStyle(t);return s.curveStyle==="straight"?this.linkStraight(t):s.curveStyle==="curved"?this.linkArc(t):r.filter(o=>o.id===e.id).length>0?(t.updateStyle({edge:{curveStyle:"curved"}}),this.linkArc(t)):(t.updateStyle({edge:{curveStyle:"straight"}}),this.linkStraight(t))}linkSelfLoop(t){var P;const{from:e,to:n}=t,r=((P=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:P.edge.id)===t.id;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;const s=4+(r?2:0),o=4+(r?2:0),a=e.x??0,c=e.y??0,l=e.getCircleRadius()?e.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(e).size,h=l+16*Math.log(l+1),u=Math.max(10,110/Math.sqrt(l)),d=45,p=(d+u)*Math.PI/180,m=a+h*Math.cos(p),v=c-h*Math.sin(p),b=(d-u)*Math.PI/180,y=a+h*Math.cos(b),_=c-h*Math.sin(b),E=a+(l+s)*Math.cos(p),x=c-(l+s)*Math.sin(p),N=a+(l+o)*Math.cos(b),D=c-(l+o)*Math.sin(b);return`M ${E} ${x} C ${m} ${v}, ${y} ${_}, ${N} ${D}`}linkStraight(t){var N;const{from:e,to:n}=t,r=((N=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:N.edge.id)===t.id;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;const s=this.graphSvgRenderer.edgeDrawer.getEdgeStyle(t),o=4+(s.markerStart!==void 0,0)+0,a=4+(s.markerEnd!==void 0?2:0)+2;let c=n.x-e.x,l=n.y-e.y,h=Math.sqrt(c*c+l*l),u=c/h,d=l/h;const p=e.getCircleRadius()?e.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(e).size,m=t.getSubgraphToNode()??t.to,v=m.getCircleRadius()?m.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(m).size;h===0&&(u=-Math.SQRT1_2,d=-Math.SQRT1_2,c=u*p,l=d*p,h=p);const b=h<=p;let y,_,E,x;return b?(y=e.x+p*u,_=e.y+p*d,E=n.x+(v+a)*u,x=n.y+(v+a)*d):(y=e.x+(p+o)*u,_=e.y+(p+o)*d,E=n.x-(v+a)*u,x=n.y-(v+a)*d),`M ${y},${_} L ${E},${x}`}linkArc(t){var b;const{from:e,to:n}=t,r=((b=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:b.edge.id)===t.id;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;const s=Math.hypot(n.x-e.x,n.y-e.y),o=this.graphSvgRenderer.edgeDrawer.getEdgeStyle(t),a=4+(o.markerStart!==void 0,0)+(r?2:0),c=4+(o.markerStart!==void 0?2:0)+(r?2:0),l=t.source.getCircleRadius()?t.source.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(e).size,h=t.target.getCircleRadius()?t.target.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(n).size,u={from:{x:e.x,y:e.y},to:{x:n.x,y:n.y},rx:s,ry:s,xAxisRotation:0},d={cx:e.x,cy:e.y,r:l+a},p={cx:n.x,cy:n.y,r:h+c},m=hr(u,d),v=hr(u,p);return m&&v?`M${m.x},${m.y} A${s},${s} 0 0,1 ${v.x},${v.y}`:""}defaultLabelRender(t,e,n){var c;const r=t.append("g").classed("label-container",!0),s=pr(e);if(!s||s==="")return;const a=(c=r.append("text").text(s).attr("text-anchor","middle").attr("alignment-baseline","middle").style("font-size",n.fontSize).style("font-family",n.fontFamily).style("pointer-events","none").style("fill",n.color).node())==null?void 0:c.getBBox();a&&r.insert("rect","text").attr("x",a.x-4).attr("y",a.y-2).attr("width",a.width+8).attr("height",a.height+4).attr("fill",n.backgroundColor).attr("rx",2).attr("ry",2)}renderDefinitions(){this.renderMarkers()}renderMarkers(){if(this.rendererOptions.markerStyleMap)for(const t in this.rendererOptions.markerStyleMap)this.renderMarker(this.rendererOptions.markerStyleMap[t],t)}renderMarker(t,e){var a,c,l,h,u,d,p,m,v;const n=this.graphSvgRenderer.defs;if(!n.select(`#${e}`).empty())return;n.append("marker").attr("id",e).attr("viewBox",t.viewBox).attr("refX",t.refX).attr("refY",t.refY).attr("markerWidth",t.markerWidth).attr("markerHeight",t.markerHeight).attr("markerUnits",t.markerUnits||"userSpaceOnUse").attr("orient",t.orient??"auto").append("path").attr("d",t.pathD).attr("fill",t.fill??"context-stroke");const s=e+"_selected";if(!n.select(`#${s}`).empty())return;n.append("marker").attr("id",s).attr("viewBox",((a=t.selected)==null?void 0:a.viewBox)??t.viewBox).attr("refX",((c=t.selected)==null?void 0:c.refX)??t.refX).attr("refY",((l=t.selected)==null?void 0:l.refY)??t.refY).attr("markerWidth",((h=t.selected)==null?void 0:h.markerWidth)??t.markerWidth).attr("markerHeight",((u=t.selected)==null?void 0:u.markerHeight)??t.markerHeight).attr("markerUnits",(((d=t.selected)==null?void 0:d.markerUnits)??t.markerUnits)||"userSpaceOnUse").attr("orient",((p=t.selected)==null?void 0:p.orient)??t.orient??"auto").append("path").attr("d",((m=t.selected)==null?void 0:m.pathD)??t.pathD).attr("fill",((v=t.selected)==null?void 0:v.fill)??t.fill??"context-stroke")}highlightSelection(t,e){var n,r,s;if(t.classed("selected",!1),((n=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:n.edge.id)===e.id){t.classed("selected",!0);const o=t.selectAll("path"),a=(r=o.attr("marker-start"))==null?void 0:r.match(/#.*(?=\))/);a&&o.attr("marker-start",`url(${a[0]}_selected)`);const c=(s=o.attr("marker-end"))==null?void 0:s.match(/#.*(?=\))/);c&&o.attr("marker-end",`url(${c[0]}_selected)`)}}}class zc{constructor(t){f(this,"graph");f(this,"renderer");f(this,"graphInteraction");this.graph=t}init(t,e){this.renderer=t,this.graphInteraction=e,this.registerListeners()}update(){this.registerListeners()}registerListeners(){this.renderer.getOptions().dragEnabled&&this.renderer.getNodeSelection().call(this.graph.simulation.createDragBehavior()),this.renderer.getOptions().interactionEnabled&&(this.renderer.getNodeSelection().on("dblclick.node",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeDbclick(n,t,e)}).on("click.node",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeClick(n,t,e)}).on("contextmenu.node",(t,e)=>{var r;t.preventDefault(),t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeContextmenu(n,t,e)}).on("mouseenter.node",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeHoverIn(n,t,e)}).on("mouseleave.node",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeHoverOut(n,t,e)}).on("dragging.node",(t,e)=>{var n;(n=this.graphInteraction)==null||n.dragging(t,e)}),this.renderer.getEdgeSelection().on("dblclick.edge",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeDbclick(n,t,e)}).on("click.edge",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeClick(n,t,e)}).on("contextmenu.edge",(t,e)=>{var r;t.preventDefault(),t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeContextmenu(n,t,e)}).on("mouseenter.edge",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeHoverIn(n,t,e)}).on("mouseleave.edge",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeHoverOut(n,t,e)}),this.renderer.getCanvasSelection().on("click.canvas",t=>{var e;(e=this.graphInteraction)==null||e.canvasClick(t)}).on("contextmenu.canvas",t=>{var e;t.preventDefault(),(e=this.graphInteraction)==null||e.canvasContextmenu(t)}).on("mousemove.canvas",t=>{var e;(e=this.graphInteraction)==null||e.canvasMousemove(t)}))}}var Ue=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Oc(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var fe={exports:{}};fe.exports;var fr;function Bc(){return fr||(fr=1,(function(i,t){var e=200,n="__lodash_hash_undefined__",r=800,s=16,o=9007199254740991,a="[object Arguments]",c="[object Array]",l="[object AsyncFunction]",h="[object Boolean]",u="[object Date]",d="[object Error]",p="[object Function]",m="[object GeneratorFunction]",v="[object Map]",b="[object Number]",y="[object Null]",_="[object Object]",E="[object Proxy]",x="[object RegExp]",N="[object Set]",D="[object String]",P="[object Undefined]",B="[object WeakMap]",j="[object ArrayBuffer]",H="[object DataView]",V="[object Float32Array]",it="[object Float64Array]",rt="[object Int8Array]",S="[object Int16Array]",T="[object Int32Array]",k="[object Uint8Array]",A="[object Uint8ClampedArray]",F="[object Uint16Array]",z="[object Uint32Array]",O=/[\\^$.*+?()[\]{}|]/g,q=/^\[object .+?Constructor\]$/,Y=/^(?:0|[1-9]\d*)$/,R={};R[V]=R[it]=R[rt]=R[S]=R[T]=R[k]=R[A]=R[F]=R[z]=!0,R[a]=R[c]=R[j]=R[h]=R[H]=R[u]=R[d]=R[p]=R[v]=R[b]=R[_]=R[x]=R[N]=R[D]=R[B]=!1;var tt=typeof Ue=="object"&&Ue&&Ue.Object===Object&&Ue,vt=typeof self=="object"&&self&&self.Object===Object&&self,lt=tt||vt||Function("return this")(),gt=t&&!t.nodeType&&t,ct=gt&&!0&&i&&!i.nodeType&&i,Qt=ct&&ct.exports===gt,Jn=Qt&&tt.process,Gr=(function(){try{var g=ct&&ct.require&&ct.require("util").types;return g||Jn&&Jn.binding&&Jn.binding("util")}catch{}})(),$r=Gr&&Gr.isTypedArray;function Ru(g,w,M){switch(M.length){case 0:return g.call(w);case 1:return g.call(w,M[0]);case 2:return g.call(w,M[0],M[1]);case 3:return g.call(w,M[0],M[1],M[2])}return g.apply(w,M)}function Hu(g,w){for(var M=-1,L=Array(g);++M-1}function ld(g,w){var M=this.__data__,L=sn(M,g);return L<0?(++this.size,M.push([g,w])):M[L][1]=w,this}It.prototype.clear=rd,It.prototype.delete=sd,It.prototype.get=od,It.prototype.has=ad,It.prototype.set=ld;function Jt(g){var w=-1,M=g==null?0:g.length;for(this.clear();++w1?M[G-1]:void 0,Z=G>2?M[2]:void 0;for(U=g.length>3&&typeof U=="function"?(G--,U):void 0,Z&&Od(M[0],M[1],Z)&&(U=G<3?void 0:U,G=1),w=Object(w);++L-1&&g%1==0&&g0){if(++w>=r)return arguments[0]}else w=0;return g.apply(void 0,arguments)}}function Ud(g){if(g!=null){try{return en.call(g)}catch{}try{return g+""}catch{}}return""}function ln(g,w){return g===w||g!==g&&w!==w}var si=Kr((function(){return arguments})())?Kr:function(g){return be(g)&&Ft.call(g,"callee")&&!Xu.call(g,"callee")},oi=Array.isArray;function ai(g){return g!=null&&ns(g.length)&&!li(g)}function Vd(g){return be(g)&&ai(g)}var es=Zu||Kd;function li(g){if(!qt(g))return!1;var w=on(g);return w==p||w==m||w==l||w==E}function ns(g){return typeof g=="number"&&g>-1&&g%1==0&&g<=o}function qt(g){var w=typeof g;return g!=null&&(w=="object"||w=="function")}function be(g){return g!=null&&typeof g=="object"}function Wd(g){if(!be(g)||on(g)!=_)return!1;var w=Wr(g);if(w===null)return!0;var M=Ft.call(w,"constructor")&&w.constructor;return typeof M=="function"&&M instanceof M&&en.call(M)==Vu}var is=$r?Gu($r):_d;function Xd(g){return Ld(g,rs(g))}function rs(g){return ai(g)?bd(g):Md(g)}var Yd=Dd(function(g,w,M){Qr(g,w,M)});function Zd(g){return function(){return g}}function ss(g){return g}function Kd(){return!1}i.exports=Yd})(fe,fe.exports)),fe.exports}var Rc=Bc();const Yt=Oc(Rc);class Hc{constructor(t){f(this,"graph");f(this,"callbacks");f(this,"listeners");f(this,"selectedNode",null);f(this,"selectedEdge",null);f(this,"selectedNodes",[]);f(this,"selectedEdges",[]);f(this,"nodeHoverIn",(t,e,n)=>{this.emit("nodeHoverIn",e,n,t),this.callbacks.onNodeHoverIn&&typeof this.callbacks.onNodeHoverIn=="function"&&this.callbacks.onNodeHoverIn(e,n,t)});f(this,"nodeHoverOut",(t,e,n)=>{this.emit("nodeHoverOut",e,n,t),this.callbacks.onNodeHoverOut&&typeof this.callbacks.onNodeHoverOut=="function"&&this.callbacks.onNodeHoverOut(e,n,t)});f(this,"dragging",(t,e)=>{this.emit("dragging",t,e),this.callbacks.onNodeDragging&&typeof this.callbacks.onNodeDragging=="function"&&this.callbacks.onNodeDragging(t,e)});f(this,"dragended",(t,e)=>{this.emit("dragended",t,e),this.callbacks.onNodeDragended&&typeof this.callbacks.onNodeDragended=="function"&&this.callbacks.onNodeDragended(t,e)});this.graph=t,this.callbacks=this.graph.getCallbacks()??{},this.listeners={nodeClick:[],nodeDbclick:[],nodeHoverIn:[],nodeHoverOut:[],nodeSelect:[],nodeBlur:[],dragging:[],dragended:[],nodeContextmenu:[],edgeClick:[],edgeDbclick:[],edgeHoverIn:[],edgeHoverOut:[],edgeSelect:[],edgeBlur:[],edgeContextmenu:[],canvasClick:[],canvasMousemove:[],canvasContextmenu:[],canvasZoom:[],simulationTick:[],simulationSlowTick:[],selectNode:[],unselectNode:[],selectEdge:[],unselectEdge:[],selectNodes:[],unselectNodes:[],selectEdges:[],unselectEdges:[]},this.graph.UIManager.keyManager.register({key:"Enter",callback:()=>{this.expandNodeSelection()}})}on(t,e){this.listeners[t].push(e)}off(t,e){this.listeners[t]=this.listeners[t].filter(n=>n!==e)}getGraph(){return this.graph}emit(t,...e){for(const n of this.listeners[t])n(...e)}nodeClick(t,e,n){var r;e.shiftKey?this.addNodesToSelection([{node:n,element:t}]):e.altKey?this.selectNodes([{node:n,element:t}]):e.ctrlKey?this.removeNodesFromSelection([{node:n,element:t}]):((r=this.getSelectedNode())==null?void 0:r.node)!==n&&(t.classList.contains("pvt-node-expanded"),this.selectNode(t,n)),this.emit("nodeClick",e,n,t),this.callbacks.onNodeClick&&typeof this.callbacks.onNodeClick=="function"&&this.callbacks.onNodeClick(e,n,t)}nodeDbclick(t,e,n){this.emit("nodeDbclick",e,n,t),this.callbacks.onNodeDbclick&&typeof this.callbacks.onNodeDbclick=="function"&&this.callbacks.onNodeDbclick(e,n,t)}nodeContextmenu(t,e,n){this.emit("nodeContextmenu",e,n,t),this.callbacks.onNodeContextmenu&&typeof this.callbacks.onNodeContextmenu=="function"&&this.callbacks.onNodeContextmenu(e,n,t)}edgeClick(t,e,n){this.selectEdge(t,n),this.emit("edgeClick",e,n,t),this.callbacks.onEdgeClick&&typeof this.callbacks.onEdgeClick=="function"&&this.callbacks.onEdgeClick(e,n,t)}edgeDbclick(t,e,n){this.emit("edgeDbclick",e,n,t),this.callbacks.onEdgeDbclick&&typeof this.callbacks.onEdgeDbclick=="function"&&this.callbacks.onEdgeDbclick(e,n,t)}edgeContextmenu(t,e,n){this.emit("edgeContextmenu",e,n,t),this.callbacks.onEdgeContextmenu&&typeof this.callbacks.onEdgeContextmenu=="function"&&this.callbacks.onEdgeContextmenu(e,n,t)}edgeHoverIn(t,e,n){this.emit("edgeHoverIn",e,n,t),this.callbacks.onEdgeHoverIn&&typeof this.callbacks.onEdgeHoverIn=="function"&&this.callbacks.onEdgeHoverIn(e,n,t)}edgeHoverOut(t,e,n){this.emit("edgeHoverOut",e,n,t),this.callbacks.onEdgeHoverOut&&typeof this.callbacks.onNodeHoverOut=="function"&&this.callbacks.onEdgeHoverOut(e,n,t)}canvasClick(t){this.unselectAll(),this.emit("canvasClick",t),this.callbacks.onCanvasClick&&typeof this.callbacks.onCanvasClick=="function"&&this.callbacks.onCanvasClick(t)}canvasZoom(t){this.emit("canvasZoom",t),this.callbacks.onCanvasZoom&&typeof this.callbacks.onCanvasZoom=="function"&&this.callbacks.onCanvasZoom(t)}canvasContextmenu(t){this.emit("canvasContextmenu",t),this.callbacks.onCanvasContextmenu&&typeof this.callbacks.onCanvasContextmenu=="function"&&this.callbacks.onCanvasContextmenu(t)}canvasMousemove(t){this.emit("canvasMousemove",t),this.callbacks.onCanvasMousemove&&typeof this.callbacks.onCanvasMousemove=="function"&&this.callbacks.onCanvasMousemove(t)}simulationTick(){this.emit("simulationTick"),this.callbacks.onSimulationTick&&typeof this.callbacks.onSimulationTick=="function"&&this.callbacks.onSimulationTick()}simulationSlowTick(){this.emit("simulationSlowTick"),this.callbacks.onSimulationSlowTick&&typeof this.callbacks.onSimulationSlowTick=="function"&&this.callbacks.onSimulationSlowTick()}selectNode(t,e){this.unselectAll(),this.selectedNode={node:e,element:t},this.selectedNodes=[this.selectedNode],this.emit("selectNode",e,t),this.callbacks.onNodeSelect&&typeof this.callbacks.onNodeSelect=="function"&&this.callbacks.onNodeSelect(e,t),this.refreshRendering()}unselectNode(){if(this.selectedNode===null)return;const t=this.selectedNode.node,e=this.selectedNode.element;this.selectedNode=null,this.selectedNodes=[],this.emit("unselectNode",t,e),this.callbacks.onNodeBlur&&typeof this.callbacks.onNodeBlur=="function"&&this.callbacks.onNodeBlur(t,e),this.unselectFromDirectSubgraph(t),this.refreshRendering()}unselectFromAncestorSubgraphs(t){var a,c;const e=this.buildAncestorStack(t);let n=this.findOutermostSubgraph(e);if(!n)return;let r;for(;e.length>0&&n;){const l=e.pop();r=n,l&&(n=(a=n.getMutableNode(l.id))==null?void 0:a.getSubgraph())}if(!r)return;const s=r.renderer.getGraphInteraction();((c=s.getSelectedNode())==null?void 0:c.node.id)===t.id&&s.unselectNode()}unselectFromDirectSubgraph(t){var n,r;const e=(n=t.parentNode)==null?void 0:n.getSubgraph();if(e){const s=e.renderer.getGraphInteraction();((r=s.getSelectedNode())==null?void 0:r.node.id)===t.id&&s.unselectNode()}this.refreshRendering()}buildAncestorStack(t){const e=[];let n=t.parentNode;for(;n;)e.push(n),n=n.parentNode;return e}findOutermostSubgraph(t){var e;for(let n=t.length-1;n>=0;n--){const r=(e=t[n])==null?void 0:e.getSubgraph();if(r)return r}}selectNodes(t){if(t.length===1)return this.selectNode(t[0].element,t[0].node);this.unselectAll(),this.selectedNodes=t,this.emit("selectNodes",this.selectedNodes),this.callbacks.onNodesSelect&&typeof this.callbacks.onNodesSelect=="function"&&this.callbacks.onNodesSelect(t),this.refreshRendering()}addNodesToSelection(t){if(t.length==0)return;if(this.selectedNodes.length===0&&t.length===1)return this.selectNode(t[0].element,t[0].node);const e=this.getSelectedNodeIDs()??[];t=t.filter(n=>!e.includes(n.node.id)),this.selectedNodes=this.selectedNodes.concat(t),this.callbacks.onNodesSelect&&typeof this.callbacks.onNodesSelect=="function"&&this.callbacks.onNodesSelect(t),this.emit("selectNodes",t),this.refreshRendering()}removeNodesFromSelection(t){const e=t.map(n=>n.node.id);this.selectedNodes=this.selectedNodes.filter(n=>!e.includes(n.node.id)),t.forEach(({node:n,element:r})=>{this.callbacks.onNodeBlur&&typeof this.callbacks.onNodeBlur=="function"&&this.callbacks.onNodeBlur(n,r)}),this.emit("unselectNodes",t),this.refreshRendering()}selectEdge(t,e){this.unselectAll(),this.selectedEdge={edge:e,element:t},this.emit("selectEdge",e,t),this.callbacks.onEdgeSelect&&typeof this.callbacks.onEdgeSelect=="function"&&this.callbacks.onEdgeSelect(e,t),this.refreshRendering()}selectEdges(t){this.unselectAll(),this.selectedEdges=t.map(e=>({edge:e[0],element:e[1]})),this.emit("selectEdges",this.selectedEdges),this.selectedEdges.forEach(({edge:e,element:n})=>{this.callbacks.onEdgeSelect&&typeof this.callbacks.onEdgeSelect=="function"&&this.callbacks.onEdgeSelect(e,n)}),this.refreshRendering()}unselectEdge(){if(this.selectedEdge===null)return;const t=this.selectedEdge.edge,e=this.selectedEdge.element;this.selectedEdge=null,this.emit("unselectEdge",t,e),this.callbacks.onEdgeBlur&&typeof this.callbacks.onEdgeBlur=="function"&&this.callbacks.onEdgeBlur(t,e),this.refreshRendering()}unselectAll(){this.unselectNode(),this.unselectEdge(),this.clearNodeSelectionList(),this.clearEdgeSelectionList(),this.refreshRendering()}clearNodeSelectionList(){this.selectedNodes.forEach(({node:t,element:e})=>{this.callbacks.onNodeBlur&&typeof this.callbacks.onNodeBlur=="function"&&this.callbacks.onNodeBlur(t,e)}),this.selectedNodes=[],this.emit("unselectNodes",this.selectedNodes)}clearEdgeSelectionList(){this.emit("unselectEdges",this.selectedEdges),this.selectedEdges.forEach(({edge:t,element:e})=>{this.callbacks.onEdgeBlur&&typeof this.callbacks.onEdgeBlur=="function"&&this.callbacks.onEdgeBlur(t,e)}),this.selectedEdges=[]}hasActiveMultiselection(){return this.selectedNodes.length>1||this.selectedEdges.length>1}refreshRendering(){this.graph.renderer.update(!1),this.graph.renderer.nextTick()}getSelectedNode(){return this.selectedNode}getSelectedEdge(){return this.selectedEdge}getSelectedNodeIDs(){var t;return((t=this.selectedNodes)==null?void 0:t.map(e=>e.node.id))??null}getSelectedNodes(){return this.selectedNodes}getSelectedEdgeIDs(){var t;return((t=this.selectedEdges)==null?void 0:t.map(e=>e.edge.id))??null}getSelectedEdges(){return this.selectedEdges}expandNodeSelection(){this.selectedNodes.length>1?this.graph.toggleExpandNodes(this.selectedNodes.map(t=>t.node)):this.selectedNode&&this.graph.toggleExpandNode(this.selectedNode.node)}}class Gc{constructor(t,e,n){f(this,"graph");f(this,"container");f(this,"options");f(this,"layoutProgress",0);f(this,"layoutProgressType","done");f(this,"progressBar",null);f(this,"timerLabel",null);f(this,"textLabel",null);f(this,"loadingPb",null);this.graph=t,this.container=e,this.options=n}getCanvas(){return this.container.querySelector(".pvt-canvas")}updateLayoutProgress(t,e,n){this.layoutProgress=t,this.layoutProgressType=n,!(!this.progressBar||!this.timerLabel||!this.textLabel)&&(this.progressBar.style.width=`${t*100}%`,this.timerLabel.textContent=`Elapsed time: ${(e/1e3).toFixed(1)} sec`,this.layoutProgressType==="simulation"?this.textLabel.textContent="Optimizing node positions...":this.layoutProgressType==="rendering"?(this.progressBar.style.width="100%",this.textLabel.textContent="Rendering in progress"):this.layoutProgressType==="done"&&(this.progressBar.style.width="100%",this.timerLabel.textContent="All done"),this.toggleLayoutProgressVisibility())}toggleLayoutProgressVisibility(){const t=this.getZoomGroup();t&&t.classList.toggle("hidden",this.layoutProgressType!=="done"),this.loadingPb&&this.loadingPb.classList.toggle("hidden",this.layoutProgressType==="done")}setupRendering(){this.createHtmlProgressBar()}createHtmlProgressBar(){const t=this.getCanvas();if(!t)throw new Error("Canvas element is not defined in the graph renderer.");const e=document.createElement("div");e.classList.add("pvt-loading-progress-bar"),e.style.position="absolute",e.style.left="50%",e.style.top="50%",e.style.transform="translate(-50%, -50%)";const n=document.createElement("div");n.classList.add("background"),n.style.width="100%";const r=document.createElement("div");r.classList.add("track"),n.style.width="100%";const s=document.createElement("div");s.classList.add("fill"),s.style.width="0px";const o=document.createElement("span");o.classList.add("label"),o.textContent="Optimizing node positions...";const a=document.createElement("span");a.classList.add("label"),a.textContent="Elapsed time: 0 sec",r.appendChild(s),n.appendChild(r),e.append(n,o,a),t.appendChild(e),this.progressBar=s,this.timerLabel=a,this.textLabel=o,this.loadingPb=e}}class $c{}class qc extends $c{constructor(e,n,r){super();f(this,"renderer");f(this,"svg");f(this,"selectionBoxGroup");f(this,"rect",null);f(this,"startX",0);f(this,"startY",0);f(this,"isSelecting",!1);f(this,"selectionMode","start");f(this,"onSvgMouseLeave",()=>{this.isSelecting&&this.onMouseUp()});f(this,"onMouseDown",e=>{if(!this.selectionBoxGroup)return;if(e.shiftKey)this.selectionMode="add";else if(e.altKey)this.selectionMode="start";else if(e.ctrlKey)this.selectionMode="remove";else{this.selectionMode="start";return}e.preventDefault(),this.svg.querySelectorAll(".pvt-selection-rectangle").forEach(s=>s.remove()),this.isSelecting=!0;const{x:n,y:r}=this.getSvgPoint(e);this.startX=n,this.startY=r,this.rect=document.createElementNS("http://www.w3.org/2000/svg","rect"),this.rect.setAttribute("x",n.toString()),this.rect.setAttribute("y",r.toString()),this.rect.setAttribute("width","0"),this.rect.setAttribute("height","0"),this.rect.setAttribute("class","pvt-selection-rectangle"),this.selectionBoxGroup.appendChild(this.rect),this.svg.addEventListener("mouseleave",this.onSvgMouseLeave)});f(this,"onMouseMove",e=>{if(!this.isSelecting||!this.rect)return;const{x:n,y:r}=this.getSvgPoint(e),s=Math.min(this.startX,n),o=Math.min(this.startY,r),a=Math.abs(n-this.startX),c=Math.abs(r-this.startY);this.rect.setAttribute("x",s.toString()),this.rect.setAttribute("y",o.toString()),this.rect.setAttribute("width",a.toString()),this.rect.setAttribute("height",c.toString())});f(this,"onMouseUp",()=>{if(!this.selectionBoxGroup||!this.isSelecting||!this.rect)return;this.isSelecting=!1;const e=this.rect.getBoundingClientRect(),n=this.getNodesInRect(e).map(r=>({node:r[0],element:r[1]}));this.selectionMode=="start"?this.renderer.getGraphInteraction().selectNodes(n):this.selectionMode=="add"?this.renderer.getGraphInteraction().addNodesToSelection(n):this.selectionMode=="remove"&&this.renderer.getGraphInteraction().removeNodesFromSelection(n),this.selectionBoxGroup.removeChild(this.rect),this.rect=null,this.svg.removeEventListener("mouseleave",this.onSvgMouseLeave)});this.renderer=e,this.svg=n,this.selectionBoxGroup=r,this.init()}selectionInProgress(){return this.isSelecting}init(){this.svg.addEventListener("mousedown",this.onMouseDown),this.svg.addEventListener("mousemove",this.onMouseMove),this.svg.addEventListener("mouseup",this.onMouseUp)}getSvgPoint(e){var r;const n=this.svg.createSVGPoint();return n.x=e.clientX,n.y=e.clientY,n.matrixTransform((r=this.svg.getScreenCTM())==null?void 0:r.inverse())}getNodesInRect(e){const n=this.renderer.getGraphInteraction().getGraph().getMutableNodes(),r=[];return n.forEach(s=>{if(!s.x||!s.y)return;const o=s.getGraphElement();if(!o||!(o instanceof SVGGElement))return;const a=o.getBoundingClientRect();a.xe.x&&a.ye.y&&r.push([s,o])}),r}}Q.prototype.transition=En;const jc={arrow:{pathD:"M0,-5L10,0L0,5",viewBox:"0 -5 10 10",refX:6,refY:0,markerWidth:12,markerHeight:12,markerUnits:"userSpaceOnUse",orient:"auto",selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)"}},circle:{pathD:"M5,5m-3,0a3,3 0 1,0 6,0a3,3 0 1,0 -6,0",viewBox:"0 0 10 10",refX:5,refY:5,markerWidth:10,markerHeight:10,markerUnits:"userSpaceOnUse",orient:0,selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)",markerWidth:16,markerHeight:16}},diamond:{pathD:"M0,-4L4,0L0,4L-4,0Z",viewBox:"-5 -5 10 10",refX:0,refY:0,markerWidth:8,markerHeight:8,markerUnits:"userSpaceOnUse",orient:0,selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)",markerWidth:14,markerHeight:14}},bigcircle:{pathD:"M5,5m-3,0a3,3 0 1,0 6,0a3,3 0 1,0 -6,0",viewBox:"0 0 10 10",refX:5,refY:5,markerWidth:16,markerHeight:16,markerUnits:"userSpaceOnUse",orient:0,selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)",markerWidth:24,markerHeight:24}}},Uc={shape:"circle",size:10,strokeWidth:"var(--pvt-node-stroke-width, 2)",color:"var(--pvt-node-color, #007acc)",strokeColor:"var(--pvt-node-stroke, #fff)",fontFamily:"var(--pvt-label-font, system-ui, sans-serif)",textColor:"var(--pvt-node-text-color, #fff)",textVerticalShift:0,iconUnicode:void 0,iconClass:void 0,svgIcon:void 0,imagePath:void 0,text:void 0,html:void 0},Vc={strokeWidth:2,opacity:1,curveStyle:"bidirectional",dashed:!1,animateDash:!0,rotateLabel:!1,markerEnd:"arrow",markerStart:void 0,strokeColor:"var(--pvt-edge-stroke, #999)"},gr={fontSize:12,fontFamily:"var(--pvt-label-font, system-ui, sans-serif)",color:"var(--pvt-edge-label-color, #333)",backgroundColor:"var(--pvt-edge-label-bg, #ffffffa0)"},Wc={type:"svg",enableFocusMode:!0,enableNodeExpansion:!0,beforeRender:()=>{},zoomEnabled:!0,dragEnabled:!0,interactionEnabled:!0,minZoom:.05,maxZoom:10,zoomAnimation:!0,zoomAnimationDuration:300,defaultNodeStyle:Uc,defaultEdgeStyle:Vc,defaultLabelStyle:gr,markerStyleMap:jc,selectionBox:{enabled:!0}};class Xc extends Gc{constructor(e,n,r,s){super(e,n,s);f(this,"options");f(this,"zoom");f(this,"eventHandler");f(this,"selectionBox",null);f(this,"graphInteraction");f(this,"nodeDrawer");f(this,"edgeDrawer");f(this,"svgCanvas");f(this,"svg");f(this,"zoomGroup");f(this,"edgeGroup");f(this,"nodeGroup");f(this,"selectionBoxGroup");f(this,"defs");f(this,"nodeGroupSelection");f(this,"edgeGroupSelection");f(this,"nodeSelection");f(this,"edgeSelection");this.options=Yt({},Wc,s),this.graphInteraction=r,this.eventHandler=new zc(this.graph),this.nodeDrawer=new je(this.options,this.graph,this),this.edgeDrawer=new Fc(this.options,this.graph,this),this.svgCanvas=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svgCanvas.setAttribute("width","100%"),this.svgCanvas.setAttribute("height","100%"),this.svgCanvas.setAttribute("fill","none"),this.svgCanvas.setAttribute("class","pvt-canvas-element"),this.svgCanvas.setAttribute("data-renderer-drag-enabled",this.options.dragEnabled?"1":"0"),this.getCanvas().appendChild(this.svgCanvas),this.svg=Q(this.svgCanvas),this.zoomGroup=this.svg.append("g").attr("class","zoom-layer hidden"),this.edgeGroup=this.zoomGroup.append("g").attr("class","edges"),this.selectionBoxGroup=this.svg.append("g").attr("class","selection-box"),this.nodeGroup=this.zoomGroup.append("g").attr("class","nodes"),this.defs=this.svg.append("defs"),this.edgeDrawer.renderDefinitions(),this.zoom=Ul(),this.zoom=this.zoom.filter(a=>{if(!this.options.zoomEnabled||a.ctrlKey||a.shiftKey||a.altKey)return!1;const c=a.target;return!(c.tagName==="INPUT"||c.tagName==="SELECT"||c.tagName==="TEXTAREA")}).scaleExtent([this.options.minZoom,this.options.maxZoom]).on("zoom",a=>{this.zoomGroup.attr("transform",a.transform),this.graphInteraction.canvasZoom(a)}),this.svg.call(this.zoom),this.svg.on("dblclick.zoom",null),this.options.selectionBox.enabled&&(this.selectionBox=new qc(this,this.svgCanvas,this.selectionBoxGroup.node())),new IntersectionObserver(a=>{a.forEach(c=>{c.isIntersecting&&this.nodeSelection.each((l,h,u)=>{if(l.getCircleRadius()!==25)return;const d=u[h].querySelector(".node").getBBox();l.setCircleRadius(.5*Math.max(d.width,d.height))})})},{threshold:0}).observe(this.svgCanvas)}setupRendering(){this.createHtmlProgressBar()}getZoomBehavior(){return this.zoom}getSelectionBox(){return this.selectionBox}getOptions(){return this.options}init(){this.options.beforeRender&&this.options.beforeRender(this.graph),this.dataUpdate(),this.eventHandler.init(this,this.graphInteraction)}update(e=!1){this.dataUpdate(),e&&this.eventHandler.update()}dataUpdate(){const e=this.graph.getMutableNodes().filter(s=>s.visible),n=this.nodeGroup.node();this.nodeGroupSelection=this.nodeGroup.selectAll("g.pvt-node").filter(function(){return this.parentNode===n}),this.nodeSelection=this.nodeGroupSelection.data(e,s=>s.id).join(s=>s.append("g").classed("pvt-node",!0).classed("pvt-node-has-children",o=>o.hasChildren()).classed("pvt-node-expanded",o=>o.expanded===!0).each((o,a,c)=>{o.clearDirty();const l=Q(c[a]);l.attr("id",`node-${o.domID}`),this.nodeDrawer.render(l,o)}),s=>s.classed("pvt-node-expanded",o=>o.expanded===!0).each((o,a,c)=>{const l=Q(c[a]);if(o.isDirty()){if(o.clearDirty(),!o.expanded){J.collapseAllOpenedClusters(o),J.toggleSyntheticEdges(o);const h=this.nodeDrawer.graph.getParentGraph();let u=h;for(;u;)u.renderer.update(!1),u=u.getParentGraph();h&&J.updateToNewRadiusCollapsed(o,!0,h)}l.selectChildren().remove(),this.nodeDrawer.render(l,o)}this.nodeDrawer.checkForHighlight(l,o)}),s=>s.remove());const r=this.graph.getMutableEdges().filter(s=>s.visible);this.edgeGroupSelection=this.edgeGroup.selectAll("g.pvt-edge-group"),this.edgeSelection=this.edgeGroupSelection.data(r,s=>s.id).join(s=>s.append("g").classed("pvt-edge-group",!0).classed("pvt-edge-synthetic",o=>o.isSynthetic===!0).each((o,a,c)=>{o.clearDirty();const l=Q(c[a]);l.attr("id",`edge-${o.domID}`),this.edgeDrawer.render(l,o)}),s=>s.each((o,a,c)=>{if(o.isDirty()){o.clearDirty();const l=Q(c[a]);l.selectChildren().remove(),this.edgeDrawer.render(l,o)}}),s=>s.remove())}getCanvasSelection(){return this.svg}getZoomGroup(){return this.zoomGroup.node()}nextTick(){this.updateEdgePositions(),this.updateNodePositions()}nextTickFor(e){this.updateEdgePositions(e),this.updateNodePositions(e)}zoomIn(){const e=this.getZoomBehavior(),n=this.getCanvasSelection();!e||!n||(this.options.zoomAnimation?n.transition().duration(300).call(e.scaleBy,1.5):n.call(e.scaleBy,1.5))}zoomOut(){const e=this.getZoomBehavior(),n=this.getCanvasSelection();!e||!n||(this.options.zoomAnimation?n.transition().duration(300).call(e.scaleBy,.667):n.call(e.scaleBy,.667))}fitAndCenter(e){const n=this.getZoomBehavior(),r=this.getCanvasSelection(),s=r.node(),o=r.select(".zoom-layer").node();if(!n||!s||!o)return;const a=o.getBBox();if(a.width==0||a.height==0)return;const c=s.clientWidth,l=s.clientHeight,h=a.width,u=a.height,d=a.x+h/2,p=a.y+u/2;let m;e?m=e:(m=Math.min(c/h,l/u)*.8,m=Math.min(m,3));const v=c/2-m*d,b=l/2-m*p,y=qe.translate(v,b).scale(m);this.options.zoomAnimation?r.transition().duration(this.options.zoomAnimationDuration).call(n.transform,y):r.call(n.transform,y)}focusElement(e){const n=e.getGraphElement(),r=this.getZoomBehavior(),s=this.getCanvasSelection(),o=s.node(),a=s.select(".zoom-layer").node();if(!r||!o||!a||!n)return;const c=a.getBBox(),l=o.clientWidth,h=o.clientHeight,u=c.width,d=c.height,p=n.transform.baseVal;let m=0,v=0;if(p.numberOfItems>0){const x=p.getItem(0);m=x.matrix.e,v=x.matrix.f}const b=Math.min(l/u,h/d)*1.5,y=l/2-b*m,_=h/2-b*v,E=qe.translate(y,_).scale(b);s.transition().duration(300).call(r.transform,E)}highlightElement(e){const n=e.getGraphElement();e instanceof dt?(this.edgeSelection.classed("pvt-edge-highlighted",!1),n==null||n.classList.add("pvt-edge-highlighted")):e instanceof ut&&(this.nodeSelection.classed("pvt-node-highlighted",!1),n==null||n.classList.add("pvt-node-highlighted"))}unHighlightElement(e){const n=e.getGraphElement();e instanceof dt?n==null||n.classList.remove("pvt-edge-highlighted"):e instanceof ut&&(n==null||n.classList.remove("pvt-node-highlighted"))}clearHighlightedElements(){this.edgeSelection.classed("pvt-edge-highlighted",!1),this.nodeSelection.classed("pvt-node-highlighted",!1)}updateNodePositions(e){if(e){const n=new Set(e==null?void 0:e.map(s=>s.id)),r=this.nodeSelection.filter(s=>n.has(s.id));this.nodeDrawer.updatePositions(r)}else this.nodeDrawer.updatePositions(this.nodeSelection)}updateEdgePositions(e){if(e){const n=e.flatMap(o=>[...o.getEdgesOut(),...o.getEdgesIn()]),r=new Set(n==null?void 0:n.map(o=>o.id)),s=this.edgeSelection.filter(o=>r.has(o.id));this.edgeDrawer.updatePositions(s)}else this.edgeDrawer.updatePositions(this.edgeSelection)}getNodeSelection(){return this.nodeSelection}getEdgeSelection(){return this.edgeSelection}getGraphInteraction(){return this.graphInteraction}getEventHandler(){return this.eventHandler}}function Yc(i,t,e){const n=e.type??"svg";if(n==="svg"){const r=new Hc(i);return new Xc(i,t,r,e)}throw new Error(`\`${n}\` renderer is not implemented yet.`)}function Zc(i=0,t=0,e=.001){let n=[],r;function s(){r=typeof e=="function"?e:()=>e}function o(a){for(let c=0,l=n.length;c{n=a,s()},o.x=function(a){return arguments.length?(i=a,o):i},o.y=function(a){return arguments.length?(t=a,o):t},o.strength=function(a){return arguments.length?(e=a,s(),o):e},o}const mr='var ta=Object.defineProperty;var ea=(Q,X,st)=>X in Q?ta(Q,X,{enumerable:!0,configurable:!0,writable:!0,value:st}):Q[X]=st;var T=(Q,X,st)=>ea(Q,typeof X!="symbol"?X+"":X,st);(function(){"use strict";function Q(e){const t=+this._x.call(null,e),n=+this._y.call(null,e);return X(this.cover(t,n),t,n,e)}function X(e,t,n,i){if(isNaN(t)||isNaN(n))return e;var r,o=e._root,a={data:i},u=e._x0,c=e._y0,s=e._x1,h=e._y1,g,d,p,x,y,_,w,b;if(!o)return e._root=a,e;for(;o.length;)if((y=t>=(g=(u+s)/2))?u=g:s=g,(_=n>=(d=(c+h)/2))?c=d:h=d,r=o,!(o=o[w=_<<1|y]))return r[w]=a,e;if(p=+e._x.call(null,o.data),x=+e._y.call(null,o.data),t===p&&n===x)return a.next=o,r?r[w]=a:e._root=a,e;do r=r?r[w]=new Array(4):e._root=new Array(4),(y=t>=(g=(u+s)/2))?u=g:s=g,(_=n>=(d=(c+h)/2))?c=d:h=d;while((w=_<<1|y)===(b=(x>=d)<<1|p>=g));return r[b]=o,r[w]=a,e}function st(e){var t,n,i=e.length,r,o,a=new Array(i),u=new Array(i),c=1/0,s=1/0,h=-1/0,g=-1/0;for(n=0;nh&&(h=r),og&&(g=o));if(c>h||s>g)return this;for(this.cover(c,s).cover(h,g),n=0;ne||e>=r||i>t||t>=o;)switch(s=(th||(u=x.y0)>g||(c=x.x1)=w)<<1|e>=_)&&(x=d[d.length-1],d[d.length-1]=d[d.length-1-y],d[d.length-1-y]=x)}else{var b=e-+this._x.call(null,p.data),S=t-+this._y.call(null,p.data),v=b*b+S*S;if(v=(d=(a+c)/2))?a=d:c=d,(y=g>=(p=(u+s)/2))?u=p:s=p,t=n,!(n=n[_=y<<1|x]))return this;if(!n.length)break;(t[_+1&3]||t[_+2&3]||t[_+3&3])&&(i=t,w=_)}for(;n.data!==e;)if(r=n,!(n=n.next))return this;return(o=n.next)&&delete n.next,r?(o?r.next=o:delete r.next,this):t?(o?t[_]=o:delete t[_],(n=t[0]||t[1]||t[2]||t[3])&&n===(t[3]||t[2]||t[1]||t[0])&&!n.length&&(i?i[w]=n:this._root=n),this):(this._root=o,this)}function kn(e){for(var t=0,n=e.length;td.index){var P=p-I.x-I.vx,W=x-I.y-I.vy,H=P*P+W*W;Hp+k||Dx+k||Ns.r&&(s.r=s[h].r)}function c(){if(t){var s,h=t.length,g;for(n=new Array(h),s=0;s[t(C,D,a),C])),v;for(_=0,u=new Array(w);_{}};function te(){for(var e=0,t=arguments.length,n={},i;e=0&&(i=n.slice(r+1),n=n.slice(0,r)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:i}})}Ct.prototype=te.prototype={constructor:Ct,on:function(e,t){var n=this._,i=qn(e+"",n),r,o=-1,a=i.length;if(arguments.length<2){for(;++o0)for(var n=new Array(r),i=0,r,o;i=0&&e._call.call(void 0,t),e=e._next;--ot}function Fe(){J=(Mt=gt.now())+It,ot=ht=0;try{Yn()}finally{ot=0,Qn(),J=0}}function Zn(){var e=gt.now(),t=e-Mt;t>De&&(It-=t,Mt=e)}function Qn(){for(var e,t=Dt,n,i=1/0;t;)t._call?(i>t._time&&(i=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:Dt=n);dt=e,ne(i)}function ne(e){if(!ot){ht&&(ht=clearTimeout(ht));var t=e-J;t>24?(e<1/0&&(ht=setTimeout(Fe,e-gt.now()-It)),ft&&(ft=clearInterval(ft))):(ft||(Mt=gt.now(),ft=setInterval(Zn,De)),ot=1,Me(Fe))}}const Jn=1664525,ti=1013904223,ke=4294967296;function ei(){let e=1;return()=>(e=(Jn*e+ti)%ke)/ke}function ni(e){return e.x}function ii(e){return e.y}var ri=10,si=Math.PI*(3-Math.sqrt(5));function oi(e){var t,n=1,i=.001,r=1-Math.pow(i,1/300),o=0,a=.6,u=new Map,c=Ne(g),s=te("tick","end"),h=ei();e==null&&(e=[]);function g(){d(),s.call("tick",t),n1?(_==null?u.delete(y):u.set(y,x(_)),t):u.get(y)},find:function(y,_,w){var b=0,S=e.length,v,C,D,N,I;for(w==null?w=1/0:w*=w,b=0;b1?(s.on(y,_),t):s.on(y)}}}function ai(){var e,t,n,i,r=L(-30),o,a=1,u=1/0,c=.81;function s(p){var x,y=e.length,_=Qt(e,ni,ii).visitAfter(g);for(i=p,x=0;x=u)return;(p.data!==t||p.next)&&(w===0&&(w=Y(n),v+=w*w),b===0&&(b=Y(n),v+=b*b),vn}function a(u){for(let c=0,s=i.length;c{i=u,o()},a.x=function(u){return arguments.length?(e=u,a):e},a.y=function(u){return arguments.length?(t=u,a):t},a.strength=function(u){return arguments.length?(n=u,o(),a):n},a}var ie="http://www.w3.org/1999/xhtml",Oe={svg:"http://www.w3.org/2000/svg",xhtml:ie,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Be(e){var t=e+="",n=t.indexOf(":");return n>=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Oe.hasOwnProperty(t)?{space:Oe[t],local:e}:e}function ui(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===ie&&t.documentElement.namespaceURI===ie?t.createElement(e):t.createElementNS(n,e)}}function ci(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function Pe(e){var t=Be(e);return(t.local?ci:ui)(t)}function hi(){}function Le(e){return e==null?hi:function(){return this.querySelector(e)}}function fi(e){typeof e!="function"&&(e=Le(e));for(var t=this._groups,n=t.length,i=new Array(n),r=0;r=S&&(S=b+1);!(C=_[S])&&++S=0;)(a=i[r])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function Li(e){e||(e=ji);function t(g,d){return g&&d?e(g.__data__,d.__data__):!g-!d}for(var n=this._groups,i=n.length,r=new Array(i),o=0;ot?1:e>=t?0:NaN}function Gi(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Ui(){return Array.from(this)}function Hi(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?tr:typeof t=="function"?nr:er)(e,t,n??"")):rr(this.node(),e)}function rr(e,t){return e.style.getPropertyValue(t)||Ue(e).getComputedStyle(e,null).getPropertyValue(t)}function sr(e){return function(){delete this[e]}}function or(e,t){return function(){this[e]=t}}function ar(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function lr(e,t){return arguments.length>1?this.each((t==null?sr:typeof t=="function"?ar:or)(e,t)):this.node()[e]}function He(e){return e.trim().split(/^|\\s+/)}function re(e){return e.classList||new We(e)}function We(e){this._node=e,this._names=He(e.getAttribute("class")||"")}We.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function Ve(e,t){for(var n=re(e),i=-1,r=t.length;++i=0&&(n=t.slice(i+1),t=t.slice(0,i)),{type:t,name:n}})}function Or(e){return function(){var t=this.__on;if(t){for(var n=0,i=-1,r=t.length,o;n()=>e;function oe(e,{sourceEvent:t,subject:n,target:i,identifier:r,active:o,x:a,y:u,dx:c,dy:s,dispatch:h}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:u,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:s,enumerable:!0,configurable:!0},_:{value:h}})}oe.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function Kr(e){return!e.ctrlKey&&!e.button}function Yr(){return this.parentNode}function Zr(e,t){return t??{x:e.x,y:e.y}}function Qr(){return navigator.maxTouchPoints||"ontouchstart"in this}function Jr(){var e=Kr,t=Yr,n=Zr,i=Qr,r={},o=te("start","drag","end"),a=0,u,c,s,h,g=0;function d(v){v.on("mousedown.drag",p).filter(i).on("touchstart.drag",_).on("touchmove.drag",w,$r).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(v,C){if(!(h||!e.call(this,v,C))){var D=S(this,t.call(this,v,C),v,C,"mouse");D&&(Ft(v.view).on("mousemove.drag",x,pt).on("mouseup.drag",y,pt),qr(v.view),se(v),s=!1,u=v.clientX,c=v.clientY,D("start",v))}}function x(v){if(at(v),!s){var C=v.clientX-u,D=v.clientY-c;s=C*C+D*D>g}r.mouse("drag",v)}function y(v){Ft(v.view).on("mousemove.drag mouseup.drag",null),Xr(v.view,s),at(v),r.mouse("end",v)}function _(v,C){if(e.call(this,v,C)){var D=v.changedTouches,N=t.call(this,v,C),I=D.length,B,k;for(B=0;Bt.to)}getConnectingNodes(){return[...this.edgesIn].map(t=>t.from)}getEdgesOut(){return[...this.edgesOut]}getEdgesIn(){return[...this.edgesIn]}getStyle(){return this.style}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`node-${this.domID}`):null}toDict(t=!1){const n={id:this.id,data:this.data,style:this.style,weight:this.weight};return t||(n.x=this.x,n.y=this.y,n.vx=this.vx,n.vy=this.vy,n.fx=this.fx,n.fy=this.fy),this.hasChildren()&&(n.children=this.children.map(i=>i.toDict(t))),n}clone(){const t={...this.data},n={...this.style},i=new Cn(this.id,t,n);return i.x=this.x,i.y=this.y,i.vx=this.vx,i.vy=this.vy,i.fx=this.fx,i.fy=this.fy,i.weight=this.weight,i.frozen=this.frozen,i.visible=this.visible,i.expanded=this.expanded,i.isChild=this.isChild,i.childrenDepth=this.childrenDepth,i.isParent=this.isParent,i.parentNode=this.parentNode,i._circleRadius=this._circleRadius,i.children=this.children.map(r=>r.clone()),i}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}freeze(){this.frozen=!0,this.fx=this.x,this.fy=this.y}unfreeze(){this.frozen=!1,this.fx=void 0,this.fy=void 0}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}toggleExpand(t){t===void 0?this.expanded?this.collapse():this.expand():t?this.expand():this.collapse(),this.markDirty()}expand(){this.expanded=!0,this._original_object&&(this._original_object.expanded=!0)}collapse(){this.expanded=!1,this._original_object&&(this._original_object.expanded=!1)}degree(){return this.edgesOut.size+this.edgesIn.size}setCircleRadius(t){this._circleRadius=t}getCircleRadius(){return this._circleRadius}setCircleRadiusCollapsed(t){this._circleRadiusCollapsed=t}getCircleRadiusCollapsed(){return this._circleRadiusCollapsed}setChildren(t){this.children=t,this.hasChildren()?this.isParent=!0:this.isParent=!1}hasChildren(){return this.children.length>0}markAsChild(t,n){this.isChild=!0,this.childrenDepth=n,this.parentNode=t}markAsParent(){this.isParent=!0}setSubgraph(t){this._subgraph=t}getSubgraph(){return this._subgraph}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setDeepestNodeClone(t){this._deepest_node_clone=t}getDeepestNodeClone(){return this._deepest_node_clone}};class Et{constructor(t,n,i,r,o,a=null,u){T(this,"id");T(this,"from");T(this,"to");T(this,"directed");T(this,"data");T(this,"style");T(this,"visible");T(this,"isSynthetic");T(this,"syntheticTerminalNode");T(this,"_original_object");T(this,"_subgraphFromNode");T(this,"_subgraphToNode");T(this,"_dirty");T(this,"domID");this.id=t,this.domID=Ke(),this.from=n,this.to=i,this.directed=a,this.data=r??{},this.style=o??{},this.visible=!0,this._dirty=!0,this.isSynthetic=u!==void 0,this.syntheticTerminalNode=u,this.from.registerEdgeOut(this),this.to.registerEdgeIn(this)}get source(){return this.from}get target(){return this.to}getData(){return this.data}setData(t){this.data=t,this.markDirty()}updateData(t){this.data={...this.data,...t},this.markDirty()}getStyle(){return this.style}getEdgeStyle(){var t;return((t=this.style)==null?void 0:t.edge)??{}}getLabelStyle(){var t;return((t=this.style)==null?void 0:t.label)??{}}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`edge-${this.domID}`):null}setFrom(t){this.from=t}setTo(t){this.to=t}toDict(){return{id:this.id,from:this.from.id,to:this.to.id,data:this.data,style:this.style}}clone(){const t={...this.data},n={...this.style},i=new Et(this.id,this.from.clone(),this.to.clone(),t,n,this.directed);return i.visible=this.visible,i}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setSubgraphFromNode(t){this._subgraphFromNode=t}setSubgraphToNode(t){this._subgraphToNode=t}getSubgraphFromNode(){return this._subgraphFromNode}getSubgraphToNode(){return this._subgraphToNode}}function ts(e){return new Worker(self.location.href,{name:e==null?void 0:e.name})}function es(){return new ts}const ns=(e,t,n,i,r)=>new Promise((o,a)=>{const u=es();u.postMessage({source:"simulation-worker-wrapper",nodes:e,edges:t,options:n,canvasBCR:i}),u.onmessage=c=>{const{type:s,progress:h,nodes:g,edges:d,elapsedTime:p}=c.data;if(s==="tick"&&typeof h=="number"){r==null||r(h,p);return}s==="done"&&(o({nodes:g,edges:d}),u.terminate())},u.onerror=a});var Rt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function is(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var yt={exports:{}};yt.exports;var Ze;function rs(){return Ze||(Ze=1,(function(e,t){var n=200,i="__lodash_hash_undefined__",r=800,o=16,a=9007199254740991,u="[object Arguments]",c="[object Array]",s="[object AsyncFunction]",h="[object Boolean]",g="[object Date]",d="[object Error]",p="[object Function]",x="[object GeneratorFunction]",y="[object Map]",_="[object Number]",w="[object Null]",b="[object Object]",S="[object Proxy]",v="[object RegExp]",C="[object Set]",D="[object String]",N="[object Undefined]",I="[object WeakMap]",B="[object ArrayBuffer]",k="[object DataView]",P="[object Float32Array]",W="[object Float64Array]",H="[object Int8Array]",lt="[object Int16Array]",ce="[object Int32Array]",vt="[object Uint8Array]",Ut="[object Uint8ClampedArray]",he="[object Uint16Array]",Ht="[object Uint32Array]",wt=/[\\\\^$.*+?()[\\]{}|]/g,Bs=/^\\[object .+?Constructor\\]$/,Ps=/^(?:0|[1-9]\\d*)$/,R={};R[P]=R[W]=R[H]=R[lt]=R[ce]=R[vt]=R[Ut]=R[he]=R[Ht]=!0,R[u]=R[c]=R[B]=R[h]=R[k]=R[g]=R[d]=R[p]=R[y]=R[_]=R[b]=R[v]=R[C]=R[D]=R[I]=!1;var nn=typeof Rt=="object"&&Rt&&Rt.Object===Object&&Rt,Ls=typeof self=="object"&&self&&self.Object===Object&&self,xt=nn||Ls||Function("return this")(),rn=t&&!t.nodeType&&t,bt=rn&&!0&&e&&!e.nodeType&&e,sn=bt&&bt.exports===rn,fe=sn&&nn.process,on=(function(){try{var l=bt&&bt.require&&bt.require("util").types;return l||fe&&fe.binding&&fe.binding("util")}catch{}})(),an=on&&on.isTypedArray;function js(l,f,m){switch(m.length){case 0:return l.call(f);case 1:return l.call(f,m[0]);case 2:return l.call(f,m[0],m[1]);case 3:return l.call(f,m[0],m[1],m[2])}return l.apply(f,m)}function Gs(l,f){for(var m=-1,A=Array(l);++m-1}function uo(l,f){var m=this.__data__,A=Xt(m,l);return A<0?(++this.size,m.push([l,f])):m[A][1]=f,this}K.prototype.clear=so,K.prototype.delete=oo,K.prototype.get=ao,K.prototype.has=lo,K.prototype.set=uo;function ut(l){var f=-1,m=l==null?0:l.length;for(this.clear();++f1?m[M-1]:void 0,z=M>2?m[2]:void 0;for(E=l.length>3&&typeof E=="function"?(M--,E):void 0,z&&Lo(m[0],m[1],z)&&(E=M<3?void 0:E,M=1),f=Object(f);++A-1&&l%1==0&&l0){if(++f>=r)return arguments[0]}else f=0;return l.apply(void 0,arguments)}}function qo(l){if(l!=null){try{return Vt.call(l)}catch{}try{return l+""}catch{}}return""}function Zt(l,f){return l===f||l!==l&&f!==f}var _e=yn((function(){return arguments})())?yn:function(l){return Tt(l)&&Z.call(l,"callee")&&!Ks.call(l,"callee")},ve=Array.isArray;function we(l){return l!=null&&xn(l.length)&&!xe(l)}function Xo(l){return Tt(l)&&we(l)}var wn=Zs||Jo;function xe(l){if(!rt(l))return!1;var f=Kt(l);return f==p||f==x||f==s||f==S}function xn(l){return typeof l=="number"&&l>-1&&l%1==0&&l<=a}function rt(l){var f=typeof l;return l!=null&&(f=="object"||f=="function")}function Tt(l){return l!=null&&typeof l=="object"}function Ko(l){if(!Tt(l)||Kt(l)!=b)return!1;var f=fn(l);if(f===null)return!0;var m=Z.call(f,"constructor")&&f.constructor;return typeof m=="function"&&m instanceof m&&Vt.call(m)==qs}var bn=an?Us(an):Ao;function Yo(l){return Ro(l,Sn(l))}function Sn(l){return we(l)?xo(l):Co(l)}var Zo=zo(function(l,f,m){mn(l,f,m)});function Qo(l){return function(){return l}}function Tn(l){return l}function Jo(){return!1}e.exports=Zo})(yt,yt.exports)),yt.exports}var ss=rs(),zt=is(ss);function os(e){var t=0,n=e.children,i=n&&n.length;if(!i)t=1;else for(;--i>=0;)t+=n[i].value;e.value=t}function as(){return this.eachAfter(os)}function ls(e,t){let n=-1;for(const i of this)e.call(t,i,++n,this);return this}function us(e,t){for(var n=this,i=[n],r,o,a=-1;n=i.pop();)if(e.call(t,n,++a,this),r=n.children)for(o=r.length-1;o>=0;--o)i.push(r[o]);return this}function cs(e,t){for(var n=this,i=[n],r=[],o,a,u,c=-1;n=i.pop();)if(r.push(n),o=n.children)for(a=0,u=o.length;a=0;)n+=i[r].value;t.value=n})}function ds(e){return this.eachBefore(function(t){t.children&&t.children.sort(e)})}function gs(e){for(var t=this,n=ps(t,e),i=[t];t!==n;)t=t.parent,i.push(t);for(var r=i.length;e!==n;)i.splice(r,0,e),e=e.parent;return i}function ps(e,t){if(e===t)return e;var n=e.ancestors(),i=t.ancestors(),r=null;for(e=n.pop(),t=i.pop();e===t;)r=e,e=n.pop(),t=i.pop();return r}function ys(){for(var e=this,t=[e];e=e.parent;)t.push(e);return t}function ms(){return Array.from(this)}function _s(){var e=[];return this.eachBefore(function(t){t.children||e.push(t)}),e}function vs(){var e=this,t=[];return e.each(function(n){n!==e&&t.push({source:n.parent,target:n})}),t}function*ws(){var e=this,t,n=[e],i,r,o;do for(t=n.reverse(),n=[];e=t.pop();)if(yield e,i=e.children)for(r=0,o=i.length;r=0;--u)r.push(o=a[u]=new mt(a[u])),o.parent=i,o.depth=i.depth+1;return n.eachBefore(As)}function xs(){return Ot(this).eachBefore(Ts)}function bs(e){return e.children}function Ss(e){return Array.isArray(e)?e[1]:null}function Ts(e){e.data.value!==void 0&&(e.value=e.data.value),e.data=e.data.data}function As(e){var t=0;do e.height=t;while((e=e.parent)&&e.height<++t)}function mt(e){this.data=e,this.depth=this.height=0,this.parent=null}mt.prototype=Ot.prototype={constructor:mt,count:as,each:ls,eachAfter:cs,eachBefore:us,find:hs,sum:fs,sort:ds,path:gs,ancestors:ys,descendants:ms,leaves:_s,links:vs,copy:xs,[Symbol.iterator]:ws};function Cs(e,t){return e.parent===t.parent?1:2}function ae(e){var t=e.children;return t?t[0]:e.t}function le(e){var t=e.children;return t?t[t.length-1]:e.t}function Ds(e,t,n){var i=n/(t.i-e.i);t.c-=i,t.s+=n,e.c+=i,t.z+=n,t.m+=n}function Ms(e){for(var t=0,n=0,i=e.children,r=i.length,o;--r>=0;)o=i[r],o.z+=t,o.m+=t,t+=o.s+(n+=o.c)}function Is(e,t,n){return e.a.parent===t.parent?e.a:n}function Bt(e,t){this._=e,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=t}Bt.prototype=Object.create(mt.prototype);function Ns(e){for(var t=new Bt(e,0),n,i=[t],r,o,a,u;n=i.pop();)if(o=n._.children)for(n.children=new Array(u=o.length),a=u-1;a>=0;--a)i.push(r=n.children[a]=new Bt(o[a],a)),r.parent=n;return(t.parent=new Bt(null,0)).children=[t],t}function Qe(){var e=Cs,t=1,n=1,i=null;function r(s){var h=Ns(s);if(h.eachAfter(o),h.parent.m=-h.z,h.eachBefore(a),i)s.eachBefore(c);else{var g=s,d=s,p=s;s.eachBefore(function(b){b.xd.x&&(d=b),b.depth>p.depth&&(p=b)});var x=g===d?1:e(g,d)/2,y=x-g.x,_=t/(d.x+x+y),w=n/(p.depth||1);s.eachBefore(function(b){b.x=(b.x+y)*_,b.y=b.depth*w})}return s}function o(s){var h=s.children,g=s.parent.children,d=s.i?g[s.i-1]:null;if(h){Ms(s);var p=(h[0].z+h[h.length-1].z)/2;d?(s.z=d.z+e(s._,d._),s.m=s.z-p):s.z=p}else d&&(s.z=d.z+e(s._,d._));s.parent.A=u(s,d,s.parent.A||g[0])}function a(s){s._.x=s.z+s.parent.m,s.m+=s.parent.m}function u(s,h,g){if(h){for(var d=s,p=s,x=h,y=d.parent.children[0],_=d.m,w=p.m,b=x.m,S=y.m,v;x=le(x),d=ae(d),x&&d;)y=ae(y),p=le(p),p.a=s,v=x.z+b-d.z-_+e(x._,d._),v>0&&(Ds(Is(x,s,g),s,v),_+=v,w+=v),b+=x.m,_+=d.m,S+=y.m,w+=p.m;x&&!le(p)&&(p.t=x,p.m+=b-w),d&&!ae(y)&&(y.t=d,y.m+=_-S,g=s)}return g}function c(s){s.x*=t,s.y=s.depth*n}return r.separation=function(s){return arguments.length?(e=s,r):e},r.size=function(s){return arguments.length?(i=!1,t=+s[0],n=+s[1],r):i?null:[t,n]},r.nodeSize=function(s){return arguments.length?(i=!0,t=+s[0],n=+s[1],r):i?[t,n]:null},r}function Pt(e,t){const n={};for(const a of e)n[a.id]=[];for(const{source:a,target:u}of t)n[a.id]||(n[a.id]=[]),n[a.id].push(u.id);const i=new Set,r=new Set,o=a=>{if(!i.has(a)&&(i.add(a),r.add(a),n[a]))for(const u of n[a]){if(!i.has(u)&&o(u))return!0;if(r.has(u))return!0}return r.delete(a),!1};return e.some(a=>o(a.id))}function Je(e,t){const n=new Set(t.map(i=>i.target.id));for(const i of e)if(!n.has(i.id))return i;return e[0]}function Fs(e,t){const n=new Map;for(const c of e)n.set(c.id,[]);for(const c of t)n.get(c.from.id)||console.log(c),n.get(c.from.id).push(c.to);const i=new Map,r=new Map;function o(c,s=new Set){if(r.has(c))return new Set(r.get(c));const h=new Set;for(const g of n.get(c.id)??[])if(!s.has(g)){s.add(g),h.add(g);const d=o(g,s);for(const p of d)h.add(p)}return r.set(c,h),i.set(c,h.size),h}for(const c of e)i.has(c)||o(c);let a=null,u=-1;for(const c of e){const s=i.get(c)??0;s>u&&(u=s,a=c)}return a??e[0]}function ks(e,t){const n=new Map,i=new Map;for(const s of e)n.set(s.id,[]),i.set(s.id,0);for(const s of t)s.directed!==!1&&(n.get(s.from.id).push(s.to),i.set(s.to.id,(i.get(s.to.id)||0)+1));const r=[],o=e.filter(s=>i.get(s.id)===0);for(;o.length;){const s=o.shift();r.push(s);for(const h of n.get(s.id))i.set(h.id,i.get(h.id)-1),i.get(h.id)===0&&o.push(h)}if(r.length!==e.length)return console.warn("Graph has a cycle! Min-max distance root undefined."),e[0];const a=new Map;for(let s=r.length-1;s>=0;s--){const h=r[s];let g=0;for(const d of n.get(h.id))g=Math.max(g,1+(a.get(d.id)||0));a.set(h.id,g)}let u=null,c=1/0;for(const s of e){const h=a.get(s.id);hi.get(s.id)===0);for(;o.length;){const s=o.shift();r.push(s);for(const h of n.get(s.id))i.set(h.id,i.get(h.id)-1),i.get(h.id)===0&&o.push(h)}if(r.length!==e.length)return console.warn("Graph has a cycle! Cannot minimize DAG height."),e[0];const a=new Map;for(let s=r.length-1;s>=0;s--){const h=r[s];let g=0;for(const d of n.get(h.id))g=Math.max(g,1+(a.get(d.id)??0));a.set(h.id,g)}let u=null,c=1/0;for(const s of e){const h=a.get(s.id);h{const i=n.from;n.setFrom(n.to),n.setTo(i)}),t}setSizes(){const t=this.graph.renderer.getCanvas();if(!t)throw new Error("Canvas element is not defined in the graph renderer.");this.canvasBCR=t.getBoundingClientRect()}setNodePositions(t,n){for(const i of t){const r=this.graph.getMutableNode(i.data.id);if(r)if(n.radial){const o=i.x??0,a=i.y??0;r.x=a*Math.cos(o-Math.PI/2),r.y=a*Math.sin(o-Math.PI/2),r.fx=r.x,r.fy=r.y}else n.horizontal?(r.x=i.y,r.fx=i.y,r.y=i.x,delete r.fy):(r.x=i.x,r.y=i.y,r.fy=i.y,delete r.fx)}}unsetNodePositions(){this.graph.getMutableNodes().forEach(t=>{delete t.fy,delete t.fx})}registerForces(){const t=this.options.strength??.1;if(this.options.radial){const n=Ee(i=>(this.levels[i.id]??1)*100,0,0).strength(t);this.simulation.force("tree-radial",n)}else this.simulation.force("tree-y",ze(n=>{var i,r;return this.options.horizontal?((i=this.positionedNodesByID.get(n.id))==null?void 0:i.x)??0:((r=this.positionedNodesByID.get(n.id))==null?void 0:r.y)??0}).strength(t)),this.simulation.force("tree-x",Re(n=>{var i,r;return this.options.horizontal?((i=this.positionedNodesByID.get(n.id))==null?void 0:i.y)??0:((r=this.positionedNodesByID.get(n.id))==null?void 0:r.x)??0}).strength(t));j.adjustOtherSimulationForces(this.simulationForces,this.options)}unregisterLayout(){this.unregisterForces(),this.unsetNodePositions()}unregisterForces(){this.simulation.force("tree-radial",null),this.simulation.force("tree-y",null),this.simulation.force("tree-x",null),j.resetOtherSimulationForces(this.simulationForces,this.originalForceStrength)}static registerForcesOnSimulation(t,n,i,r,o,a,u=this){const c=zt({},ue,o),s=c.strength??.1,h=a.width,g=a.height,d=[h/2,g/2];if(Pt(t,n))return;const{levels:p}=u.buildLevelsStatic(t,n,void 0,c.rootIdAlgorithmFinder),{nodeById:x}=u.buildTreeStatic(t,n,c,a);if(c.radial){const y=Ee(_=>(p[_.id]??1)*100,d[0],d[1]).strength(s);i.force("tree-radial",y)}else i.force("tree-y",ze(y=>{var _,w;return c.horizontal?((_=x.get(y.id))==null?void 0:_.x)??0:((w=x.get(y.id))==null?void 0:w.y)??0}).strength(s)),i.force("tree-x",Re(y=>{var _,w;return c.horizontal?((_=x.get(y.id))==null?void 0:_.y)??0:((w=x.get(y.id))==null?void 0:w.x)??0}).strength(s));u.adjustOtherSimulationForces(r,c)}static adjustOtherSimulationForces(t,n){n!=null&&n.radial?(t.link.strength(0),t.charge.strength(0),t.gravity.strength(0)):(t.link.strength(0),t.charge.strength(0),t.gravity.strength(1e-5))}static resetOtherSimulationForces(t,n){t.link.strength(n.link),t.charge.strength(n.charge),t.gravity.strength(n.gravity)}static simulationDone(t,n,i,r){const o=zt({},ue,r);for(const a of t)o.radial?(a.fx=a.x,a.fy=a.y):o.horizontal?(a.fx=a.x,delete a.fy):(a.fy=a.y,delete a.fx)}buildTree(t,n,i,r){return j.buildTreeStatic(t,n,i,r)}static buildTreeStatic(t,n,i,r){if(!t.length)return{root:null,nodes:[],nodeById:new Map};if(Pt(t,n))return console.warn("Cycle detected in graph. Tree layout will not be computed."),{root:null,nodes:[],nodeById:new Map};const o=new Map;for(const y of t){const _=y;_.children=[],o.set(y.id,_)}for(const y of n){const _=o.get(y.source.id),w=o.get(y.target.id);_&&w&&(_.children.push(w),w.parent=_)}const a=i.rootId||j.findRootId(t,n,i.rootIdAlgorithmFinder),u=o.get(a);if(!u)throw new Error(`Root node with id "${a}" not found.`);const c=i.radialGap,s=i.radial?2*Math.PI:r.width,h=i.radial?c:r.height,g=Qe();i.radial?g.size([s,h]):g.size([s,h]).separation((y,_)=>{var b,S;const w=((S=(b=y.parent)==null?void 0:b.children)==null?void 0:S.length)??1;return y.parent===_.parent?1.5/w:1.5});const d=Ot(u),p=g(d),x=new Map;return p.descendants().forEach(y=>{x.set(y.data.id,y)}),{root:p,nodes:p.descendants(),nodeById:x}}buildLevels(t,n,i,r){return j.buildLevelsStatic(t,n,i,r)}static buildLevelsStatic(t,n,i,r){if(!t.length)return{levels:{},maxDepth:0,nodeCountPerLevel:{}};const o=i||j.findRootId(t,n,r),a={[o]:0},u={};for(const d of t)u[d.id]=[];for(const{source:d,target:p}of n)u[d.id].push(p.id);const c=[o];let s=0;for(;s{var b,S;const w=((S=(b=y.parent)==null?void 0:b.children)==null?void 0:S.length)??1;return y.parent===_.parent?1.5/w:1.5});const d=Ot(u),p=g(d),x=new Map;return p.descendants().forEach(y=>{x.set(y.data.id,y)}),{root:p,nodes:p.descendants(),nodeById:x}}}function Rs(e){var n;const t=(n=e.getData())==null?void 0:n.label;return typeof t=="string"?t:""}const tt={d3Alpha:1,d3AlphaMin:.001,d3AlphaDecay:.05,d3AlphaTarget:0,d3VelocityDecay:.45,d3LinkDistance:40,d3LinkStrength:null,d3ManyBodyStrength:-150,d3ManyBodyTheta:.9,d3CollideRadius:12,d3CollideStrength:1,d3CollideIterations:1,d3GravityStrength:.1,enabled:!0,cooldownTime:2e3,useWorker:!0,warmupTicks:"auto",freezeNodesOnDrag:!0,layout:{type:"force"},callbacks:{onInit:()=>{},onStart:()=>{},onStop:()=>{},onTick:()=>{}}};class et{constructor(t,n={}){T(this,"simulation");T(this,"graph");T(this,"canvas");T(this,"graphInteraction");T(this,"layout");T(this,"canvasBCR");T(this,"animationFrameId",null);T(this,"startSimulationTime",0);T(this,"engineRunning",!1);T(this,"slowTickThresholdReached",!1);T(this,"lastTickTime",0);T(this,"avgTickDuration",0);T(this,"SLOW_TICK_THRESHOLD",50);T(this,"dragInProgress",!1);T(this,"dragSelection",[]);T(this,"totalTickCount",0);T(this,"options");T(this,"callbacks");T(this,"simulationForces");T(this,"scaledForces",{d3ManyBodyStrength:tt.d3ManyBodyStrength,d3CollideStrength:tt.d3CollideStrength});if(this.graph=t,this.options=zt({},tt,n),this.callbacks=this.options.callbacks??{},this.canvas=this.graph.renderer.getCanvas(),!this.canvas)throw new Error("Canvas element is not defined in the graph renderer.");if(this.canvasBCR=this.canvas.getBoundingClientRect(),this.graphInteraction=this.graph.renderer.getGraphInteraction(),!this.graphInteraction)throw new Error("Graph interaction is not available.");const i=et.initSimulationForces(this.options,this.canvasBCR);this.simulation=i.simulation,this.simulationForces=i.simulationForces,this.scaledForces.d3ManyBodyStrength=this.options.d3ManyBodyStrength||tt.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=this.options.d3CollideStrength||tt.d3CollideStrength,this.options.layout.type==="tree"?this.layout=new j(this.graph,this.simulation,this.simulationForces,this.options.layout):this.options.layout.type==="egoTree"&&(this.layout=new _t(this.graph,this.simulation,this.simulationForces,this.options.layout)),this.callbacks.onInit&&this.callbacks.onInit(this)}static initSimulationForces(t,n){const i={link:Vn(),charge:ai(),collide:Hn(),gravity:li()},r=oi().force("link",i.link).force("charge",i.charge).force("collide",i.collide).force("gravity",i.gravity);return this.initSimulationForceGravity(i.gravity,t,n),this.initSimulationForceLink(i.link,t),this.initSimulationForceCharge(i.charge,t),this.initSimulationForceCollide(i.collide,t),r.alphaMin(t.d3AlphaMin),r.alphaDecay(t.d3AlphaDecay),r.alphaTarget(0),r.velocityDecay(t.d3VelocityDecay),{simulation:r,simulationForces:i}}static initSimulationForceGravity(t,n,i){t.x(i.width/2).y(i.height/2).strength(r=>(r.degree()??0)===0?n.d3GravityStrength:.001)}static initSimulationForceLink(t,n){t.distance(i=>{const r=Rs(i);if(!r||r==="")return n.d3LinkDistance;const o=r.length*10;return Math.max(n.d3LinkDistance,o)}),n.d3LinkStrength&&t.strength(n.d3LinkStrength)}static initSimulationForceCharge(t,n){t.theta(n.d3ManyBodyTheta).strength(i=>{const r=i,o=n.d3ManyBodyStrength,a=r.getCircleRadius(),u=10+Math.sqrt(a-10);let c=r.weight??1;return c*=r.isParent?10:1,o*(u*u)/100*c})}static initSimulationForceCollide(t,n){t.radius(i=>{const r=i;return r.expanded?1.2*r.getCircleRadius()+20:r.getCircleRadius()?1.2*r.getCircleRadius():n.d3CollideRadius}).strength(n.d3CollideStrength)}static initSimulationForceClusterRadialConstraint(t,n){t.strength(n.d3CollideStrength)}update(){this.layout&&this.layout.update();const t=this.graph.getMutableNodes().filter(i=>i.visible);this.simulation.nodes(t);const n=this.simulation.force("link");n&&n.id(i=>i.id).links(this.getActiveEdges()),this.restart()}getActiveEdges(){const t=this.graph.getMutableEdges().filter(i=>{if(!i.visible)return!1;const r=i.source,o=i.target;return!(r.isChild||o.isChild)}),n=this.getClusterLinks();return[...t,...n]}getClusterLinks(){return this.graph.getMutableEdges().filter(n=>n.visible)}scaleSimulationOptions(){const t=et.scaleSimulationOptions(this.options,this.canvasBCR,this.graph.getNodeCount());this.scaledForces.d3ManyBodyStrength=t.d3ManyBodyStrength??tt.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=t.d3CollideStrength??tt.d3CollideStrength}static scaleSimulationOptions(t,n,i){const r=i/(n.width*n.height),o=Math.min(2,75e-6/r);return{d3ManyBodyStrength:t.d3ManyBodyStrength*o,d3CollideStrength:t.d3ManyBodyStrength*o}}applyScalledSimulationOptions(){et.initSimulationForceCharge(this.simulationForces.charge,this.options),et.initSimulationForceCollide(this.simulationForces.collide,this.options)}enable(){this.avgTickDuration=0,this.options.enabled=!0,this.start(!1)}disable(){this.options.enabled=!1,this.stop()}pause(){this.engineRunning=!1,this.slowTickThresholdReached=!1}restart(){this.startSimulationTime=new Date().getTime(),this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1}async start(t=!0){if(t&&await this.runSimulationWorkerRouter(),!this.options.enabled){this.engineRunning=!1;return}this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1,this.callbacks.onStart&&this.callbacks.onStart(this),this.animationFrameId===null&&this.startAnimationLoop()}stop(){this.engineRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.simulation.stop(),this.callbacks.onStop&&this.callbacks.onStop(this)}startAnimationLoop(){const t=()=>{this.animationFrameId=requestAnimationFrame(t),this.simulationTick()};this.engineRunning=!0,this.simulation.alpha(.01).restart(),this.animationFrameId=requestAnimationFrame(t)}simulationTick(){this.engineRunning&&(!this.dragInProgress&&(new Date().getTime()-this.startSimulationTime>this.options.cooldownTime||this.options.d3AlphaMin>0&&this.simulation.alpha()this.SLOW_TICK_THRESHOLD&&(this.slowTickThresholdReached=!0,this.disable(),(i=this.graph.UIManager.graphControls)==null||i.updatePhysicSimulationIndicator(!1),this.graph.UIManager.showNotification({level:"warning",title:"Physics engine running slow",message:"The physic has been disabled."}))}async waitForSimulationStop(){if(this.engineRunning)return new Promise(t=>{const n=this.callbacks.onStop;this.callbacks.onStop=i=>{n==null||n(i),this.callbacks.onStop=n,t()}})}isEnabled(){return this.options.enabled}async computeGraph(t={}){var h;const{runSimulation:n}=await Promise.resolve().then(function(){return Os}),i=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!i)return;const r=this.graph.getMutableNodes(),o=this.graph.getNodes().map(g=>(g.fx=void 0,g.fy=void 0,g)),a=this.graph.getEdges(),{callbacks:u,...c}=this.options;Object.assign(c,t);const{nodes:s}=n(o,a,c,i);s.forEach((g,d)=>{r[d].x=g.x,r[d].y=g.y,g.fx?r[d].fx=g.fx:r[d].fx=void 0,g.fy?r[d].fy=g.fy:r[d].fy=void 0}),this.graph.updateData(r,void 0,!1)}async runSimulationWorkerRouter(t={}){this.options.useWorker?await this.runSimulationWorker(t):(await this.computeGraph(t),this.graph.updateLayoutProgress(100,0,"done"))}async runSimulationWorker(t={}){var h;const n=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!n)return;const i=this.graph.getMutableNodes(),r=this.graph.getNodes().map(g=>(g.fx=void 0,g.fy=void 0,g)),o=this.graph.getEdges(),a=(g,d)=>{this.graph.updateLayoutProgress(g,d,"simulation")},{callbacks:u,...c}=this.options;Object.assign(c,t);const{nodes:s}=await ns(r,o,c,n,a);this.graph.updateLayoutProgress(100,0,"rendering"),s.forEach((g,d)=>{i[d].x=g.x,i[d].y=g.y,g.fx?i[d].fx=g.fx:i[d].fx=void 0,g.fy?i[d].fy=g.fy:i[d].fy=void 0}),this.graph.updateData(i,void 0,!1),this.graph.updateLayoutProgress(100,0,"done")}reheat(t=.7){this.restart(),this.simulation.alpha(t).restart()}createDragBehavior(){return Jr().on("start.draggedelement",(t,n)=>{this.graphInteraction.hasActiveMultiselection()?this.dragSelection=this.graphInteraction.getSelectedNodes().map(i=>{const{node:r}=i;return r.freeze(),{node:r,dx:r.x-n.x,dy:r.y-n.y}}):(this.dragSelection=[],n.freeze())}).on("drag.draggedelement",(t,n)=>{if(!this.dragInProgress&&this.isEnabled()&&(this.dragInProgress=!0,this.restart(),this.simulation.alphaTarget(.3).restart()),this.graphInteraction.hasActiveMultiselection()?this.dragSelection.forEach(({node:i,dx:r,dy:o})=>{i.fx=t.x+r,i.fy=t.y+o,i.x=t.x+r,i.y=t.y+o}):(n.fx=t.x,n.fy=t.y,n.x=t.x,n.y=t.y),this.graphInteraction.dragging(t.sourceEvent,t.subject),!this.engineRunning||!this.isEnabled()){const i=this.graphInteraction.hasActiveMultiselection()?this.dragSelection.map(r=>r.node):[n];this.graph.nextTickFor(i)}}).on("end.draggedelement",(t,n)=>{!t.active&&this.dragInProgress&&(this.dragInProgress=!1,this.restart(),this.simulation.alphaTarget(this.options.d3AlphaTarget).restart()),this.options.freezeNodesOnDrag||(this.graphInteraction.hasActiveMultiselection()?(this.dragSelection.forEach(({node:i})=>i.unfreeze()),this.dragSelection=[]):n.unfreeze()),this.graphInteraction.dragended(t.sourceEvent,t.subject)})}isDragging(){return this.dragInProgress}getForceSimulation(){return this.simulationForces}getSimulation(){return this.simulation}async changeLayout(t,n={}){var i;this.layout&&((i=this.layout)==null||i.unregisterLayout(),this.layout=void 0),n=n??{},n.layout=n.layout??{},n.layout.type=t,t==="force"?this.applyScalledSimulationOptions():t==="tree"&&(this.layout=new j(this.graph,this.simulation,this.simulationForces,n.layout)),this.options.layout.type=t,this.update(),this.pause(),await this.runSimulationWorkerRouter(n),this.restart(),await this.waitForSimulationStop(),this.graph.renderer.fitAndCenter()}}const tn=1e4,Lt=2e4,jt=.15*Lt;self.onmessage=e=>{var y,_,w,b;if(e.data.source!=="simulation-worker-wrapper")return;const{nodes:t,edges:n,options:i,canvasBCR:r}=e.data,o=t.map(S=>{const v=new Ye(S.id,S.data,S.style);return v.setCircleRadius(S._circleRadius??10),v}),a=new Map(o.map(S=>[S.id,S]));(y=i.layout)==null||y.type;const{simulation:u,simulationForces:c}=et.initSimulationForces(i,r),s=[];for(const S of n){const v=a.get(S.from.id),C=a.get(S.to.id);if(v&&C){const D=S.style??{};s.push(new Et(S.id,v,C,S.data,D,S.directed))}}u.nodes(o);const h=u.force("link");h&&h.id(S=>S.id).links(s),((_=i.layout)==null?void 0:_.type)==="tree"?j.registerForcesOnSimulation(o,s,u,c,i.layout,r,j):((w=i.layout)==null?void 0:w.type)==="egoTree"&&j.registerForcesOnSimulation(o,s,u,c,i.layout,r,_t);let g=i.warmupTicks||Lt;g=g==="auto"?Lt:g,g=g-jt;let d=.3;u.alphaTarget(d);const p=new Date().getTime();let x;for(let S=0;Stn||new Date().getTime()-p>i.cooldownTime||Gt(i,u,d)&&new Date().getTime()-p>i.cooldownTime*.15);++S)S%5===0&&(x=en(S,new Date().getTime()-p,i),postMessage({type:"tick",progress:x,elapsedTime:new Date().getTime()-p})),u.tick();d=0,u.alphaTarget(d),u.alpha(1);for(let S=0;Si.cooldownTime*.15);++S)u.tick(),S%5===0&&(x=en(g+S,new Date().getTime()-p,i),postMessage({type:"tick",progress:x,elapsedTime:new Date().getTime()-p}));postMessage({type:"tick",progress:1,elapsedTime:new Date().getTime()-p}),((b=i.layout)==null?void 0:b.type)==="tree"&&j.simulationDone(o,s,u,i.layout),postMessage({type:"done",nodes:o.map(S=>S.toDict()),edges:s.map(S=>S.toDict())})};function zs(e,t,n,i){var p,x,y,_;const r=e.map(w=>{const b=new Ye(w.id,w.getData(),w.getStyle());return b.weight=w.weight||1,b.setCircleRadius(w.getCircleRadius()),b}),o=new Map(r.map(w=>[w.id,w]));(p=n.layout)==null||p.type;const{simulation:a,simulationForces:u}=et.initSimulationForces(n,i),c=[];for(const w of t){const b=o.get(w.from.id),S=o.get(w.to.id);if(b&&S){const v=w.getStyle()??{};c.push(new Et(w.id,b,S,w.getData(),v,w.directed))}}a.nodes(r);const s=a.force("link");s&&s.id(w=>w.id).links(c),(((x=n.layout)==null?void 0:x.type)==="tree"||((y=n.layout)==null?void 0:y.type)==="egoTree")&&j.registerForcesOnSimulation(r,c,a,u,n.layout,i,j);let h;n.warmupTicks==="auto"||n.warmupTicks==null?h=Lt:h=n.warmupTicks,h=h-jt;let g=.3;a.alphaTarget(g);const d=new Date().getTime();for(let w=0;wtn||new Date().getTime()-d>n.cooldownTime||Gt(n,a,g)&&new Date().getTime()-d>n.cooldownTime*.15);++w)a.tick();g=0,a.alphaTarget(g),a.alpha(1);for(let w=0;wn.cooldownTime*.15);++w)a.tick();return((_=n.layout)==null?void 0:_.type)==="tree"&&j.simulationDone(r,c,a,n.layout),{nodes:r,edges:c}}function en(e,t,n){return t/n.cooldownTime}function Gt(e,t,n){return e.d3AlphaMin>0&&t.alpha()-n{(self.URL||self.webkitURL).revokeObjectURL(t)}),e}catch{return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(mr),{name:i==null?void 0:i.name})}finally{t&&(self.URL||self.webkitURL).revokeObjectURL(t)}}function Qc(){return new Kc}const Jc=(i,t,e,n,r)=>new Promise((s,o)=>{const a=Qc();a.postMessage({source:"simulation-worker-wrapper",nodes:i,edges:t,options:e,canvasBCR:n}),a.onmessage=c=>{const{type:l,progress:h,nodes:u,edges:d,elapsedTime:p}=c.data;if(l==="tick"&&typeof h=="number"){r==null||r(h,p);return}l==="done"&&(s({nodes:u,edges:d}),a.terminate())},a.onerror=o});function th(i){var t=0,e=i.children,n=e&&e.length;if(!n)t=1;else for(;--n>=0;)t+=e[n].value;i.value=t}function eh(){return this.eachAfter(th)}function nh(i,t){let e=-1;for(const n of this)i.call(t,n,++e,this);return this}function ih(i,t){for(var e=this,n=[e],r,s,o=-1;e=n.pop();)if(i.call(t,e,++o,this),r=e.children)for(s=r.length-1;s>=0;--s)n.push(r[s]);return this}function rh(i,t){for(var e=this,n=[e],r=[],s,o,a,c=-1;e=n.pop();)if(r.push(e),s=e.children)for(o=0,a=s.length;o=0;)e+=n[r].value;t.value=e})}function ah(i){return this.eachBefore(function(t){t.children&&t.children.sort(i)})}function lh(i){for(var t=this,e=ch(t,i),n=[t];t!==e;)t=t.parent,n.push(t);for(var r=n.length;i!==e;)n.splice(r,0,i),i=i.parent;return n}function ch(i,t){if(i===t)return i;var e=i.ancestors(),n=t.ancestors(),r=null;for(i=e.pop(),t=n.pop();i===t;)r=i,i=e.pop(),t=n.pop();return r}function hh(){for(var i=this,t=[i];i=i.parent;)t.push(i);return t}function uh(){return Array.from(this)}function dh(){var i=[];return this.eachBefore(function(t){t.children||i.push(t)}),i}function ph(){var i=this,t=[];return i.each(function(e){e!==i&&t.push({source:e.parent,target:e})}),t}function*fh(){var i=this,t,e=[i],n,r,s;do for(t=e.reverse(),e=[];i=t.pop();)if(yield i,n=i.children)for(r=0,s=n.length;r=0;--a)r.push(s=o[a]=new ge(o[a])),s.parent=n,s.depth=n.depth+1;return e.eachBefore(bh)}function gh(){return Ve(this).eachBefore(yh)}function mh(i){return i.children}function vh(i){return Array.isArray(i)?i[1]:null}function yh(i){i.data.value!==void 0&&(i.value=i.data.value),i.data=i.data.data}function bh(i){var t=0;do i.height=t;while((i=i.parent)&&i.height<++t)}function ge(i){this.data=i,this.depth=this.height=0,this.parent=null}ge.prototype=Ve.prototype={constructor:ge,count:eh,each:nh,eachAfter:rh,eachBefore:ih,find:sh,sum:oh,sort:ah,path:lh,ancestors:hh,descendants:uh,leaves:dh,links:ph,copy:gh,[Symbol.iterator]:fh};function wh(i,t){return i.parent===t.parent?1:2}function zn(i){var t=i.children;return t?t[0]:i.t}function On(i){var t=i.children;return t?t[t.length-1]:i.t}function xh(i,t,e){var n=e/(t.i-i.i);t.c-=n,t.s+=e,i.c+=n,t.z+=e,t.m+=e}function Ch(i){for(var t=0,e=0,n=i.children,r=n.length,s;--r>=0;)s=n[r],s.z+=t,s.m+=t,t+=s.s+(e+=s.c)}function _h(i,t,e){return i.a.parent===t.parent?i.a:e}function We(i,t){this._=i,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=t}We.prototype=Object.create(ge.prototype);function Mh(i){for(var t=new We(i,0),e,n=[t],r,s,o,a;e=n.pop();)if(s=e._.children)for(e.children=new Array(a=s.length),o=a-1;o>=0;--o)n.push(r=e.children[o]=new We(s[o],o)),r.parent=e;return(t.parent=new We(null,0)).children=[t],t}function yr(){var i=wh,t=1,e=1,n=null;function r(l){var h=Mh(l);if(h.eachAfter(s),h.parent.m=-h.z,h.eachBefore(o),n)l.eachBefore(c);else{var u=l,d=l,p=l;l.eachBefore(function(_){_.xd.x&&(d=_),_.depth>p.depth&&(p=_)});var m=u===d?1:i(u,d)/2,v=m-u.x,b=t/(d.x+m+v),y=e/(p.depth||1);l.eachBefore(function(_){_.x=(_.x+v)*b,_.y=_.depth*y})}return l}function s(l){var h=l.children,u=l.parent.children,d=l.i?u[l.i-1]:null;if(h){Ch(l);var p=(h[0].z+h[h.length-1].z)/2;d?(l.z=d.z+i(l._,d._),l.m=l.z-p):l.z=p}else d&&(l.z=d.z+i(l._,d._));l.parent.A=a(l,d,l.parent.A||u[0])}function o(l){l._.x=l.z+l.parent.m,l.m+=l.parent.m}function a(l,h,u){if(h){for(var d=l,p=l,m=h,v=d.parent.children[0],b=d.m,y=p.m,_=m.m,E=v.m,x;m=On(m),d=zn(d),m&&d;)v=zn(v),p=On(p),p.a=l,x=m.z+_-d.z-b+i(m._,d._),x>0&&(xh(_h(m,l,u),l,x),b+=x,y+=x),_+=m.m,b+=d.m,E+=v.m,y+=p.m;m&&!On(p)&&(p.t=m,p.m+=_-y),d&&!zn(v)&&(v.t=d,v.m+=b-E,u=l)}return u}function c(l){l.x*=t,l.y=l.depth*e}return r.separation=function(l){return arguments.length?(i=l,r):i},r.size=function(l){return arguments.length?(n=!1,t=+l[0],e=+l[1],r):n?null:[t,e]},r.nodeSize=function(l){return arguments.length?(n=!0,t=+l[0],e=+l[1],r):n?[t,e]:null},r}function me(i,t){const e={};for(const o of i)e[o.id]=[];for(const{source:o,target:a}of t)e[o.id]||(e[o.id]=[]),e[o.id].push(a.id);const n=new Set,r=new Set,s=o=>{if(!n.has(o)&&(n.add(o),r.add(o),e[o]))for(const a of e[o]){if(!n.has(a)&&s(a))return!0;if(r.has(a))return!0}return r.delete(o),!1};return i.some(o=>s(o.id))}function br(i,t){const e=new Set(t.map(n=>n.target.id));for(const n of i)if(!e.has(n.id))return n;return i[0]}function Sh(i,t){const e=new Map;for(const c of i)e.set(c.id,[]);for(const c of t)e.get(c.from.id)||console.log(c),e.get(c.from.id).push(c.to);const n=new Map,r=new Map;function s(c,l=new Set){if(r.has(c))return new Set(r.get(c));const h=new Set;for(const u of e.get(c.id)??[])if(!l.has(u)){l.add(u),h.add(u);const d=s(u,l);for(const p of d)h.add(p)}return r.set(c,h),n.set(c,h.size),h}for(const c of i)n.has(c)||s(c);let o=null,a=-1;for(const c of i){const l=n.get(c)??0;l>a&&(a=l,o=c)}return o??i[0]}function Eh(i,t){const e=new Map,n=new Map;for(const l of i)e.set(l.id,[]),n.set(l.id,0);for(const l of t)l.directed!==!1&&(e.get(l.from.id).push(l.to),n.set(l.to.id,(n.get(l.to.id)||0)+1));const r=[],s=i.filter(l=>n.get(l.id)===0);for(;s.length;){const l=s.shift();r.push(l);for(const h of e.get(l.id))n.set(h.id,n.get(h.id)-1),n.get(h.id)===0&&s.push(h)}if(r.length!==i.length)return console.warn("Graph has a cycle! Min-max distance root undefined."),i[0];const o=new Map;for(let l=r.length-1;l>=0;l--){const h=r[l];let u=0;for(const d of e.get(h.id))u=Math.max(u,1+(o.get(d.id)||0));o.set(h.id,u)}let a=null,c=1/0;for(const l of i){const h=o.get(l.id);hn.get(l.id)===0);for(;s.length;){const l=s.shift();r.push(l);for(const h of e.get(l.id))n.set(h.id,n.get(h.id)-1),n.get(h.id)===0&&s.push(h)}if(r.length!==i.length)return console.warn("Graph has a cycle! Cannot minimize DAG height."),i[0];const o=new Map;for(let l=r.length-1;l>=0;l--){const h=r[l];let u=0;for(const d of e.get(h.id))u=Math.max(u,1+(o.get(d.id)??0));o.set(h.id,u)}let a=null,c=1/0;for(const l of i){const h=o.get(l.id);h{const n=e.from;e.setFrom(e.to),e.setTo(n)}),t}setSizes(){const t=this.graph.renderer.getCanvas();if(!t)throw new Error("Canvas element is not defined in the graph renderer.");this.canvasBCR=t.getBoundingClientRect()}setNodePositions(t,e){for(const n of t){const r=this.graph.getMutableNode(n.data.id);if(r)if(e.radial){const s=n.x??0,o=n.y??0;r.x=o*Math.cos(s-Math.PI/2),r.y=o*Math.sin(s-Math.PI/2),r.fx=r.x,r.fy=r.y}else e.horizontal?(r.x=n.y,r.fx=n.y,r.y=n.x,delete r.fy):(r.x=n.x,r.y=n.y,r.fy=n.y,delete r.fx)}}unsetNodePositions(){this.graph.getMutableNodes().forEach(t=>{delete t.fy,delete t.fx})}registerForces(){const t=this.options.strength??.1;if(this.options.radial){const e=ar(n=>(this.levels[n.id]??1)*100,0,0).strength(t);this.simulation.force("tree-radial",e)}else this.simulation.force("tree-y",cr(e=>{var n,r;return this.options.horizontal?((n=this.positionedNodesByID.get(e.id))==null?void 0:n.x)??0:((r=this.positionedNodesByID.get(e.id))==null?void 0:r.y)??0}).strength(t)),this.simulation.force("tree-x",lr(e=>{var n,r;return this.options.horizontal?((n=this.positionedNodesByID.get(e.id))==null?void 0:n.y)??0:((r=this.positionedNodesByID.get(e.id))==null?void 0:r.x)??0}).strength(t));nt.adjustOtherSimulationForces(this.simulationForces,this.options)}unregisterLayout(){this.unregisterForces(),this.unsetNodePositions()}unregisterForces(){this.simulation.force("tree-radial",null),this.simulation.force("tree-y",null),this.simulation.force("tree-x",null),nt.resetOtherSimulationForces(this.simulationForces,this.originalForceStrength)}static registerForcesOnSimulation(t,e,n,r,s,o,a=this){const c=Yt({},Bn,s),l=c.strength??.1,h=o.width,u=o.height,d=[h/2,u/2];if(me(t,e))return;const{levels:p}=a.buildLevelsStatic(t,e,void 0,c.rootIdAlgorithmFinder),{nodeById:m}=a.buildTreeStatic(t,e,c,o);if(c.radial){const v=ar(b=>(p[b.id]??1)*100,d[0],d[1]).strength(l);n.force("tree-radial",v)}else n.force("tree-y",cr(v=>{var b,y;return c.horizontal?((b=m.get(v.id))==null?void 0:b.x)??0:((y=m.get(v.id))==null?void 0:y.y)??0}).strength(l)),n.force("tree-x",lr(v=>{var b,y;return c.horizontal?((b=m.get(v.id))==null?void 0:b.y)??0:((y=m.get(v.id))==null?void 0:y.x)??0}).strength(l));a.adjustOtherSimulationForces(r,c)}static adjustOtherSimulationForces(t,e){e!=null&&e.radial?(t.link.strength(0),t.charge.strength(0),t.gravity.strength(0)):(t.link.strength(0),t.charge.strength(0),t.gravity.strength(1e-5))}static resetOtherSimulationForces(t,e){t.link.strength(e.link),t.charge.strength(e.charge),t.gravity.strength(e.gravity)}static simulationDone(t,e,n,r){const s=Yt({},Bn,r);for(const o of t)s.radial?(o.fx=o.x,o.fy=o.y):s.horizontal?(o.fx=o.x,delete o.fy):(o.fy=o.y,delete o.fx)}buildTree(t,e,n,r){return nt.buildTreeStatic(t,e,n,r)}static buildTreeStatic(t,e,n,r){if(!t.length)return{root:null,nodes:[],nodeById:new Map};if(me(t,e))return console.warn("Cycle detected in graph. Tree layout will not be computed."),{root:null,nodes:[],nodeById:new Map};const s=new Map;for(const v of t){const b=v;b.children=[],s.set(v.id,b)}for(const v of e){const b=s.get(v.source.id),y=s.get(v.target.id);b&&y&&(b.children.push(y),y.parent=b)}const o=n.rootId||nt.findRootId(t,e,n.rootIdAlgorithmFinder),a=s.get(o);if(!a)throw new Error(`Root node with id "${o}" not found.`);const c=n.radialGap,l=n.radial?2*Math.PI:r.width,h=n.radial?c:r.height,u=yr();n.radial?u.size([l,h]):u.size([l,h]).separation((v,b)=>{var _,E;const y=((E=(_=v.parent)==null?void 0:_.children)==null?void 0:E.length)??1;return v.parent===b.parent?1.5/y:1.5});const d=Ve(a),p=u(d),m=new Map;return p.descendants().forEach(v=>{m.set(v.data.id,v)}),{root:p,nodes:p.descendants(),nodeById:m}}buildLevels(t,e,n,r){return nt.buildLevelsStatic(t,e,n,r)}static buildLevelsStatic(t,e,n,r){if(!t.length)return{levels:{},maxDepth:0,nodeCountPerLevel:{}};const s=n||nt.findRootId(t,e,r),o={[s]:0},a={};for(const d of t)a[d.id]=[];for(const{source:d,target:p}of e)a[d.id].push(p.id);const c=[s];let l=0;for(;l{var _,E;const y=((E=(_=v.parent)==null?void 0:_.children)==null?void 0:E.length)??1;return v.parent===b.parent?1.5/y:1.5});const d=Ve(a),p=u(d),m=new Map;return p.descendants().forEach(v=>{m.set(v.data.id,v)}),{root:p,nodes:p.descendants(),nodeById:m}}}const Ht={d3Alpha:1,d3AlphaMin:.001,d3AlphaDecay:.05,d3AlphaTarget:0,d3VelocityDecay:.45,d3LinkDistance:40,d3LinkStrength:null,d3ManyBodyStrength:-150,d3ManyBodyTheta:.9,d3CollideRadius:12,d3CollideStrength:1,d3CollideIterations:1,d3GravityStrength:.1,enabled:!0,cooldownTime:2e3,useWorker:!0,warmupTicks:"auto",freezeNodesOnDrag:!0,layout:{type:"force"},callbacks:{onInit:()=>{},onStart:()=>{},onStop:()=>{},onTick:()=>{}}};class Pt{constructor(t,e={}){f(this,"simulation");f(this,"graph");f(this,"canvas");f(this,"graphInteraction");f(this,"layout");f(this,"canvasBCR");f(this,"animationFrameId",null);f(this,"startSimulationTime",0);f(this,"engineRunning",!1);f(this,"slowTickThresholdReached",!1);f(this,"lastTickTime",0);f(this,"avgTickDuration",0);f(this,"SLOW_TICK_THRESHOLD",50);f(this,"dragInProgress",!1);f(this,"dragSelection",[]);f(this,"totalTickCount",0);f(this,"options");f(this,"callbacks");f(this,"simulationForces");f(this,"scaledForces",{d3ManyBodyStrength:Ht.d3ManyBodyStrength,d3CollideStrength:Ht.d3CollideStrength});if(this.graph=t,this.options=Yt({},Ht,e),this.callbacks=this.options.callbacks??{},this.canvas=this.graph.renderer.getCanvas(),!this.canvas)throw new Error("Canvas element is not defined in the graph renderer.");if(this.canvasBCR=this.canvas.getBoundingClientRect(),this.graphInteraction=this.graph.renderer.getGraphInteraction(),!this.graphInteraction)throw new Error("Graph interaction is not available.");const n=Pt.initSimulationForces(this.options,this.canvasBCR);this.simulation=n.simulation,this.simulationForces=n.simulationForces,this.scaledForces.d3ManyBodyStrength=this.options.d3ManyBodyStrength||Ht.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=this.options.d3CollideStrength||Ht.d3CollideStrength,this.options.layout.type==="tree"?this.layout=new nt(this.graph,this.simulation,this.simulationForces,this.options.layout):this.options.layout.type==="egoTree"&&(this.layout=new ve(this.graph,this.simulation,this.simulationForces,this.options.layout)),this.callbacks.onInit&&this.callbacks.onInit(this)}static initSimulationForces(t,e){const n={link:pc(),charge:Cc(),collide:uc(),gravity:Zc()},r=xc().force("link",n.link).force("charge",n.charge).force("collide",n.collide).force("gravity",n.gravity);return this.initSimulationForceGravity(n.gravity,t,e),this.initSimulationForceLink(n.link,t),this.initSimulationForceCharge(n.charge,t),this.initSimulationForceCollide(n.collide,t),r.alphaMin(t.d3AlphaMin),r.alphaDecay(t.d3AlphaDecay),r.alphaTarget(0),r.velocityDecay(t.d3VelocityDecay),{simulation:r,simulationForces:n}}static initSimulationForceGravity(t,e,n){t.x(n.width/2).y(n.height/2).strength(r=>(r.degree()??0)===0?e.d3GravityStrength:.001)}static initSimulationForceLink(t,e){t.distance(n=>{const r=pr(n);if(!r||r==="")return e.d3LinkDistance;const s=r.length*10;return Math.max(e.d3LinkDistance,s)}),e.d3LinkStrength&&t.strength(e.d3LinkStrength)}static initSimulationForceCharge(t,e){t.theta(e.d3ManyBodyTheta).strength(n=>{const r=n,s=e.d3ManyBodyStrength,o=r.getCircleRadius(),a=10+Math.sqrt(o-10);let c=r.weight??1;return c*=r.isParent?10:1,s*(a*a)/100*c})}static initSimulationForceCollide(t,e){t.radius(n=>{const r=n;return r.expanded?1.2*r.getCircleRadius()+20:r.getCircleRadius()?1.2*r.getCircleRadius():e.d3CollideRadius}).strength(e.d3CollideStrength)}static initSimulationForceClusterRadialConstraint(t,e){t.strength(e.d3CollideStrength)}update(){this.layout&&this.layout.update();const t=this.graph.getMutableNodes().filter(n=>n.visible);this.simulation.nodes(t);const e=this.simulation.force("link");e&&e.id(n=>n.id).links(this.getActiveEdges()),this.restart()}getActiveEdges(){const t=this.graph.getMutableEdges().filter(n=>{if(!n.visible)return!1;const r=n.source,s=n.target;return!(r.isChild||s.isChild)}),e=this.getClusterLinks();return[...t,...e]}getClusterLinks(){return this.graph.getMutableEdges().filter(e=>e.visible)}scaleSimulationOptions(){const t=Pt.scaleSimulationOptions(this.options,this.canvasBCR,this.graph.getNodeCount());this.scaledForces.d3ManyBodyStrength=t.d3ManyBodyStrength??Ht.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=t.d3CollideStrength??Ht.d3CollideStrength}static scaleSimulationOptions(t,e,n){const r=n/(e.width*e.height),s=Math.min(2,75e-6/r);return{d3ManyBodyStrength:t.d3ManyBodyStrength*s,d3CollideStrength:t.d3ManyBodyStrength*s}}applyScalledSimulationOptions(){Pt.initSimulationForceCharge(this.simulationForces.charge,this.options),Pt.initSimulationForceCollide(this.simulationForces.collide,this.options)}enable(){this.avgTickDuration=0,this.options.enabled=!0,this.start(!1)}disable(){this.options.enabled=!1,this.stop()}pause(){this.engineRunning=!1,this.slowTickThresholdReached=!1}restart(){this.startSimulationTime=new Date().getTime(),this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1}async start(t=!0){if(t&&await this.runSimulationWorkerRouter(),!this.options.enabled){this.engineRunning=!1;return}this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1,this.callbacks.onStart&&this.callbacks.onStart(this),this.animationFrameId===null&&this.startAnimationLoop()}stop(){this.engineRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.simulation.stop(),this.callbacks.onStop&&this.callbacks.onStop(this)}startAnimationLoop(){const t=()=>{this.animationFrameId=requestAnimationFrame(t),this.simulationTick()};this.engineRunning=!0,this.simulation.alpha(.01).restart(),this.animationFrameId=requestAnimationFrame(t)}simulationTick(){this.engineRunning&&(!this.dragInProgress&&(new Date().getTime()-this.startSimulationTime>this.options.cooldownTime||this.options.d3AlphaMin>0&&this.simulation.alpha()this.SLOW_TICK_THRESHOLD&&(this.slowTickThresholdReached=!0,this.disable(),(n=this.graph.UIManager.graphControls)==null||n.updatePhysicSimulationIndicator(!1),this.graph.UIManager.showNotification({level:"warning",title:"Physics engine running slow",message:"The physic has been disabled."}))}async waitForSimulationStop(){if(this.engineRunning)return new Promise(t=>{const e=this.callbacks.onStop;this.callbacks.onStop=n=>{e==null||e(n),this.callbacks.onStop=e,t()}})}isEnabled(){return this.options.enabled}async computeGraph(t={}){var h;const{runSimulation:e}=await Promise.resolve().then(()=>Bu),n=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!n)return;const r=this.graph.getMutableNodes(),s=this.graph.getNodes().map(u=>(u.fx=void 0,u.fy=void 0,u)),o=this.graph.getEdges(),{callbacks:a,...c}=this.options;Object.assign(c,t);const{nodes:l}=e(s,o,c,n);l.forEach((u,d)=>{r[d].x=u.x,r[d].y=u.y,u.fx?r[d].fx=u.fx:r[d].fx=void 0,u.fy?r[d].fy=u.fy:r[d].fy=void 0}),this.graph.updateData(r,void 0,!1)}async runSimulationWorkerRouter(t={}){this.options.useWorker?await this.runSimulationWorker(t):(await this.computeGraph(t),this.graph.updateLayoutProgress(100,0,"done"))}async runSimulationWorker(t={}){var h;const e=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!e)return;const n=this.graph.getMutableNodes(),r=this.graph.getNodes().map(u=>(u.fx=void 0,u.fy=void 0,u)),s=this.graph.getEdges(),o=(u,d)=>{this.graph.updateLayoutProgress(u,d,"simulation")},{callbacks:a,...c}=this.options;Object.assign(c,t);const{nodes:l}=await Jc(r,s,c,e,o);this.graph.updateLayoutProgress(100,0,"rendering"),l.forEach((u,d)=>{n[d].x=u.x,n[d].y=u.y,u.fx?n[d].fx=u.fx:n[d].fx=void 0,u.fy?n[d].fy=u.fy:n[d].fy=void 0}),this.graph.updateData(n,void 0,!1),this.graph.updateLayoutProgress(100,0,"done")}reheat(t=.7){this.restart(),this.simulation.alpha(t).restart()}createDragBehavior(){return Bl().on("start.draggedelement",(t,e)=>{this.graphInteraction.hasActiveMultiselection()?this.dragSelection=this.graphInteraction.getSelectedNodes().map(n=>{const{node:r}=n;return r.freeze(),{node:r,dx:r.x-e.x,dy:r.y-e.y}}):(this.dragSelection=[],e.freeze())}).on("drag.draggedelement",(t,e)=>{if(!this.dragInProgress&&this.isEnabled()&&(this.dragInProgress=!0,this.restart(),this.simulation.alphaTarget(.3).restart()),this.graphInteraction.hasActiveMultiselection()?this.dragSelection.forEach(({node:n,dx:r,dy:s})=>{n.fx=t.x+r,n.fy=t.y+s,n.x=t.x+r,n.y=t.y+s}):(e.fx=t.x,e.fy=t.y,e.x=t.x,e.y=t.y),this.graphInteraction.dragging(t.sourceEvent,t.subject),!this.engineRunning||!this.isEnabled()){const n=this.graphInteraction.hasActiveMultiselection()?this.dragSelection.map(r=>r.node):[e];this.graph.nextTickFor(n)}}).on("end.draggedelement",(t,e)=>{!t.active&&this.dragInProgress&&(this.dragInProgress=!1,this.restart(),this.simulation.alphaTarget(this.options.d3AlphaTarget).restart()),this.options.freezeNodesOnDrag||(this.graphInteraction.hasActiveMultiselection()?(this.dragSelection.forEach(({node:n})=>n.unfreeze()),this.dragSelection=[]):e.unfreeze()),this.graphInteraction.dragended(t.sourceEvent,t.subject)})}isDragging(){return this.dragInProgress}getForceSimulation(){return this.simulationForces}getSimulation(){return this.simulation}async changeLayout(t,e={}){var n;this.layout&&((n=this.layout)==null||n.unregisterLayout(),this.layout=void 0),e=e??{},e.layout=e.layout??{},e.layout.type=t,t==="force"?this.applyScalledSimulationOptions():t==="tree"&&(this.layout=new nt(this.graph,this.simulation,this.simulationForces,e.layout)),this.options.layout.type=t,this.update(),this.pause(),await this.runSimulationWorkerRouter(e),this.restart(),await this.waitForSimulationStop(),this.graph.renderer.fitAndCenter()}}const Nh='',Ah='',Th=' ',Ih=` + +`,Lh=` + +`,Dh=` + +`,Ph='',Fh='',zh='',Rn='',Hn='',Gn='',$n='',qn='',jn='',wr='',xr='',Cr='',Oh=` + +`,Bh=` + +`,Rh=` + +`,Xe=i=>` + + + + +`,_r=i=>``,Hh=' ',Mr=``,Sr=` + +`,Gh='',$h=` + + + + +`,qh=` + + + + +`,jh='',Uh='',Vh='',Wh='',Xh='',Zt='',Un='',Yh='',Er='',Zh='',Vn='',kr='',Nr='',Kh='',Qh='',Jh='',tu='';function Kt(i,t){if(Array.isArray(i)&&Array.isArray(t))return[...i,...t];if(typeof i=="object"&&typeof t=="object"&&i&&t){const e={...i};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(n in i?e[n]=Kt(i[n],t[n]):e[n]=t[n]);return e}return t}const eu={topbar:[{title:"Pin Nodes",svgIcon:Zt,variant:"outline-primary",visible:!0,onclick(i,t){t.forEach(e=>{e.freeze()})}},{title:"Unpin Node",svgIcon:Un,variant:"outline-primary",visible:!0,onclick(i,t){t.forEach(e=>{e.unfreeze(),this.uiManager.graph.simulation.reheat()})}},{title:"Hide Nodes",svgIcon:Vn,variant:"outline-danger",visible:!0,flushRight:!0,onclick(i,t){t.forEach(e=>{this.uiManager.graph.queryEngine.excludeNode(e),this.uiManager.graph.renderer.getGraphInteraction().unselectAll()})}}],menu:[{text:"Expand Nodes",title:"Expand Node",svgIcon:Nr,variant:"outline-primary",visible:!1},{text:"Pin Nodes",title:"Pin Nodes",svgIcon:Zt,variant:"outline-primary",visible:!0,onclick(i,t){t.forEach(e=>{e.freeze()})}}]};class nu{constructor(t){f(this,"uiManager");f(this,"navigation");f(this,"selectionMenu");f(this,"layoutMenu");f(this,"selectionMenuShown",!1);f(this,"menuNode");f(this,"layoutTypeOptions",[{root:{id:"pvt-graphcontrols-simulation-toggle",class:"",title:"Toggle graph physic simulation",svgIcon:jn,onClick:()=>{this.togglePhysicSimulation()}},children:[{id:"pvt-graphcontrols-simulation-stop",class:"",title:"Stop graph physic simulation",svgIcon:wr,onClick:()=>{this.togglePhysicSimulation(!1)}},{id:"pvt-graphcontrols-simulation-start",class:"",title:"Start graph physic simulation",svgIcon:jn,onClick:()=>{this.togglePhysicSimulation(!0)}}]},{root:{id:"pvt-graphcontrols-layout-organic",class:"",title:"Change Graph Layout to Organic",svgIcon:Th,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force")}},children:[{id:"pvt-graphcontrols-layout-organic-5",class:"",title:"Run Organic Layout for 5 seconds. Or until it stabilises",svgIcon:Ph,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force",{cooldownTime:5e3})}},{id:"pvt-graphcontrols-layout-organic-10",class:"",title:"Run Organic Layout for 10 seconds. Or until it stabilises",svgIcon:Fh,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force",{cooldownTime:1e4})}},{id:"pvt-graphcontrols-layout-organic-15",class:"",title:"Run Organic Layout for 15 seconds. Or until it stabilises",svgIcon:zh,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force",{cooldownTime:15e3})}}]},{root:{id:"pvt-graphcontrols-layout-tree-v",class:"pvt-graphcontrols-layout-tree-v-options",title:"Change Graph Layout to Vertical Tree",svgIcon:Ih,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1}})}},children:[{id:"pvt-graphcontrols-layout-tree-v-FirstZeroInDegree",class:"pvt-graphcontrols-layout-tree-v-options",title:"Pick the first valid 0 in-degree node",svgIcon:Rn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"FirstZeroInDegree"}})}},{id:"pvt-graphcontrols-layout-tree-v-MaxReachability",class:"pvt-graphcontrols-layout-tree-v-options",title:"Pick the most connected node based on the reachability to others",svgIcon:Hn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MaxReachability"}})}},{id:"pvt-graphcontrols-layout-tree-v-MinMaxDistance",class:"pvt-graphcontrols-layout-tree-v-options",title:"Minimize max distance by trying to balance subtree",svgIcon:Gn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MinMaxDistance"}})}},{id:"pvt-graphcontrols-layout-tree-v-MinHeight",class:"pvt-graphcontrols-layout-tree-v-options",title:"Pick node minimizing tree height",svgIcon:$n,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MinHeight"}})}},{id:"pvt-graphcontrols-layout-tree-v-FlipEdgeDirection",class:"pvt-graphcontrols-layout-tree-v-options",title:"Flip the direction of all edges, then pick the most connected node based on the reachability to others",svgIcon:qn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MaxReachability",flipEdgeDirection:!0}})}}]},{root:{id:"pvt-graphcontrols-layout-tree-h",class:"pvt-graphcontrols-layout-tree-h-options",title:"Change Graph Layout to Horizontal Tree",svgIcon:Lh,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0}})}},children:[{id:"pvt-graphcontrols-layout-tree-h-FirstZeroInDegree",class:"pvt-graphcontrols-layout-tree-h-options",title:"Pick the first valid 0 in-degree node",svgIcon:Rn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"FirstZeroInDegree"}})}},{id:"pvt-graphcontrols-layout-tree-h-MaxReachability",class:"pvt-graphcontrols-layout-tree-h-options",title:"Pick the most connected node based on the reachability to others",svgIcon:Hn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MaxReachability"}})}},{id:"pvt-graphcontrols-layout-tree-h-MinMaxDistance",class:"pvt-graphcontrols-layout-tree-h-options",title:"Minimize max distance by trying to balance subtree",svgIcon:Gn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MinMaxDistance"}})}},{id:"pvt-graphcontrols-layout-tree-h-MinHeight",class:"pvt-graphcontrols-layout-tree-h-options",title:"Pick node minimizing tree height",svgIcon:$n,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MinHeight"}})}},{id:"pvt-graphcontrols-layout-tree-h-FlipEdgeDirection",class:"pvt-graphcontrols-layout-tree-h-options",title:"Flip the direction of all edges, then pick the most connected node based on the reachability to others",svgIcon:qn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MaxReachability",flipEdgeDirection:!0}})}}]},{root:{id:"pvt-graphcontrols-layout-tree-r",class:"pvt-graphcontrols-layout-tree-r-options",title:"Change Graph Layout to Radial Tree",svgIcon:Dh,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0}})}},children:[{id:"pvt-graphcontrols-layout-tree-r-FirstZeroInDegree",class:"pvt-graphcontrols-layout-tree-r-options",title:"Pick the first valid 0 in-degree node",svgIcon:Rn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"FirstZeroInDegree"}})}},{id:"pvt-graphcontrols-layout-tree-r-MaxReachability",class:"pvt-graphcontrols-layout-tree-r-options",title:"Pick the most connected node based on the reachability to others",svgIcon:Hn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MaxReachability"}})}},{id:"pvt-graphcontrols-layout-tree-r-MinMaxDistance",class:"pvt-graphcontrols-layout-tree-r-options",title:"Minimize max distance by trying to balance subtree",svgIcon:Gn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MinMaxDistance"}})}},{id:"pvt-graphcontrols-layout-tree-r-MinHeight",class:"pvt-graphcontrols-layout-tree-r-options",title:"Pick node minimizing tree height",svgIcon:$n,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MinHeight"}})}},{id:"pvt-graphcontrols-layout-tree-r-FlipEdgeDirection",class:"pvt-graphcontrols-layout-tree-r-options",title:"Flip the direction of all edges, then pick the most connected node based on the reachability to others",svgIcon:qn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MaxReachability",flipEdgeDirection:!0}})}}]}]);this.uiManager=t,this.menuNode=Kt(eu,this.uiManager.getOptions().selectionMenu.menuNode??{})}mount(t){if(!t)return;const e=document.createElement("template");e.innerHTML=` +
+
+
+
+
+
+
+
+`,this.navigation=e.content.firstElementChild,t.appendChild(this.navigation)}destroy(){var t;(t=this.navigation)==null||t.remove(),this.navigation=void 0}afterMount(){this.navigation&&(this.selectionMenu=this.navigation.querySelector(".pvt-graphcontrols-selection"),this.layoutMenu=this.navigation.querySelector(".pvt-graphcontrols-layout"),this.createLayoutOptionAndBind(this.layoutTypeOptions))}graphReady(){if(!this.navigation)return;const t=this.uiManager.graph.getNodes(),e=this.uiManager.graph.getEdges();me(t,e)?(this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-v-options").forEach(n=>{n.setAttribute("disabled","disabled"),n.setAttribute("data-old-title",n.getAttribute("title")??""),n.setAttribute("title","The graph contains a cycle, so it cannot be displayed as a tree.")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-h-options").forEach(n=>{n.setAttribute("disabled","disabled"),n.setAttribute("data-old-title",n.getAttribute("title")??""),n.setAttribute("title","The graph contains a cycle, so it cannot be displayed as a tree.")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-r-options").forEach(n=>{n.setAttribute("disabled","disabled"),n.setAttribute("data-old-title",n.getAttribute("title")??""),n.setAttribute("title","The graph contains a cycle, so it cannot be displayed as a tree.")})):(this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-v-options").forEach(n=>{n.removeAttribute("disabled"),n.setAttribute("title",n.getAttribute("data-old-title")??n.getAttribute("title")??"")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-h-options").forEach(n=>{n.removeAttribute("disabled"),n.setAttribute("title",n.getAttribute("data-old-title")??n.getAttribute("title")??"")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-r-options").forEach(n=>{n.removeAttribute("disabled"),n.setAttribute("title",n.getAttribute("data-old-title")??n.getAttribute("title")??"")})),this.uiManager.graph.renderer.getGraphInteraction().on("selectNodes",n=>{this.populateNodeSelectionContainer(n),this.showSelectionMenu()}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectNodes",()=>{this.hideSelectionMenu(),setTimeout(this.clearSelectionContainer,200)})}showSelectionMenu(){this.selectionMenuShown||this.selectionMenu&&(this.selectionMenu.classList.add("shown"),this.selectionMenuShown=!0)}hideSelectionMenu(){this.selectionMenuShown&&this.selectionMenu&&(this.selectionMenu.classList.remove("shown"),this.selectionMenuShown=!1)}populateNodeSelectionContainer(t){if(!this.navigation||!this.selectionMenu)return;const e=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-title"),n=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-topbar"),r=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-mainmenu"),s=this.getNodesFromSelection(t);e.innerHTML="",n.innerHTML="",r.innerHTML="",e.textContent=`${s.length} nodes selected`,n.appendChild(_e(this,this.menuNode.topbar,s)),r.appendChild(Me(this,this.menuNode.menu,s))}clearSelectionContainer(){if(!this.navigation||!this.selectionMenu)return;const t=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-title"),e=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-topbar"),n=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-mainmenu");t.innerHTML="",e.innerHTML="",n.innerHTML=""}getNodesFromSelection(t){return t.map(e=>{const{node:n}=e;return n})}createLayoutOptionAndBind(t){t.forEach((e,n)=>{if(!this.layoutMenu)return;n>0&&this.layoutMenu.appendChild(I("div",{class:"pivotick-divider"},[]));const r=e.root,s=e.children,o=I("div",{},[this.createLayoutOption(r)]),a=this.createLayoutOptionMenu(s),c=I("div",{class:"pvt-graphcontrols-layout-type-container"},[o,a]);this.layoutMenu.appendChild(c);const l=c.querySelector(`#${r.id}`);l&&typeof r.onClick=="function"&&l.addEventListener("click",r.onClick),s.forEach(h=>{const u=a.querySelector(`#${h.id}`);u&&typeof h.onClick=="function"&&u.addEventListener("click",h.onClick)})})}createLayoutOptionMenu(t){const e=I("div",{class:["pvt-graphcontrols-layout-type-options"]});return t.forEach(n=>{const r=this.createLayoutOption(n);e.appendChild(r)}),e}createLayoutOption(t){return I("button",{id:t.id,class:t.class,title:t.title},[t.html?t.html():X({svgIcon:t.svgIcon})])}togglePhysicSimulation(t){const e=this.uiManager.graph.simulation;if(!e)return;t??!e.isEnabled()?(e.enable(),this.updatePhysicSimulationIndicator(!0)):(this.updatePhysicSimulationIndicator(!1),e.disable())}updatePhysicSimulationIndicator(t){const e=this.layoutMenu.querySelector("#pvt-graphcontrols-simulation-toggle"),n=e.querySelector(".pvt-icon");!e||!n||(t?n.outerHTML=X({svgIcon:jn}).outerHTML:n.outerHTML=X({svgIcon:wr}).outerHTML)}}class iu{constructor(t){f(this,"uiManager");f(this,"navigation");this.uiManager=t}mount(t){if(!t)return;const e=document.createElement("template");e.innerHTML=` +
+
+ +
+
+ +
+ +
+
+`,this.navigation=e.content.firstElementChild,t.appendChild(this.navigation)}destroy(){var t;(t=this.navigation)==null||t.remove(),this.navigation=void 0}afterMount(){if(!this.navigation)return;const t=this.navigation.querySelector("#pvt-graphnavigation-zoom-in"),e=this.navigation.querySelector("#pvt-graphnavigation-zoom-out"),n=this.navigation.querySelector("#pvt-graphnavigation-reset");t==null||t.addEventListener("click",()=>{this.uiManager.graph.renderer.zoomIn()}),e==null||e.addEventListener("click",()=>{this.uiManager.graph.renderer.zoomOut()}),n==null||n.addEventListener("click",()=>{this.uiManager.graph.renderer.fitAndCenter()})}graphReady(){}}class ru{constructor(){f(this,"layout");f(this,"canvas");f(this,"sidebar");f(this,"toolbar");f(this,"notification");f(this,"modal");f(this,"slidePanel");f(this,"graphnavigation");f(this,"graphcontrols")}mount(t,e="full"){this.layout=document.createElement("div"),this.layout.className=`pvt-layout mode-${e}`,this.canvas=document.createElement("div"),this.canvas.className="pvt-canvas",this.layout.appendChild(this.canvas),this.notification=document.createElement("div"),this.notification.className="pvt-notification",this.canvas.appendChild(this.notification),e==="full"&&(this.sidebar=document.createElement("div"),this.sidebar.className="pvt-sidebar",this.layout.appendChild(this.sidebar)),(e==="light"||e==="full")&&(this.toolbar=document.createElement("div"),this.toolbar.className="pvt-toolbar",this.layout.appendChild(this.toolbar),this.modal=document.createElement("div"),this.modal.className="pvt-modalcontainer",t.appendChild(this.modal),this.slidePanel=document.createElement("div"),this.slidePanel.className="pvt-slidepanel-container",this.canvas.appendChild(this.slidePanel)),e!=="static"&&(this.graphnavigation=document.createElement("div"),this.graphnavigation.className="pvt-graphnavigation",this.canvas.appendChild(this.graphnavigation),this.graphcontrols=document.createElement("div"),this.graphcontrols.className="pvt-graphcontrols",this.canvas.appendChild(this.graphcontrols)),t.appendChild(this.layout)}destroy(){var t;(t=this.layout)==null||t.remove(),this.layout=void 0}afterMount(){}graphReady(){}}class su{constructor(t){f(this,"uiManager");f(this,"panel");f(this,"renderCb");this.uiManager=t,this.renderCb=typeof this.uiManager.getOptions().mainHeader.render=="function"?this.uiManager.getOptions().mainHeader.render:void 0}mount(t){t&&(this.panel=t)}destroy(){var t;(t=this.panel)==null||t.remove(),this.panel=void 0}afterMount(){this.clearOverview()}graphReady(){this.clearOverview()}renderCustomContent(t){var n;if(!this.panel||!this.renderCb)return;this.panel.innerHTML="";const e=wt(this.renderCb,t);e&&((n=this.panel)==null||n.appendChild(e))}clearOverview(){if(this.panel){if(this.renderCb){this.renderCustomContent(null);return}this.panel.innerHTML="",this.showTotalNodeCount()}}updateNodeOverview(t,e){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t);return}this.panel.innerHTML="";const n=42,r=` +
+
+ +
+
+
+
+
+
+
+
`,s=st(r),o=s.querySelector(".pvt-mainheader-icon"),a=s.querySelector(".pvt-mainheader-nodeinfo-name"),c=s.querySelector(".pvt-mainheader-nodeinfo-subtitle");if(o&&e&&e instanceof SVGGElement){const l=e.cloneNode(!0),h=e.getBBox(),u=n/Math.max(h.width,h.height);l.setAttribute("transform",`translate(${(n-h.width*u)/2-h.x*u}, ${(n-h.height*u)/2-h.y*u}) scale(${u})`),o.appendChild(l)}if(a&&(a.textContent=Rt(t,this.uiManager.getOptions().mainHeader)),c){const l=ur(t,this.uiManager.getOptions().mainHeader);c.textContent=l??""}this.panel.appendChild(s),requestAnimationFrame(()=>{var l,h;(h=(l=this.panel)==null?void 0:l.firstElementChild)==null||h.classList.add("enter-active")})}updateEdgeOverview(t){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t);return}this.panel.innerHTML="";const n=`
+
+ ${Xe(42)} +
+
+
+
+
+
+
+
`,r=st(n),s=r.querySelector(".pvt-mainheader-nodeinfo-name"),o=r.querySelector(".pvt-mainheader-nodeinfo-subtitle");s&&(s.textContent=pe(t,this.uiManager.getOptions().mainHeader)),o&&(o.textContent=dr(t,this.uiManager.getOptions().mainHeader)),this.panel.appendChild(r),requestAnimationFrame(()=>{var a,c;(c=(a=this.panel)==null?void 0:a.firstElementChild)==null||c.classList.add("enter-active")})}updateNodesOverview(t){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t.map(c=>c.node));return}this.panel.innerHTML="";const e=42,n=`
+
+ +
+
+
+
+
+
+
+
`,r=st(n),s=r.querySelector(".pvt-mainheader-icon"),o=r.querySelector(".pvt-mainheader-nodeinfo-name"),a=r.querySelector(".pvt-mainheader-nodeinfo-subtitle");if(s){const c=_r(e),l=st(c);s.appendChild(l)}o&&(o.textContent=`${t.length} nodes selected`),a&&(a.textContent=`Out of ${this.uiManager.graph.getNodeCount()} total`),this.panel.appendChild(r),requestAnimationFrame(()=>{var c,l;(l=(c=this.panel)==null?void 0:c.firstElementChild)==null||l.classList.add("enter-active")})}updateEdgesOverview(t){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t.map(a=>a.edge));return}this.panel.innerHTML="";const n=`
+
+ ${Xe(42)} +
+
+
+
+
+
+
+
`,r=st(n),s=r.querySelector(".pvt-mainheader-nodeinfo-name"),o=r.querySelector(".pvt-mainheader-nodeinfo-subtitle");s&&(s.textContent=`${t.length} edges selected`),o&&(o.textContent=`Out of ${this.uiManager.graph.getEdgeCount()} total`),this.panel.appendChild(r),requestAnimationFrame(()=>{var a,c;(c=(a=this.panel)==null?void 0:a.firstElementChild)==null||c.classList.add("enter-active")})}showTotalNodeCount(){if(!this.panel)return;const t=this.uiManager.graph.getMutableVisibleNodes().length,e=this.uiManager.graph.getMutableVisibleEdges().length;this.panel.textContent=`Showing ${t} nodes and ${e} edges`}}function ou(i,t){const e=t>0?i/t*100:0,n=document.createElement("span");n.style.display="flex",n.style.alignItems="center",n.style.gap="0.5rem",n.style.fontFamily="sans-serif",n.style.fontSize="0.85rem",n.title=`${i} - ${e.toFixed(0)}%`;const r=document.createElement("span");r.classList.add("pivotick-inline-bar-container"),n.appendChild(r);const s=document.createElement("span");return s.classList.add("pivotick-inline-bar-fill"),s.style.width=`${e}%`,s.style.backgroundSize=`${100/(e/100)}% 100%`,r.appendChild(s),n}const Wn="4dfd89de5d25fc9cc4b66c23d84b443af631c7dc",au=6;function Xn(i,t,e){const n=hu(i),r=document.createElement("div");for(const[s,o]of n){const a=I("div",{class:"pvt-aggregated-property-section"}),c=I("span",{class:"pvt-aggregated-property-title"},[`.${s}`]),l=I("div",{class:"pvt-aggregated-property-container"});let h=0;for(const[u,d]of o){if(h>=10){const v=I("div",{},[I("div",{style:"text-align: center; font-weight: 300; font-size: 0.9rem; color: var(--pvt-text-color-5);"},[`... ${o.size-h} more`])]);l.append(v);break}let p="";e&&(p=Yn(u)?"":e(s,u));const m=I("div",{class:"pvt-aggregated-property-row"},[I("span",{class:["pvt-aggregated-property-value",Yn(u)?"":"code-container"]},[I("span",{},[cu(lu(u),d),p])]),I("span",{class:"pvt-aggregated-property-count"},[ou(d,t)])]);l.append(m),h++}a.appendChild(c),a.appendChild(l),r.appendChild(a)}return r}function lu(i){return typeof i=="string"?i:JSON.stringify(i)}function cu(i,t){if(Yn(i)){let e="",n="";return Ar(i)?(e="- empty -",n="The value is empty"):Tr(i)&&(e=`- ${t} other unique values -`,n="All other values are unique"),I("span",{class:"pvt-aggregated-property-value-dim",title:n},[e])}return document.createTextNode(i)}function Ar(i){return i.length===0}function Tr(i){return i===Wn}function Yn(i){return Ar(i)||Tr(i)}function Ir(i){const t=new Map;return i.forEach(e=>{e.forEach(n=>{if((typeof n.name=="string"||typeof n.name=="number"||typeof n.name=="boolean")&&(typeof n.value=="string"||typeof n.value=="number"||typeof n.value=="boolean")){t.has(n.name)||t.set(n.name,new Map);const r=t.get(n.name),s=r.get(n.value)||0;r.set(n.value,s+1)}})}),t}function hu(i,t=!0){const e=new Map;for(const[o,a]of i.entries()){const c=Array.from(a.entries()).sort((l,h)=>h[1]-l[1]);e.set(o,new Map(c))}const n=Array.from(e.entries()).sort((o,a)=>o[1].size-a[1].size),r=new Map(n);if(!t)return r;const s=new Map;for(const[o,a]of r)for(const[c,l]of a){s.has(o)||s.set(o,new Map);const h=s.get(o);if(a.size>au&&l===1){const u=h.get(Wn)||0;h.set(Wn,u+1)}else h.set(c,l)}return s}class uu{constructor(t){f(this,"uiManager");f(this,"panel");f(this,"header");f(this,"body");f(this,"renderCb");this.uiManager=t,this.renderCb=typeof this.uiManager.getOptions().propertiesPanel.render=="function"?this.uiManager.getOptions().propertiesPanel.render:void 0}mount(t){if(!t)return;const e=` +
+
+
+
`;this.panel=st(e),this.header=this.panel.querySelector(".pvt-properties-header-panel"),this.body=this.panel.querySelector(".pvt-properties-body-panel"),t.appendChild(this.panel)}destroy(){var t;(t=this.panel)==null||t.remove(),this.panel=void 0}afterMount(){this.clearProperties()}clearProperties(){if(this.body){if(this.renderCb){this.renderCustomContent(null);return}this.body.innerHTML="",this.hidePanel()}}graphReady(){}renderCustomContent(t){var n;if(!this.body||!this.renderCb)return;this.body.innerHTML="";const e=wt(this.renderCb,t);e&&((n=this.body)==null||n.appendChild(e))}setHeaderBasicNode(){this.header.textContent="Basic Node Properties"}setHeaderBasicEdge(){this.header.textContent="Basic Edge Properties"}setHeaderMultiSelectNode(){this.header.textContent="Aggregated Node Properties"}setHeaderMultiSelectEdge(){this.header.textContent="Aggregated Edge Properties"}showPanel(){this.panel.classList.add("enter-active")}hidePanel(){this.panel.classList.remove("enter-active")}updateNodeProperties(t){if(!this.body)return;if(this.setHeaderBasicNode(),this.showPanel(),this.renderCb){this.renderCustomContent(t);return}const n=st(` +
+
+
+
`),r=n.querySelector(".dl-container");if(r){const s=Pn(t,this.uiManager.getOptions().propertiesPanel);r.append(Ce(s,t))}this.body.innerHTML="",this.body.appendChild(n)}updateEdgeProperties(t){if(!this.body)return;if(this.setHeaderBasicEdge(),this.showPanel(),this.renderCb){this.renderCustomContent(t);return}const n=st(` +
+
+
+
`),r=n.querySelector(".dl-container");if(r){const s=Fn(t,this.uiManager.getOptions().propertiesPanel);r.append(Ce(s,t))}this.body.innerHTML="",this.body.appendChild(n)}updateNodesProperties(t){if(!this.body)return;if(this.setHeaderMultiSelectNode(),this.showPanel(),this.renderCb){this.renderCustomContent(t.map(s=>s.node));return}const n=st(` +
+
+
+
+
`),r=n.querySelector("div.pvt-aggregated-properties");if(r){const s=[];t.forEach(c=>{const{node:l}=c,h=Pn(l,this.uiManager.getOptions().propertiesPanel);s.push(h)});const o=Ir(s),a=Xn(o,t.length,this.genActionButtons.bind(this));r.appendChild(a)}this.body.innerHTML="",this.body.appendChild(n)}updateEdgesProperties(t){if(!this.body)return;if(this.setHeaderMultiSelectEdge(),this.showPanel(),this.renderCb){this.renderCustomContent(t.map(s=>s.edge));return}const n=st(` +
+
+
+
+
`),r=n.querySelector("div.pvt-aggregated-properties");if(r){const s=[];t.forEach(c=>{const{edge:l}=c,h=Fn(l,this.uiManager.getOptions().propertiesPanel);s.push(h)});const o=Ir(s),a=Xn(o,t.length,this.genActionButtons.bind(this));r.appendChild(a)}this.body.innerHTML="",this.body.appendChild(n)}genActionButtons(t,e){const n=I("button",{title:"Select Similar"},[X({svgIcon:Cr})]);n.addEventListener("click",()=>{const o=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes().filter(a=>a.node.getData()[t]!=e);this.uiManager.graph.renderer.getGraphInteraction().removeNodesFromSelection(o)});const r=I("button",{title:"Exclude Similar"},[X({svgIcon:xr})]);return r.addEventListener("click",()=>{const o=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes().filter(a=>a.node.getData()[t]==e);this.uiManager.graph.renderer.getGraphInteraction().removeNodesFromSelection(o)}),I("div",{class:"pvt-aggregated-property-actions"},[n,r])}}class du{constructor(t){f(this,"uiManager");f(this,"panelContainer");f(this,"panels");f(this,"allPanels",[]);this.uiManager=t,this.panels=this.uiManager.getOptions().extraPanels}mount(t){t&&(this.panelContainer=t)}destroy(){var t;(t=this.panelContainer)==null||t.remove(),this.panelContainer=void 0,this.allPanels=[]}afterMount(){this.mountPanels(),this.panels.forEach((t,e)=>{t.alwaysVisible===!0&&this.showPanel(this.allPanels[e])})}updateNode(t){this.showAll()}updateEdge(t){this.showAll()}updateNodes(t){this.showAll()}updateEdges(t){this.showAll()}clear(){this.hideAll()}showAll(){this.allPanels.forEach(t=>{this.showPanel(t)})}hideAll(){this.allPanels.forEach((t,e)=>{this.panels[e].alwaysVisible!==!0&&this.hidePanel(t)})}showPanel(t){t.classList.add("enter-active")}hidePanel(t){t.classList.remove("enter-active")}mountPanels(){this.panelContainer&&this.panels.forEach(t=>[this.mountPanel(t)])}mountPanel(t){if(!this.panelContainer)return;const n=st(` +
+
+
+
`),r=n.querySelector(".pivotick-extrapanel-header-panel"),s=n.querySelector(".pivotick-extrapanel-body-panel"),o=wt(t.title,null);o&&r.appendChild(o);const a=wt(t.render,null);a&&s.appendChild(a),this.allPanels.push(n),this.panelContainer.appendChild(n)}graphReady(){}}function pu(i,t,e,n){const r=document.createElement("div");r.className="pivotick-tabs";const s=document.createElement("div");s.className="pivotick-tab-controls";const o=document.createElement("div");o.className="pivotick-tab-panels",n&&e?(n.appendChild(s),e.appendChild(o)):e?e.appendChild(r):r.append(s,o);function a(l){const h=l.id;o.querySelectorAll("[data-tab-panel]").forEach(p=>p.style.display="none"),s.querySelectorAll(".pivotick-button").forEach(p=>{p.classList.toggle("pivotick-button-primary",!1),p.classList.toggle("pivotick-button-outline-secondary",!0)});const u=o.querySelector(`[data-tab-panel="${h}"]`),d=s.querySelector(`[data-tab-control="${h}"]`);u&&(u.style.display="block"),d&&(d.classList.remove("pivotick-button-outline-secondary"),d.classList.add("pivotick-button-primary")),requestAnimationFrame(()=>{l.onShown&&(l==null||l.onShown())})}i.forEach(l=>{const h=ht({text:l.label,variant:"outline-secondary","data-tab-control":l.id,onclick:()=>a(l)});s.appendChild(h);const u=document.createElement("div");u.dataset.tabPanel=l.id,u.style.display="none",u.appendChild(l.content),o.appendChild(u)});const c=i[0];return a(c),n&&e?o:r}function Lr(i){i.variant=i.variant??"primary";const{variant:t,size:e,iconUnicode:n,iconClass:r,svgIcon:s,imagePath:o,text:a,html:c,...l}=i,h=document.createElement("span");h.classList.add("pivotick-badge"),h.classList.add(`pivotick-badge-${t}`),e&&h.classList.add(`pivotick-badge-${e}`);for(const[p,m]of Object.entries(l))p==="class"?Array.isArray(m)?h.classList.add(...m):h.classList.add(String(m)):p in h?h[p]=m:h.setAttribute(p,String(m));let u;n&&(u=X({iconUnicode:n})),r&&(u=X({iconClass:r})),s&&(u=X({svgIcon:s})),o&&(u=X({imagePath:o})),u&&h.append(u);const d=document.createElement("text");return a&&(u&&(u.style.marginRight="0.1em"),d.textContent=a),h.append(d),c&&h.appendChild(c),h}class fu{constructor(t){f(this,"uiManager");f(this,"panel");f(this,"header");f(this,"body");f(this,"neighborCount");f(this,"egographContainer");f(this,"statContainer");f(this,"listContainer");f(this,"tabContainer");f(this,"egoGraph");f(this,"renderCb");this.uiManager=t,this.renderCb=typeof this.uiManager.getOptions().neighborsPanel.render=="function"?this.uiManager.getOptions().neighborsPanel.render:void 0}mount(t){if(!t)return;const e=` +
+
+
+
`;this.panel=st(e),this.header=this.panel.querySelector(".pvt-neighbors-header-panel"),this.body=this.panel.querySelector(".pvt-neighbors-body-panel"),this.neighborCount=I("div",{class:"pvt-neighbors-count"}),t.appendChild(this.panel),this.egographContainer=I("div",{class:"main-egograph-container"},["Egograph here"]),this.statContainer=I("div",{class:"main-stats-container"},["Stats here"]),this.listContainer=I("div",{class:"main-list-container"},["List here"]),this.tabContainer=pu([{id:"egograph",label:"Neighbor Graph",content:this.egographContainer,onShown:()=>{requestAnimationFrame(async()=>{this.egoGraph&&(await this.egoGraph.simulation.start(),await this.egoGraph.simulation.waitForSimulationStop(),this.egoGraph.renderer.fitAndCenter())})}},{id:"stats",label:"Stats",content:this.statContainer},{id:"list",label:"List",content:this.listContainer}],void 0,this.body,this.header),this.body.insertBefore(this.neighborCount,this.body.firstChild)}destroy(){var t;(t=this.panel)==null||t.remove(),this.panel=void 0}afterMount(){this.clearNeighbors()}clearNeighbors(){if(this.body){if(this.renderCb){this.renderCustomContent(null);return}this.renderCb?this.body.innerHTML="":this.egographContainer&&this.statContainer&&this.listContainer&&(this.egographContainer.innerHTML="",this.statContainer.innerHTML="",this.listContainer.innerHTML=""),this.hidePanel()}}graphReady(){}renderCustomContent(t){var n;if(!this.body||!this.renderCb)return;this.body.innerHTML="";const e=wt(this.renderCb,t);e&&((n=this.body)==null||n.appendChild(e))}showPanel(){this.panel.classList.add("enter-active")}hidePanel(){this.panel.classList.remove("enter-active")}updateNodeNeighbors(t){if(this.showPanel(),!this.neighborCount)return;if(this.renderCb){this.renderCustomContent(t);return}this.buildEgoGraph(t),this.buildList(t),this.buildStats(t);const e=t.degree(),n=e>1?`${e} connections`:"1 connection";this.neighborCount.textContent=n}updateEdgeNeighbors(t){if(this.showPanel(),this.renderCb){this.renderCustomContent(t);return}}updateNodesNeighbors(t){if(this.showPanel(),!this.neighborCount)return;if(this.renderCb){this.renderCustomContent(t.map(s=>s.node));return}if(t.length<=1)return;const e=this.mergeNodesIntoNode(t.map(s=>s.node));this.buildEgoGraph(e,!1),this.buildList(e),this.buildStats(e);const n=e.degree(),r=n>1?`${n} connections`:"1 connection";this.neighborCount.textContent=r}updateEdgesNeighbors(t){if(this.showPanel(),this.renderCb){this.renderCustomContent(t.map(e=>e.edge));return}}buildEgoGraph(t,e=!0){if(!this.egographContainer)return;this.egographContainer.innerHTML="",this.egoGraph&&this.egoGraph.destroy(),this.egographContainer.style.visibility="hidden";const n=new Map;for(const l of[t,...t.getConnectedNodes(),...t.getConnectingNodes()])n.set(l.id.toString(),l);const r=[...t.getEdgesOut(),...t.getEdgesIn()],s=new Map;r.forEach(l=>{!l||l.id==null||s.set(l.id.toString(),l)}),n.forEach(l=>{l.getEdgesOut().forEach(h=>{const u=h.to;n.has(u.id.toString())&&u.id!==t.id&&s.set(h.id.toString(),h)})});const a={nodes:[...n.values()].filter(l=>{var h;return l.getDeepestNodeClone()===void 0?!0:((h=l.getDeepestNodeClone())==null?void 0:h.visible)??!1}).map(l=>l.toDict(!0)),edges:[...s.values()].map(l=>l.toDict())},c={UI:{mode:"viewer",tooltip:{enabled:!0,allowPinning:!1,setPosition:(l,h,u)=>{l.style.left=`${u.x+u.width+15}px`,l.style.top=`${u.y}px`}},contextMenu:{enabled:!1},navigation:{enabled:!1}},layout:{type:"egoTree",radial:!0,radialGap:120,rootId:t.id},render:{...this.uiManager.graph.getOptions().render,dragEnabled:!1,enableFocusMode:!1,enableNodeExpansion:!1,interactionEnabled:!0,zoomEnabled:!1,zoomAnimationDuration:100},simulation:{useWorker:!1,warmupTicks:0,cooldownTime:0},callbacks:{onNodeClick:(l,h)=>{var d,p;const u=this.uiManager.graph.getMutableNode(h.id);u&&((d=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNode())==null?void 0:d.node)!=u&&(this.uiManager.graph.unHighlightElement(u),(p=this.egoGraph)==null||p.unHighlightElement(h),this.uiManager.graph.selectElement(u))},onNodeHoverIn:(l,h)=>{var d,p,m;const u=this.uiManager.graph.getMutableNode(h.id);u&&(this.uiManager.graph.highlightElement(u),(d=this.egoGraph)==null||d.highlightElement(h),(m=(p=this.egoGraph)==null?void 0:p.UIManager.tooltip)==null||m.nodeHovered(l,h))},onNodeHoverOut:(l,h)=>{var d;const u=this.uiManager.graph.getMutableNode(h.id);u&&(this.uiManager.graph.unHighlightElement(u),(d=this.egoGraph)==null||d.unHighlightElement(h))}}};this.egoGraph=new ft(this.egographContainer,a,c),this.egoGraph.on("ready",()=>{setTimeout(()=>{this.egographContainer.style.visibility="visible"},20),e&&this.egoGraph.selectElement(this.egoGraph.getMutableNode(t.id))}),this.egoGraph.renderer.getGraphInteraction().canvasClick=()=>{}}buildList(t){if(!this.listContainer)return;this.listContainer.innerHTML="";const e=26,n=[...t.getEdgesOut(),...t.getEdgesIn()];n.sort((s,o)=>{const a=s.from.id===t.id?s.to:s.from,c=o.from.id===t.id?o.to:o.from,l=Rt(a,this.uiManager.getOptions().mainHeader),h=Rt(c,this.uiManager.getOptions().mainHeader);return l.localeCompare(h)});const r=I("div",{class:""});for(const s of n){const o=s.from.id===t.id,a=o?s.to:s.from,c=pe(s,this.uiManager.getOptions().mainHeader)||"",l=X(o?{svgIcon:Wh}:{svgIcon:Vh});l.classList.add("edge"),l.classList.add(o?"edge-out":"edge-in"),l.setAttribute("title",o?"Outgoing edge":"Incoming edge");const h=Rt(a,this.uiManager.getOptions().mainHeader),u=document.createElement("template");u.innerHTML=` +
+ + + + ${h} +
`;const d=u.content.firstElementChild,p=d.querySelector(".pvt-neighbors-list__nodepreview .pvt-mainheader-icon")??void 0,m=a.getGraphElement();if(p&&m&&m instanceof SVGGElement){const _=m.cloneNode(!0),E=m.getBBox(),x=e/Math.max(E.width,E.height);_.setAttribute("transform",`translate(${(e-E.width*x)/2-E.x*x}, ${(e-E.height*x)/2-E.y*x}) scale(${x})`),p.appendChild(_)}const v=Lr({text:c||"- empty -",size:"sm",variant:"secondary",class:["pvt-neighbor-edge-description",c||"empty-label"]}),y=I("div",{class:"edge-details"},[l,d,v]);r.appendChild(y)}this.listContainer.appendChild(r)}buildStats(t){if(!this.statContainer)return;this.statContainer.innerHTML="";const e=I("dl",{class:"pvt-property-list"}),n=I("dl",{class:"pvt-property-row"},[I("dt",{class:"pvt-property-name",title:"Total connections",style:"font-size: 1em;"},["Degree"]),I("dd",{class:"pvt-property-value",style:"display: flex; align-items: center; font-size: 1em;"},[I("span",{style:"margin-right: 8px;"},[t.degree().toString()]),I("span",{style:"display: inline-flex; align-items: center; margin-right: 8px; color: var(--pvt-text-color-secondary)",title:"Outgoing edges"},[X({svgIcon:Jh}),t.getEdgesOut().length.toString()]),I("span",{style:"display: inline-flex; align-items: center; color: var(--pvt-text-color-secondary)",title:"Incoming edges"},[X({svgIcon:tu}),t.getEdgesIn().length.toString()])])]);e.append(n);const r=I("div",{class:"core-stats"},[e]),s=new Map;[...t.getEdgesOut(),...t.getEdgesIn()].forEach(h=>{const u=pe(h,this.uiManager.getOptions().mainHeader)||"",d=s.get(u)||0;s.set(u,d+1)});const a=new Map;a.set("Label",s);const c=Xn(a,t.degree(),this.genActionButtonsSingleSelection.bind(this)),l=I("div",{class:"aggregated-labels"},[c]);this.statContainer.appendChild(r),this.statContainer.appendChild(l)}genActionButtonsSingleSelection(t,e){const n=I("button",{title:"Select nodes linked with this label"},[X({svgIcon:Cr})]);n.addEventListener("click",()=>{const o=this.getNodesMatchingFilteredEdgeName(e);o&&(this.uiManager.graph.renderer.getGraphInteraction().clearNodeSelectionList(),o.length>1?this.uiManager.graph.renderer.getGraphInteraction().selectNodes(o):this.uiManager.graph.renderer.getGraphInteraction().selectNode(o[0].element,o[0].node))});const r=I("button",{title:"Exclude nodes linked with this label"},[X({svgIcon:xr})]);return r.addEventListener("click",()=>{const o=this.getNodesMatchingFilteredEdgeName(e,!0);o&&(this.uiManager.graph.renderer.getGraphInteraction().clearNodeSelectionList(),o.length>1?this.uiManager.graph.renderer.getGraphInteraction().selectNodes(o):this.uiManager.graph.renderer.getGraphInteraction().selectNode(o[0].element,o[0].node))}),I("div",{class:"pvt-aggregated-property-actions"},[n,r])}getNodesMatchingFilteredEdgeName(t,e=!1){const n=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNode();if(!n)return;const r=n.node,s=[...r.getEdgesOut(),...r.getEdgesIn()],o=new Map;return s.filter(a=>{const c=pe(a,this.uiManager.getOptions().mainHeader);return e?c!==t:c===t}).forEach(a=>{const c=r===a.from?a.to:a.from;o.set(c.id.toString(),c)}),[...o.values()].map(a=>({node:a,element:a.getGraphElement()}))}mergeNodesIntoNode(t){const e={size:50,shape:"square",color:"transparent",strokeColor:"transparent",html:l=>{const u=l.getData().aggregated_node_count,d=X({svgIcon:_r(28)});return d.style="position: absolute;",st(`
+ ${d.outerHTML} +
+
+${u}
+
Group
+
+
`)}},n={label:`${t.length} nodes`,aggregated_node_count:t.length},r=new ut("aggregated-node",n,e);r.weight=10;const s=new Set(t.map(l=>l.id.toString())),o=t.flatMap(l=>[...l.getEdgesOut(),...l.getEdgesIn()]),a=[],c=[];for(const l of o){const h=s.has(l.from.id),u=s.has(l.to.id);h!==u&&(h?a.push(l):c.push(l))}return a.forEach((l,h)=>{const u=l.to.clone();new dt(`outgoing-${h}`,r,u,l.getData(),l.getStyle())}),c.forEach((l,h)=>{const u=l.from.clone();new dt(`incoming-${h}`,u,r,l.getData(),l.getStyle())}),r}}class gu{constructor(t){f(this,"uiManager");f(this,"sidebar");f(this,"sidebarOpen",!0);f(this,"sidebarMainHeader");f(this,"sidebarProperties");f(this,"sidebarNeighbors");f(this,"extraPanelManager");f(this,"mainHeaderPanel");f(this,"mainBodyPanel");f(this,"neighborPanel");f(this,"extraPanelContainer");f(this,"collapse");this.uiManager=t,this.sidebarMainHeader=new su(this.uiManager),this.sidebarProperties=new uu(this.uiManager),this.sidebarNeighbors=new fu(this.uiManager),this.extraPanelManager=new du(this.uiManager)}mount(t){if(!t)return;const e=` +
+
+
+
+
+
+
+
+
`;this.sidebar=st(e),t.appendChild(this.sidebar)}destroy(){var t;this.sidebarMainHeader.destroy(),this.sidebarProperties.destroy(),(t=this.sidebar)==null||t.remove(),this.sidebar=void 0}afterMount(){var t,e;this.sidebar&&(this.mainHeaderPanel=this.sidebar.querySelector(".pvt-mainheader-panel")??void 0,this.sidebarMainHeader.mount(this.mainHeaderPanel),this.mainBodyPanel=this.sidebar.querySelector(".pvt-properties-panel")??void 0,this.sidebarProperties.mount(this.mainBodyPanel),this.neighborPanel=this.sidebar.querySelector(".pvt-neighbor-panel")??void 0,this.sidebarNeighbors.mount(this.neighborPanel),this.extraPanelContainer=this.sidebar.querySelector(".pvt-extra-panel")??void 0,this.extraPanelManager.mount(this.extraPanelContainer),this.collapse=I("span",{class:"pvt-sidebar-collapse-container"},[I("span",{class:"pvt-sidebar-collapse-button pvt-sidebar-collapse-button-collapse"},[X({svgIcon:Ah})]),I("span",{class:"pvt-sidebar-collapse-button pvt-sidebar-collapse-button-expand"},[X({svgIcon:Nh})])]),this.sidebar.parentElement.appendChild(this.collapse),((e=(t=this.uiManager.getOptions())==null?void 0:t.sidebar)==null?void 0:e.collapsed)===!0?this.hideSidebar():this.showSidebar(),this.sidebarMainHeader.afterMount(),this.sidebarProperties.afterMount(),this.sidebarNeighbors.afterMount(),this.extraPanelManager.afterMount())}graphReady(){var t;this.sidebarMainHeader.graphReady(),this.sidebarProperties.graphReady(),this.sidebarNeighbors.graphReady(),this.extraPanelManager.graphReady(),this.uiManager.graph.renderer.getGraphInteraction().on("selectNode",(e,n)=>{this.sidebarMainHeader.updateNodeOverview(e,n),this.sidebarProperties.updateNodeProperties(e),this.sidebarNeighbors.updateNodeNeighbors(e),this.extraPanelManager.updateNode(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectNode",()=>{this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear()}),this.uiManager.graph.renderer.getGraphInteraction().on("selectEdge",e=>{this.sidebarMainHeader.updateEdgeOverview(e),this.sidebarProperties.updateEdgeProperties(e),this.sidebarNeighbors.updateEdgeNeighbors(e),this.extraPanelManager.updateEdge(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectEdge",()=>{this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear()}),this.uiManager.graph.renderer.getGraphInteraction().on("selectNodes",e=>{const n=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes();this.sidebarMainHeader.updateNodesOverview(n),this.sidebarProperties.updateNodesProperties(n),this.sidebarNeighbors.updateNodesNeighbors(n),this.extraPanelManager.updateNodes(n)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectNodes",()=>{const e=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes();e.length>0?(this.sidebarMainHeader.updateNodesOverview(e),this.sidebarProperties.updateNodesProperties(e),this.sidebarNeighbors.updateNodesNeighbors(e),this.extraPanelManager.updateNodes(e)):(this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear())}),this.uiManager.graph.renderer.getGraphInteraction().on("selectEdges",e=>{this.sidebarMainHeader.updateEdgesOverview(e),this.sidebarProperties.updateEdgesProperties(e),this.sidebarNeighbors.updateEdgesNeighbors(e),this.extraPanelManager.updateEdges(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectEdges",()=>{this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear()}),(t=this.collapse)==null||t.addEventListener("click",()=>{this.toggleSidebar()})}toggleSidebar(){this.sidebar.closest(".pvt-sidebar").classList.toggle("pvt-sidebar-collapsed",this.sidebarOpen),this.sidebarOpen=!this.sidebarOpen}showSidebar(){this.sidebar.closest(".pvt-sidebar").classList.remove("pvt-sidebar-collapsed"),this.sidebarOpen=!0}hideSidebar(){this.sidebar.closest(".pvt-sidebar").classList.add("pvt-sidebar-collapsed"),this.sidebarOpen=!1}}class mu{constructor(t,e={}){f(this,"uiManager");f(this,"options");f(this,"slidePanel");f(this,"header");f(this,"body");f(this,"isOpen",!1);f(this,"DEFAULT_HEADER",null);f(this,"DEFAULT_BODY","- empty panel -");this.uiManager=t,this.options=e,this.options.header||(this.options.header=this.DEFAULT_HEADER),this.options.body||(this.options.body=this.DEFAULT_BODY)}mount(t){if(!t)return;const e=document.createElement("template");if(e.innerHTML=` +
+
+`,this.slidePanel=e.content.firstElementChild,this.slidePanel.innerHTML="",this.options.header!=null){this.header=document.createElement("div"),this.header.className="pvt-slide-panel__header",this.setHeader(this.options.header),this.slidePanel.appendChild(this.header);const n=ht({text:"×",onClick:()=>{this.close()},id:"pvt-sidePanel-close",class:"pvt-close-button",style:"margin-left: auto;"});this.header.appendChild(n)}this.body=document.createElement("div"),this.body.className="pvt-slide-panel__content",this.setBody(this.options.body),this.slidePanel.appendChild(this.body),this.options.noBodyPadding?this.body.style.padding="0":this.body.style.padding="",t.appendChild(this.slidePanel)}destroy(){var t;(t=this.slidePanel)==null||t.remove(),this.slidePanel=void 0}afterMount(){}graphReady(){}open(){var t;this.isOpen=!0,(t=this.slidePanel)==null||t.classList.add("open")}close(){var t;this.isOpen=!1,(t=this.slidePanel)==null||t.classList.remove("open")}toggle(){this.isOpen?this.close():this.open()}setHeader(t){this.header&&(this.header.innerHTML="",t&&(this.options.header instanceof HTMLElement?this.header.appendChild(this.options.header):this.options.rawHeader?this.header.innerHTML=this.options.header:this.header.textContent=this.options.header))}setBody(t){this.body&&(this.body.innerHTML="",t&&(t instanceof HTMLElement?this.body.appendChild(t):this.options.rawBody?this.body.innerHTML=t:this.body.textContent=t))}}class vu{constructor(t){f(this,"uiManager");f(this,"searchBox");f(this,"searchInput");f(this,"searchResultsContainer");f(this,"searchSummaryContainer");f(this,"results");f(this,"highlightedIndex",0);f(this,"MAX_RESULT_COUNT",12);this.uiManager=t}mount(t){t&&(this.searchBox=this.build(),t.appendChild(this.searchBox))}build(){var e,n;const t=document.createElement("template");return t.innerHTML=` + +`,this.searchBox=t.content.firstElementChild,this.searchInput=this.searchBox.querySelector("#pvt-search-input")??void 0,this.searchResultsContainer=this.searchBox.querySelector(".pvt-search-results")??void 0,this.searchSummaryContainer=this.searchBox.querySelector(".pvt-search-summary")??void 0,(e=this.searchInput)==null||e.addEventListener("input",()=>{this.searchAndShowResults(this.searchInput.value),this.updateHighlight()}),(n=this.searchInput)==null||n.addEventListener("keydown",r=>{var o;if(r.key=="Escape"){this.dispatchEvent("pvt-searchbox-close");return}if(!this.results||this.results.length<1)return;const s=Math.min(this.MAX_RESULT_COUNT,this.results.length);switch(r.key){case"ArrowDown":r.preventDefault(),this.highlightedIndex=(this.highlightedIndex+1)%s,this.updateHighlight();break;case"ArrowUp":r.preventDefault(),this.highlightedIndex=(this.highlightedIndex-1+s)%s,this.updateHighlight();break;case"Enter":if(r.preventDefault(),this.highlightedIndex>=0){const a=(o=this.searchResultsContainer)==null?void 0:o.children[this.highlightedIndex];a==null||a.click()}break}}),this.searchBox}destroy(){var t;(t=this.searchBox)==null||t.remove(),this.searchBox=void 0}afterMount(){}graphReady(){}buildResult(t){const n=document.createElement("template");n.innerHTML=` +
+
+
+ +
+
+
+
+
+
+
+
+`;const r=t[0],s=t[1],o=n.content.firstElementChild,a=o.querySelector(".pvt-search-result__nodepreview .pvt-mainheader-icon")??void 0,c=o.querySelector(".pvt-search-result__name")??void 0,l=o.querySelector(".pvt-search-result__info_key")??void 0,h=o.querySelector(".pvt-search-result__info_value")??void 0;o.addEventListener("click",()=>{this.clickHandler(r)});const u=r.getGraphElement();if(u&&u instanceof SVGGElement){const d=u.cloneNode(!0),p=u.getBBox(),m=30/Math.max(p.width,p.height);d.setAttribute("transform",`translate(${(30-p.width*m)/2-p.x*m}, ${(30-p.height*m)/2-p.y*m}) scale(${m})`),a.appendChild(d)}return c.textContent=Rt(r,this.uiManager.getOptions().mainHeader),l.textContent=`.${s.key}: `,h.textContent=s.value,o}updateHighlight(){!this.results||!this.searchResultsContainer||this.results.forEach((t,e)=>{var r;const n=(r=this.searchResultsContainer)==null?void 0:r.children[e];n&&(e===this.highlightedIndex?n.classList.add("active"):n.classList.remove("active"))})}search(t){const e=[],n=t.trim().toLowerCase();if(!(!n||n.length<2)){for(const r of this.uiManager.graph.getMutableNodes()){const s=r.getData();for(const o in s){const a=s[o];if(a==null)continue;const c=String(a).toLowerCase();let l=n.startsWith('"')?n.slice(1):n;const h=n.startsWith('"')&&n.endsWith('"');if(h&&(l=l.slice(0,-1).trim()),h?c===l:c.includes(l)){const d={key:o,value:String(a)};e.push([r,d]);break}}}return e}}clickHandler(t){this.dispatchEvent("pvt-searchbox-select",t)}searchAndShowResults(t){if(!(!this.searchResultsContainer||!this.searchSummaryContainer)&&(this.results=void 0,this.searchResultsContainer.innerHTML="",this.searchSummaryContainer.innerHTML="",this.results=this.search(t),this.results)){const e=[];for(const n of this.results){if(e.length>=this.MAX_RESULT_COUNT)break;e.push(this.buildResult(n))}e.forEach(n=>{var r;(r=this.searchResultsContainer)==null||r.appendChild(n)}),this.searchSummaryContainer.appendChild(this.createSummary())}}createSummary(){if(!this.results)return document.createElement("div");let t="";this.results.length===0?t="No results found":this.results.length>this.MAX_RESULT_COUNT?t=`Showing top ${this.MAX_RESULT_COUNT} of ${this.results.length} results`:t=`${this.results.length} results`;const e=document.createElement("template");return e.innerHTML=` +
+ ${t} +
+`,e.content.firstElementChild}dispatchEvent(t,e){if(!this.searchBox)return;const n=new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0});this.searchBox.dispatchEvent(n)}}class Dr{constructor(t,e={}){f(this,"root");f(this,"select");f(this,"options",[]);f(this,"selected",new Set);f(this,"mode");f(this,"searchable");f(this,"dropdown");f(this,"input");f(this,"chipsContainer");f(this,"listContainer");f(this,"clearButton");f(this,"singleCloseButton");f(this,"inputWrap");f(this,"searchWrap");f(this,"searchInput");f(this,"focusedIndex",-1);this.select=t,this.root=document.createElement("div"),this.root.className="pvt-picker",this.mode=e.mode??(t.multiple?"multi":"single"),this.searchable=e.searchable??!0,this.parseOptions(),this.build(),this.syncFromSelect(),this.attach()}parseOptions(){this.options=Array.from(this.select.options).filter(t=>t.value).map(t=>({value:t.value,label:t.text,disabled:t.disabled}))}build(){var e;this.select.style.display="none",(e=this.select.parentElement)==null||e.insertBefore(this.root,this.select);const t=document.createElement("div");t.className="pvt-picker__control",this.chipsContainer=document.createElement("div"),this.chipsContainer.className="pvt-picker__chips",this.clearButton=document.createElement("button"),this.clearButton.className="pvt-picker__clear",this.clearButton.textContent="×",this.clearButton.tabIndex=-1,this.clearButton.style.display="none",this.clearButton.type="button",this.inputWrap=document.createElement("div"),this.inputWrap.className="pvt-picker__input-wrap",this.input=document.createElement("input"),this.input.className="pvt-picker__input",this.input.placeholder=this.select.getAttribute("placeholder")||"Select...",this.input.type="text",this.singleCloseButton=document.createElement("button"),this.singleCloseButton.className="pvt-picker__single-close",this.singleCloseButton.textContent="×",this.singleCloseButton.type="button",this.singleCloseButton.style.display="none",this.inputWrap.appendChild(this.input),this.inputWrap.appendChild(this.singleCloseButton),this.dropdown=document.createElement("div"),this.dropdown.className="pvt-picker__dropdown",this.listContainer=document.createElement("div"),this.listContainer.className="pvt-picker__list",this.dropdown.appendChild(this.listContainer),this.mode==="multi"?(t.appendChild(this.chipsContainer),t.appendChild(this.clearButton)):t.appendChild(this.inputWrap),this.mode==="multi"&&(this.searchWrap=document.createElement("div"),this.searchWrap.className="pvt-picker__search",this.searchInput=document.createElement("input"),this.searchInput.className="pvt-picker__search-input",this.searchInput.placeholder=this.select.getAttribute("placeholder")||"Search...",this.searchWrap.appendChild(this.searchInput),this.dropdown.insertBefore(this.searchWrap,this.listContainer)),this.root.appendChild(t),this.root.appendChild(this.dropdown),this.renderList(),this.renderChips()}attach(){const t=this.root.querySelector(".pvt-picker__control");t==null||t.addEventListener("click",r=>{if(this.mode==="single"){if(this.dropdown.classList.toggle("open"),this.focusedIndex=-1,this.dropdown.classList.contains("open")){if(this.selected.size===0){const s=this.select.getAttribute("placeholder")||"Select...";this.input.placeholder=s,this.input.value=""}this.renderList(),this.focusedIndex===-1&&(this.focusedIndex=0,this.updateFocusedOption())}return}r.target.tagName!=="BUTTON"&&!r.target.classList.contains("pvt-picker__chip-remove")&&(this.dropdown.classList.toggle("open"),this.focusedIndex=-1,this.dropdown.classList.contains("open")&&(this.searchInput.focus(),this.focusedIndex===-1&&(this.focusedIndex=0,this.updateFocusedOption())))});const e=r=>this.handleKeyDown(r);this.searchInput?(this.searchInput.addEventListener("input",()=>{this.focusedIndex=-1,this.renderList(this.searchInput.value)}),this.searchInput.addEventListener("focus",r=>{r.stopPropagation(),this.dropdown.classList.add("open")}),this.searchInput.addEventListener("keydown",e)):(this.input.addEventListener("keydown",e),this.input.addEventListener("input",()=>{this.focusedIndex=-1,this.renderList(this.input.value)}),this.input.addEventListener("keydown",r=>{r.key==="Backspace"&&this.input.value&&this.selected.size===1&&(r.preventDefault(),this.selected.clear(),this.input.value="",this.syncToSelect(),this.syncFromSelect())})),document.addEventListener("pointerdown",r=>{this.root.contains(r.target)||this.dropdown.classList.remove("open")}),this.clearButton.addEventListener("click",()=>this.clear()),this.singleCloseButton.addEventListener("click",r=>{r.stopPropagation(),this.selected.clear(),this.syncToSelect(),this.syncFromSelect(),this.dropdown.classList.remove("open")}),new MutationObserver(r=>{let s=!1;for(const o of r){for(const a of o.addedNodes)if(a.tagName==="OPTION"){s=!0;break}for(const a of o.removedNodes)if(a.tagName==="OPTION"){s=!0;break}if(s)break}s&&this.syncFromSelect()}).observe(this.select,{childList:!0,subtree:!0})}renderList(t=""){this.listContainer.innerHTML="";const e=this.searchable?this.options.filter(n=>t?n.label.toLowerCase().includes(t.toLowerCase()):!0):this.options;if(e.length===0){const n=document.createElement("div");n.className="pvt-picker__no-options",n.textContent="No options available",this.listContainer.appendChild(n)}e.forEach((n,r)=>{const s=document.createElement("div");s.className="pvt-picker__option",n.disabled&&s.classList.add("disabled"),this.selected.has(n.value)&&s.classList.add("selected"),r===this.focusedIndex&&(s.classList.add("focused"),this.selected.has(n.value)&&s.classList.add("focused-selected")),s.textContent=n.label,s.addEventListener("click",o=>{if(o.stopPropagation(),!n.disabled){if(this.mode==="single"){this.selected.clear(),this.selected.add(n.value);const a=this.options.find(c=>c.value===n.value);this.input.value=a?a.label:"",this.input.placeholder="",this.focusedIndex=-1,this.dropdown.classList.remove("open"),this.syncToSelect(),this.syncFromSelect();return}else this.selected.has(n.value)?this.selected.delete(n.value):this.selected.add(n.value);this.focusedIndex=r,this.syncToSelect(),this.renderList(this.mode==="multi"?this.searchInput.value:this.input.value),this.renderChips()}}),this.listContainer.appendChild(s)})}handleKeyDown(t){var r;if(!this.dropdown.classList.contains("open"))return;const e=this.searchable?this.options.filter(s=>{var o;return(o=this.searchInput)!=null&&o.value?s.label.toLowerCase().includes(this.searchInput.value.toLowerCase()):!0}):this.options,n=e.length;switch(t.key){case"ArrowDown":if(t.preventDefault(),this.mode==="multi")for(let s=0;s=0&&this.focusedIndexa.value===s.value);this.input.value=o?o.label:"",this.input.placeholder="",this.focusedIndex=-1,this.dropdown.classList.remove("open"),this.syncToSelect(),this.syncFromSelect()}else this.selected.has(s.value)?this.selected.delete(s.value):this.selected.add(s.value),this.focusedIndex=-1,this.syncToSelect(),this.renderList(((r=this.searchInput)==null?void 0:r.value)||""),this.renderChips()}}break;case"Escape":t.preventDefault(),this.dropdown.classList.remove("open");break}}updateFocusedOption(){const t=this.listContainer.querySelectorAll(".pvt-picker__option");if(t.forEach((e,n)=>{const r=n===this.focusedIndex;e.classList.toggle("focused",r),e.classList.toggle("focused-selected",r&&e.classList.contains("selected"))}),this.focusedIndex>=t.length){this.focusedIndex=-1;return}if(this.focusedIndex>=0){const e=this.listContainer.children[this.focusedIndex];e==null||e.scrollIntoView({block:"nearest"})}}renderChips(){if(this.mode!=="single"){if(this.chipsContainer.innerHTML="",this.selected.size>0)this.selected.forEach(t=>{const e=this.options.find(o=>o.value===t);if(!e)return;const n=document.createElement("span");n.className="pvt-picker__chip";const r=document.createElement("span");r.className="pvt-picker__chip-label",r.textContent=e.label;const s=document.createElement("button");s.className="pvt-picker__chip-remove",s.textContent="×",s.setAttribute("aria-label",`Remove ${e.label}`),s.addEventListener("click",o=>{o.stopPropagation(),this.selected.delete(t),this.syncToSelect(),this.renderChips(),this.renderList(this.searchInput.value)}),n.appendChild(r),n.appendChild(s),this.chipsContainer.appendChild(n)});else{const t=document.createElement("span");t.className="pvt-picker__placeholder",t.textContent=this.select.getAttribute("placeholder")||"Select...",this.chipsContainer.appendChild(t)}this.clearButton.style.display=this.selected.size>0?"":"none"}}syncToSelect(){Array.from(this.select.options).forEach(t=>{t.selected=this.selected.has(t.value)}),this.select.dispatchEvent(new Event("change",{bubbles:!0}))}syncFromSelect(){if(this.selected.clear(),Array.from(this.select.selectedOptions).forEach(t=>{if(!t.value)return;this.options.find(n=>n.value===t.value)&&this.selected.add(t.value)}),this.mode==="single"){if(this.selected.size===1){const t=this.selected.values().next().value,e=this.options.find(n=>n.value===t);e&&(this.input.value=e.label,this.input.placeholder="")}else{const t=this.select.getAttribute("placeholder")||"Select...";this.input.value="",this.input.placeholder=t}this.mode==="single"&&(this.singleCloseButton.style.display=this.selected.size>0?"":"none")}this.renderChips(),this.renderList(this.input.value)}sync(){this.syncFromSelect()}clear(){this.selected.clear(),this.syncToSelect(),this.syncFromSelect(),this.renderList(this.searchInput.value),this.dropdown.classList.remove("open")}getValues(){return Array.from(this.selected)}setValues(t){if(this.selected=new Set(t),this.syncToSelect(),this.mode==="single"&&this.selected.size===1){const e=this.selected.values().next().value,n=this.options.find(r=>r.value===e);n&&(this.input.value=n.label,this.input.placeholder="")}this.renderChips(),this.renderList(this.input.value)}get picker(){return this}}class Zn{static createForm(t){const e=document.createElement("form");return e.className="pvt-form",t.fields.forEach(n=>{e.appendChild(this.createField(n))}),e}static getValues(t){const e={};return t.querySelectorAll("[data-field-key]").forEach(r=>{const s=r.getAttribute("data-field-key");switch(r.getAttribute("data-field-type")){case"text":e[s]=r.value||void 0;break;case"select":{const a=r;e[s]=a.value||void 0,a.dataset.fieldValuesAreBoolean==="yes"&&e[s]!==void 0&&e[s]==="true"&&(e[s]=!0);break}case"multiselect":{const a=r;e[s]=Array.from(a.selectedOptions).map(c=>c.value).filter(c=>c.length>0),a.dataset.fieldValuesAreBoolean==="yes"&&e[s].map(c=>c!==void 0&&c==="true"?!0:c);break}case"checkbox":e[s]=r.checked;break;case"numberRange":{const a=r.querySelector(".min").value,c=r.querySelector(".max").value;e[s]={min:a?Number(a):void 0,max:c?Number(c):void 0};break}}}),console.log(e),e}static clear(t){t.reset()}static createField(t){const e=document.createElement("div");e.className="pvt-form-element";const n=document.createElement("label");switch(n.htmlFor=`pvt-form-element-${t.key}`,n.textContent=this.niceLabelFromKey(t.label),e.appendChild(n),t.type){case"select":e.appendChild(this.createSelect(t));break;case"multiselect":e.appendChild(this.createMultiSelect(t));break;case"checkbox":e.appendChild(this.createCheckbox(t));break;case"text":e.appendChild(this.createText(t));break;case"numberRange":e.appendChild(this.createNumberRange(t));break}return e}static baseAttrs(t,e){t.id=`pvt-form-element-${e.key}`,t.setAttribute("data-field-key",e.key),t.setAttribute("data-field-type",e.type)}static buildSelect(t){var n;const e=document.createElement("select");if(this.baseAttrs(e,t),t.allowEmpty){const r=document.createElement("option");r.value="",r.textContent="",r.selected=!0,e.appendChild(r)}return t.valuesAreBoolean&&e.setAttribute("data-field-values-are-boolean","yes"),(n=t.options)==null||n.forEach(r=>{const s=document.createElement("option");s.value=r.value,s.textContent=r.label,t.defaultValue&&(Array.isArray(t.defaultValue)?t.defaultValue.includes(r.value):t.defaultValue===r.value)&&(s.selected=!0),e.appendChild(s)}),e}static createSelect(t){const e=this.buildSelect(t);return requestAnimationFrame(()=>{new Dr(e,{})}),e}static createMultiSelect(t){const e=this.buildSelect(t);return e.multiple=!0,requestAnimationFrame(()=>{new Dr(e,{})}),e}static createCheckbox(t){const e=document.createElement("input");return e.type="checkbox",t.defaultValue===!0&&(e.checked=!0),this.baseAttrs(e,t),e}static createText(t){const e=document.createElement("input");return e.type="text",e.placeholder=t.placeholder??"",this.baseAttrs(e,t),t.defaultValue&&(e.value=String(t.defaultValue)),e}static createNumberRange(t){const e=document.createElement("div");e.className="pvt-number-range",this.baseAttrs(e,t);const n=document.createElement("input");n.type="number",n.placeholder="Min",n.className="min";const r=document.createElement("input");r.type="number",r.placeholder="Max",r.className="max";const s=typeof t.defaultValue=="object"&&t.defaultValue!==null?t.defaultValue:void 0;return(s==null?void 0:s.min)!=null&&(n.value=String(s.min)),(s==null?void 0:s.max)!=null&&(r.value=String(s.max)),e.append(n,r),e}static niceLabelFromKey(t){return t.replace(/([A-Z])/g," $1").replace(/[_-]+/g," ").trim().split(" ").map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" ")}}const yu="Filter Graph";class bu{constructor(t){f(this,"uiManager");f(this,"graphFilter");f(this,"formOptions");f(this,"manuallyFilteredContainer");this.uiManager=t,this.formOptions=[]}mount(t){t&&(this.build(),this.graphFilter&&t.appendChild(this.graphFilter))}destroy(){var t;(t=this.graphFilter)==null||t.remove(),this.graphFilter=void 0}afterMount(){}graphReady(){}build(){return this.graphFilter=document.createElement("div"),this.graphFilter.classList.add("pvt-graph-filter-container"),this.uiManager.graph.on("dataBatchChanged",()=>{this.rebuild()}),this.uiManager.graph.queryEngine.on("filterChange",t=>{this.updateUIFilterButtonContent(t),this.updateUIFilterHiddenNodes()}),requestAnimationFrame(()=>{this.updateUIFilterButtonContent({}),this.updateUIFilterHiddenNodes()}),this.graphFilter}rebuild(){var a;if(!this.graphFilter)return;const t=ht({variant:"secondary",text:"Reset",size:"sm",style:"align-self: end;",svgIcon:Gh,onClick:()=>{Zn.clear(n);const c={};this.filterGraph(c)}}),e=this.getAvailableNodeAttributes();this.formOptions=Object.entries(e).map(([c,l])=>{let h="text",u="exact",d=!1;l.values?l.values&&l.values.every(m=>m.length<64)?l.values.length>2?(h="multiselect",u="partial"):h="select":l.values.every(m=>typeof m=="boolean")&&(h="select",l.values=["true","false"],d=!0):h="numberRange";const p={key:c,label:c,type:h,matchMode:u,valuesAreBoolean:d};return(p.type=="select"||p.type=="multiselect")&&l.values&&(p.options=l.values.map(m=>({label:m,value:m})),p.allowEmpty=!0),p});const n=Zn.createForm({fields:this.formOptions}),r=ht({variant:"primary",text:"Filter Graph",size:"block",style:"margin-top: 16px;",svgIcon:Sr,onClick:()=>{const c=Zn.getValues(n);this.filterGraph(c)}}),s=I("div",{class:"pvt-sidebar-separator"});this.manuallyFilteredContainer=st(`
+

Hidden nodes

+
+
`);const o=ht({variant:"secondary",text:"Show all nodes",size:"sm",style:"align-self: end;",svgIcon:kr,onClick:()=>{this.uiManager.graph.queryEngine.clearNodeExclusions()},title:"Restore manually hidden nodes"});(a=this.manuallyFilteredContainer.querySelector("h4"))==null||a.appendChild(o),this.graphFilter.appendChild(t),this.graphFilter.appendChild(n),this.graphFilter.appendChild(r),this.graphFilter.appendChild(s),this.graphFilter.appendChild(this.manuallyFilteredContainer)}updateUIFilterButtonContent(t){var o,a;const e=(o=this.uiManager.toolbar)==null?void 0:o.filterButton,n=e==null?void 0:e.querySelector(".action-text");if(!n)return;n.innerHTML="";let r=Object.keys(t).length;const s=(a=t.manuallyHidden)==null?void 0:a.value;if(Array.isArray(s)&&s.length==0&&r--,r>0){const c=r>1?`${r} active filters`:"1 active filter",l=this.uiManager.graph.queryEngine.getHiddenNodeCount(),h=I("span",{class:"active-filter-subtext"},[I("span",{},["·"]),I("span",{},[`${l} hidden`])]),u=Lr({text:c,html:h,variant:"primary",size:"sm"});n.appendChild(u)}else n.textContent=yu}updateUIFilterHiddenNodes(){if(!this.manuallyFilteredContainer)return;const t=this.manuallyFilteredContainer.querySelector(".pvt-hidden-nodes-container-list");t&&(this.uiManager.graph.queryEngine.getExcludedNodeCount()>0?(this.manuallyFilteredContainer.classList.remove("hidden"),t.innerHTML="",this.uiManager.graph.queryEngine.getExcludedNodes().forEach(e=>{const n=Object.keys(e.getData()).length,r=e.getEdgesIn().length+e.getEdgesOut().length,s=ht({variant:"secondary",text:"Show node",size:"sm",title:"Restore manually hidden node",svgIcon:kr,onClick:()=>{this.uiManager.graph.queryEngine.includeNode(e)}}),o=I("span",{class:"subtext"},[I("span",{class:"nodeinfo"},[n.toString(),X({svgIcon:Qh})]),"·",I("span",{class:"nodeinfo"},[r.toString(),X({svgIcon:Xe(24)})])]),a=I("div",{class:"hidden-node"},[Rt(e,this.uiManager.getOptions().mainHeader),o,s]);a.addEventListener("mouseenter",c=>{var l;(l=this.uiManager.tooltip)==null||l.openForNodeOnElement(c,e)}),a.addEventListener("mouseleave",()=>{var c;(c=this.uiManager.tooltip)==null||c.hide()}),t==null||t.appendChild(a)})):this.manuallyFilteredContainer.classList.add("hidden"))}getAvailableNodeAttributes(){const t=new Map;this.uiManager.graph.getMutableNodes().forEach(r=>{Object.entries(r.getData()).forEach(([s,o])=>{let a=t.get(s);a||(a={numbers:new Set,values:new Set}),Number.isInteger(o)?a.range.add(o):a.values.add(o),t.set(s,a)})});const n=new Map;return t.forEach((r,s)=>{const o={};r.values?o.values=[...new Set([...r.values,...r.numbers])]:r.number&&(o.range=[Math.min(...r.numbers),Math.max(...r.numbers)]),n.set(s,o)}),Object.fromEntries(n)}filterGraph(t){const e=this.getActiveFilters(t),n={},r=Object.fromEntries(this.formOptions.map(s=>[s.key,s]));for(const[s,o]of Object.entries(e)){const a={value:o,matchMode:r[s].matchMode};o!==void 0&&(n[s]=a)}this.uiManager.graph.queryEngine.resetFilters(),this.uiManager.graph.queryEngine.setFilters(n)}getActiveFilters(t){const e={};for(const[n,r]of Object.entries(t))this.isFilterActive(r)?e[n]=r:e[n]=void 0;return e}isFilterActive(t){return t===void 0?!1:typeof t=="string"?t.trim()!=="":typeof t=="number"||typeof t=="boolean"?!0:Array.isArray(t)?t.length>0:typeof t=="object"?t.min!==void 0||t.max!==void 0:!1}}class wu{constructor(t){f(this,"uiManager");f(this,"toolbar");f(this,"searchBoxButton");f(this,"filterButton");f(this,"undoButton");f(this,"redoButton");f(this,"filteringSlidepanel");f(this,"searchModal");this.uiManager=t}mount(t){if(!t)return;this.toolbar=document.createElement("div"),this.toolbar.className="pvt-toolbar-elements";const e=document.createElement("template");e.innerHTML=` +
+
+ ${Mr} + Search + Ctrl J +
+
`,this.searchBoxButton=e.content.firstElementChild,this.toolbar.appendChild(this.searchBoxButton);const n=document.createElement("template");n.innerHTML=` +
+
+ ${Sr} + Filter Graph + Ctrl K +
+
`,this.filterButton=n.content.firstElementChild;const r=document.createElement("template");r.innerHTML=` +
+
+ + +
+
`;const s=r.content.firstElementChild;s.prepend(this.filterButton),this.undoButton=s.querySelector("#pvt-undo-button")??void 0,this.redoButton=s.querySelector("#pvt-redo-button")??void 0,this.toolbar.appendChild(s),t.appendChild(this.toolbar)}destroy(){var t;(t=this.toolbar)==null||t.remove(),this.toolbar=void 0}afterMount(){var e;if(!this.filterButton)return;this.uiManager.keyManager.register({key:"Ctrl+j",callback:()=>{var n;return(n=this.searchBoxButton)==null?void 0:n.click()}}),this.uiManager.keyManager.register({key:"Ctrl+k",callback:()=>{var n;return(n=this.filterButton)==null?void 0:n.click()}});const t=new bu(this.uiManager);this.filteringSlidepanel=this.uiManager.createSlidepanel({header:"Graph Filters",body:t.build()}),this.filterButton.addEventListener("click",()=>{this.filteringSlidepanel.toggle()}),(e=this.searchBoxButton)==null||e.addEventListener("click",()=>{var n,r;this.searchModal||(this.searchModal=this.uiManager.createModal({body:"",buttons:null,position:"top",size:"xl",noBodyPadding:!0}),this.searchModal&&((n=this.searchModal.modal)==null||n.addEventListener("pvt-modal-show",()=>{var o,a,c,l;const s=new vu(this.uiManager);(o=this.searchModal)==null||o.setBody(s.build()),(a=s.searchInput)==null||a.focus(),(c=s.searchBox)==null||c.addEventListener("pvt-searchbox-select",h=>{var p;const d=h.detail;this.uiManager.graph.selectElement(d),(p=this.searchModal)==null||p.destroy()}),(l=s.searchBox)==null||l.addEventListener("pvt-searchbox-close",()=>{var h;(h=this.searchModal)==null||h.destroy()})}),(r=this.searchModal.modal)==null||r.addEventListener("pvt-modal-hidden",()=>{this.searchModal=void 0})))})}graphReady(){}}class xu{constructor(t,e){f(this,"uiManager");f(this,"options");f(this,"overlay");f(this,"modal");f(this,"header");f(this,"body");f(this,"footer");f(this,"DEFAULT_HEADER",null);f(this,"DEFAULT_BODY","");f(this,"DEFAULT_BUTTON_CONFIG",{text:"Ok",variant:"primary",onClick:(t,e)=>{e()}});this.uiManager=t,this.options=e,this.options.header||(this.options.header=this.DEFAULT_HEADER),this.options.body||(this.options.body=this.DEFAULT_BODY),!this.options.buttons&&this.options.buttons!==null&&(this.options.buttons=[this.DEFAULT_BUTTON_CONFIG]),this.options.position=e.position??"center"}mount(t){if(!t)return;this.overlay=document.createElement("div"),this.overlay.className="pvt-modal-overlay",this.overlay.classList.add(this.options.position==="center"?"pvt-modal-overlay-center":"pvt-modal-overlay-top"),this.overlay.addEventListener("click",n=>{n.target===this.overlay&&this.destroy()}),this.modal=document.createElement("div"),this.modal.className="pvt-modal";const e=this.options.size??"md";if(this.modal.classList.add(`pvt-modal-${e}`),this.options.header!=null){this.header=document.createElement("div"),this.header.className="pvt-modal__header",this.setHeader(this.options.header),this.modal.appendChild(this.header);const n=ht({text:"×",variant:"outline-primary",size:"sm",onClick:()=>{this.hide()},style:"margin-left: auto;"});this.header.appendChild(n)}this.body=document.createElement("div"),this.body.className="pvt-modal__body",this.setBody(this.options.body),this.options.noBodyPadding?this.body.style.padding="0":this.body.style.padding="",this.modal.appendChild(this.body),this.options.buttons!=null&&(this.footer=document.createElement("div"),this.footer.className="pvt-modal__footer",this.setButtons(this.options.buttons),this.modal.appendChild(this.footer)),this.overlay.appendChild(this.modal),t.appendChild(this.overlay)}destroy(){this.hide(),requestAnimationFrame(()=>{var t;(t=this.overlay)==null||t.remove(),this.overlay=void 0})}afterMount(){}graphReady(){}setButtons(t){!this.modal||!this.footer||(this.footer.innerHTML="",t.forEach(e=>{if(typeof e.onClick=="function"){const r=e.onClick;e.onClick=(s,o)=>{r&&r(s,o)},e.onClickArgs=[this.hide.bind(this)]}const n=ht(e);this.footer.appendChild(n)}))}setHeader(t){this.header&&(this.header.innerHTML="",t&&(this.options.header instanceof HTMLElement?this.header.appendChild(this.options.header):this.options.rawHeader?this.header.innerHTML=this.options.header:this.header.textContent=this.options.header))}setBody(t){this.body&&(this.body.innerHTML="",t&&(t instanceof HTMLElement?this.body.appendChild(t):this.options.rawBody?this.body.innerHTML=t:this.body.textContent=t))}show(){if(!this.modal||!this.overlay)return;this.dispatchEvent("show"),this.modal.classList.add("pvt-modal-open");const t=e=>{var n;e.target===this.modal&&((n=this.modal)==null||n.removeEventListener("animationend",t),this.dispatchEvent("shown"))};this.modal.addEventListener("animationend",t)}hide(){var t;!this.modal||!this.overlay||(this.dispatchEvent("hide"),this.modal.classList.remove("pvt-modal-open"),(t=this.overlay)==null||t.remove(),requestAnimationFrame(()=>{this.dispatchEvent("hidden")}))}dispatchEvent(t){if(!this.modal)return;const e=`pvt-modal-${t}`,n=new CustomEvent(e,{bubbles:!0,cancelable:!0});this.modal.dispatchEvent(n);const r=`on${t.charAt(0).toUpperCase()}${t.slice(1)}`,s=this.options[r];typeof s=="function"&&s()}}const Cu={enabled:!0,allowPinning:!0};class _u{constructor(t){f(this,"uiManager");f(this,"options");f(this,"tooltip");f(this,"parentContainer");f(this,"shadowLinkContainer");f(this,"mouseX",0);f(this,"mouseY",0);f(this,"x",0);f(this,"y",0);f(this,"triggerX",0);f(this,"triggerY",0);f(this,"hoveredElementID",null);f(this,"hoveredElement",null);f(this,"showDelay",400);f(this,"hideDelay",200);f(this,"tooltipTimeout",null);f(this,"hideTimeout",null);f(this,"tooltipDataMap",new Map);f(this,"shadowlinkMap",new WeakMap);f(this,"shadowlinkBoundingBoxesMap",new WeakMap);this.uiManager=t,this.options=Kt(Cu,this.uiManager.getOptions().tooltip)}mount(t){if(!t)return;this.parentContainer=document.querySelector("body");const e=this.parentContainer.querySelector(".pvt-tooltip"),n=this.parentContainer.querySelector(".pivotick-shadowlink-container");if(e&&n){this.tooltip=e,this.shadowLinkContainer=n;return}const r=document.createElement("template");r.innerHTML='
',this.tooltip=r.content.firstElementChild,this.shadowLinkContainer=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.shadowLinkContainer.setAttribute("class","pivotick-shadowlink-container"),this.parentContainer.appendChild(this.tooltip),this.parentContainer.appendChild(this.shadowLinkContainer)}destroy(){var t;(t=this.tooltip)==null||t.remove(),this.tooltip=void 0}afterMount(){}graphReady(){this.tooltip&&(this.uiManager.graph.renderer.getGraphInteraction().on("nodeHoverIn",this.nodeHovered.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("nodeHoverOut",this.delayedHide.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("canvasMousemove",this.updateMousePosition.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("dragging",(t,e)=>{this.hoveredElementID===e.id&&this.hide(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("canvasZoom",this.canvasZoomed.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("simulationSlowTick",this.simulationSlowTick.bind(this)),this.tooltip.addEventListener("mouseenter",()=>{this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null)}),this.tooltip.addEventListener("mouseleave",()=>this.hide()))}updateMousePosition(t){this.mouseX=t.pageX,this.mouseY=t.pageY}tooltipCanBeShown(){if(!this.tooltip||this.uiManager.graph.simulation.isDragging())return!1;const t=this.uiManager.graph.renderer.getSelectionBox();return!(t!==null&&t.selectionInProgress()||Math.abs(this.triggerX-this.mouseX)>=50||Math.abs(this.triggerY-this.mouseY)>=50)}openForNodeOnElement(t,e){this.triggerX=t.pageX,this.triggerY=t.pageY,this.mouseY=t.pageY,this.mouseX=t.pageX,this.hoveredElementID=e.id,this.hoveredElement=e,this.tooltipCanBeShown()&&this.show(()=>{this.createNodeTooltip(e)})}nodeHovered(t,e){this.hoveredElementID!==e.id&&(this.triggerX=t.pageX,this.triggerY=t.pageY,this.hoveredElementID=e.id,this.hoveredElement=e,this.tooltipCanBeShown()&&this.show(()=>{this.createNodeTooltip(e)}))}edgeHovered(t,e){this.hoveredElementID!==e.id&&(this.triggerX=t.pageX,this.triggerY=t.pageY,this.hoveredElementID=e.id,this.hoveredElement=e,this.tooltipCanBeShown()&&this.show(()=>{if(this.uiManager.graph.simulation.isDragging()){this.hide();return}this.createEdgeTooltip(e)}))}canvasZoomed(){this.updateShadowLinks(!0)}simulationSlowTick(){this.updateShadowLinks(!0)}buildNodeTooltip(t){var v;const r=st(` +
+
+
+ + +
+
+
+
+
+
+
+
+
`),s=r.querySelector(".pvt-mainheader-container"),o=r.querySelector(".pvt-mainheader-icon"),a=r.querySelector(".pvt-mainheader-nodeinfo-name"),c=r.querySelector(".pvt-mainheader-nodeinfo-subtitle"),l=r.querySelector(".pvt-mainheader-topright"),h=Pn(t,this.uiManager.getOptions().propertiesPanel),u=t.getGraphElement();if(u&&u instanceof SVGGElement){const b=u.cloneNode(!0);(v=b.querySelector("circle.pvt-node-selected-highlight"))==null||v.remove();const y=u.getBBox(),_=32/Math.max(y.width,y.height);b.setAttribute("transform",`translate(${(32-y.width*_)/2-y.x*_}, ${(32-y.height*_)/2-y.y*_}) scale(${_})`),o.appendChild(b)}if(a.textContent=Rt(t,this.uiManager.getOptions().mainHeader),c.textContent=ur(t,this.uiManager.getOptions().mainHeader),this.options.allowPinning){const b=ht({title:"Pin Tooltip",variant:"outline-primary",size:"sm",class:"pin-button",svgIcon:Zt,onClick:()=>{this.pinTooltip()}});l.appendChild(b)}const d=this.uiManager.getOptions().tooltip.render;if(d&&typeof d=="function"){const b=wt(d,t);if(b){const y=I("div",{class:"pivotick-extra-content-container"},[b]);r.appendChild(y)}return r}const p=I("div",{class:"pvt-properties-container"},[Ce(h,t)]);r.appendChild(s),r.appendChild(p);const m=this.uiManager.getOptions().tooltip.renderNodeExtra;if(m&&typeof m=="function"){const b=wt(m,t);if(b){const y=I("div",{class:"pivotick-extra-content-container"},[b]);r.appendChild(y)}}return r}createNodeTooltip(t){if(!this.tooltip)return!1;this.tooltip.innerHTML="";const e=this.buildNodeTooltip(t);this.tooltip.appendChild(e)}createEdgeTooltip(t){if(!this.tooltip)return!1;this.tooltip.innerHTML="";const n=` +
+
+
+ ${Xe(32)} + +
+
+
+
+
+
+
+
+
`,r=st(n),s=r.querySelector(".pvt-mainheader-container"),o=r.querySelector(".pvt-mainheader-nodeinfo-name"),a=r.querySelector(".pvt-mainheader-nodeinfo-subtitle"),c=r.querySelector(".pvt-mainheader-topright"),l=ht({title:"Pin Tooltip",variant:"outline-primary",size:"sm",class:"pin-button",svgIcon:Zt,onClick:()=>{this.pinTooltip()}});c.appendChild(l);const h=this.uiManager.getOptions().tooltip.render;if(h&&typeof h=="function"){const m=wt(h,t);if(m){const v=I("div",{class:"pivotick-extra-content-container"},[m]);r.appendChild(v)}this.tooltip.appendChild(r);return}const u=Fn(t,this.uiManager.getOptions().propertiesPanel);o.textContent=pe(t,this.uiManager.getOptions().mainHeader),a.textContent=dr(t,this.uiManager.getOptions().mainHeader);const d=I("div",{class:"pvt-properties-container"},[Ce(u,t)]);r.appendChild(s),r.appendChild(d);const p=this.uiManager.getOptions().tooltip.renderEdgeExtra;if(p&&typeof p=="function"){const m=wt(p,t);if(m){const v=I("div",{class:"pivotick-extra-content-container"},[m]);r.appendChild(v)}}this.tooltip.appendChild(r)}setPosition(){var d,p,m,v;if(!this.tooltip)return;const t=(p=(d=this.hoveredElement)==null?void 0:d.getGraphElement())==null?void 0:p.getBoundingClientRect();if(!t)return;const e=(v=(m=this.uiManager.layout)==null?void 0:m.canvas)==null?void 0:v.getBoundingClientRect();if(!e)return;const n=this.uiManager.getOptions().tooltip.setPosition;if(n&&typeof n=="function"){n(this.tooltip,t,e);return}const r=20,s=15,o=e.left+window.scrollX,a=e.top+window.scrollY,c=e.width,l=e.height,h=this.tooltip.offsetWidth,u=this.tooltip.offsetHeight;this.x=t.x+t.width+s,this.y=t.y,this.x+h+r>o+c&&(this.x=t.x-h-s),this.xa+l&&(this.y-=u),this.ythis.hide(e),this.hideDelay)}hide(t){this.tooltip&&(this.hideTimeout&&clearTimeout(this.hideTimeout),(this.hoveredElement===t||t===void 0)&&(this.tooltipTimeout&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=null),this.hoveredElementID=null,this.hoveredElement=null,this.triggerX=-2e3,this.triggerY=-2e3,this.tooltip.classList.remove("shown"),this.tooltip.style.left="-10000px"))}show(t){var e;(e=this.uiManager.contextMenu)!=null&&e.visible||(this.tooltipTimeout&&clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(()=>{var n;t&&t(),(n=this.tooltip)==null||n.classList.add("shown"),requestAnimationFrame(()=>{this.setPosition()})},this.showDelay))}pinTooltip(){var a;if(!this.tooltip||!this.parentContainer||!this.hoveredElement)return;const t=this.tooltip.cloneNode(!0);this.tooltipDataMap.set(t,this.hoveredElement),t.classList.add("pvt-tooltip-floating"),(a=t.querySelector(".pin-button"))==null||a.remove();const e=ht({title:"Close Tooltip",variant:"outline-danger",size:"sm",class:["close-button"],svgIcon:Yh,onClick:()=>{this.tooltipDataMap.delete(t),this.reomveShadowLink(t),t.remove()}}),n=ht({title:"Focus Element in Graph",variant:"outline-primary",size:"sm",class:["focus-element"],svgIcon:Er,onClick:()=>{const c=this.tooltipDataMap.get(t);c&&this.uiManager.graph.focusElement(c)}}),r=ht({title:"Select Element in Graph",variant:"outline-primary",size:"sm",class:["select-element"],svgIcon:Zh,onClick:()=>{const c=this.tooltipDataMap.get(t);c&&this.uiManager.graph.selectElement(c)}}),s=I("div",{class:"pvt-tooltip-topbar"},[n,r,e]);t.prepend(s);const o=this.uiManager.getAppContainer();ds(t,s,o,{onDragStart:(c,l)=>{this.shadowlinkBoundingBoxesMap.set(l,[l.getBoundingClientRect(),this.tooltipDataMap.get(l).getGraphElement().getBoundingClientRect()])},onDrag:(c,l)=>{this.updateShadowLink(l,this.tooltipDataMap.get(l))}}),this.parentContainer.appendChild(t),this.addShadowLink(t)}addShadowLink(t){var n;const e=cs("path",{class:"pivotick-shadowlink"});this.shadowlinkMap.set(t,e),(n=this.shadowLinkContainer)==null||n.appendChild(e)}updateShadowLinks(t=!1){for(const[e,n]of this.tooltipDataMap.entries())this.updateShadowLink(e,n,t)}updateShadowLink(t,e,n=!1){let r;n?r=[t.getBoundingClientRect(),e.getGraphElement().getBoundingClientRect()]:r=this.shadowlinkBoundingBoxesMap.get(t);const{width:s,height:o}=r[0],{x:a,y:c,width:l,height:h}=r[1],u=this.shadowlinkMap.get(t),d=parseFloat(t.style.left),p=parseFloat(t.style.top);u&&u.setAttribute("d",`M ${d+s/2} ${p+o/2} L ${a+l/2} ${c+h/2}`)}reomveShadowLink(t){const e=this.shadowlinkMap.get(t);e&&e.remove()}}const Mu={topbar:[{title:"Pin Node",svgIcon:Zt,variant:"outline-primary",visible:i=>!i.frozen,onclick(i,t){t.freeze()}},{title:"Unpin Node",svgIcon:Un,variant:"outline-primary",visible:i=>i.frozen,onclick(i,t){t.unfreeze()}},{title:"Focus Node",svgIcon:Er,variant:"outline-primary",onclick(i,t){this.uiManager.graph.focusElement(t)}},{title:"Hide Node",svgIcon:Vn,variant:"outline-danger",flushRight:!0,visible:i=>i.visible,onclick(i,t){this.uiManager.graph.queryEngine.excludeNode(t)}}],menu:[{text:"Select Neighbors",title:"Select Neighbors",svgIcon:Hh,variant:"outline-primary",onclick(i,t){const e=[...t.getConnectedNodes(),...t.getConnectingNodes()].map(n=>({node:n,element:n.getGraphElement()}));this.uiManager.graph.renderer.getGraphInteraction().selectNodes(e)}},{text:"Hide Children",title:"Hide Children",svgIcon:Vn,variant:"outline-primary",visible:i=>i.visible,onclick(i,t){t.hide()}},{text:"Expand Node",title:"Expand Node",svgIcon:Nr,variant:"outline-primary",visible:i=>!1,onclick(i,t){}},{text:"Inspect Properties",title:"Inspect Properties",svgIcon:Kh,variant:"outline-primary",visible:i=>!0,onclick(i,t){this.uiManager.graph.renderer.getGraphInteraction().selectNode(t.getGraphElement(),t)}}]},Su={topbar:[],menu:[]},Eu={topbar:[{title:"Pin All",svgIcon:Zt,variant:"outline-primary",visible:!0,onclick(i){(this.uiManager.graph.getMutableNodes()??[]).forEach(e=>{e.freeze()})}},{title:"Unpin All",svgIcon:Un,variant:"outline-primary",visible:!0,onclick(i){var e;(this.uiManager.graph.getMutableNodes()??[]).forEach(n=>{n.unfreeze()}),(e=this.uiManager.graph.simulation)==null||e.reheat()}}],menu:[]};class ku{constructor(t){f(this,"uiManager");f(this,"menu");f(this,"visible");f(this,"parentContainer");f(this,"element",null);f(this,"menuNode");f(this,"menuEdge");f(this,"menuCanvas");this.uiManager=t,this.visible=!1,this.menuNode=Kt(Mu,this.uiManager.getOptions().contextMenu.menuNode??{}),this.menuEdge=Kt(Su,this.uiManager.getOptions().contextMenu.menuEdge??{}),this.menuCanvas=Kt(Eu,this.uiManager.getOptions().contextMenu.menuCanvas??{}),this.wrapOnclickActions()}mount(t){if(!t)return;this.parentContainer=document.querySelector("body");const e=this.parentContainer.querySelector(".pvt-contextmenu");if(e){this.menu=e;return}const n=document.createElement("template");n.innerHTML=` +
+
+
+
+ `,this.menu=n.content.firstElementChild,this.parentContainer.appendChild(this.menu)}destroy(){var t;(t=this.menu)==null||t.remove(),this.menu=void 0}afterMount(){}graphReady(){this.uiManager.graph.renderer.getGraphInteraction().on("nodeContextmenu",this.nodeClicked.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("edgeContextmenu",this.edgeClicked.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("canvasContextmenu",this.canvasClicked.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("canvasClick",()=>{this.hide()}),this.uiManager.graph.renderer.getGraphInteraction().on("canvasZoom",()=>{this.hide()})}nodeClicked(t,e){this.menu&&(this.element=e,this.createNodeMenu(e),this.setPosition(t),this.show())}edgeClicked(t,e){this.menu&&(this.element=e,this.createEdgeMenu(e),this.setPosition(t),this.show())}canvasClicked(t){this.menu&&(this.element=null,this.createCanvasMenu(),this.setPosition(t),this.show())}wrapOnclickActions(){[this.menuNode.menu,this.menuNode.topbar,this.menuEdge.menu,this.menuEdge.topbar,this.menuCanvas.menu,this.menuCanvas.topbar].forEach(t=>{t.forEach(e=>{this.wrapOnclickAction(e)})})}wrapOnclickAction(t){if(t.onclick){const e=t.onclick,n=this;t.onclick=function(r,s){var o;e.apply(this,[r,s]),(o=n.hide)==null||o.call(n)}}}createNodeMenu(t){if(!this.menu)return;const e=this.menu.querySelector(".pvt-contextmenu-topbar"),n=this.menu.querySelector(".pvt-contextmenu-mainmenu");e.innerHTML="",n.innerHTML="",e.appendChild(_e(this,this.menuNode.topbar,this.element)),n.appendChild(Me(this,this.menuNode.menu,this.element))}createEdgeMenu(t){if(!this.menu)return;const e=this.menu.querySelector(".pvt-contextmenu-topbar"),n=this.menu.querySelector(".pvt-contextmenu-mainmenu");e.innerHTML="",n.innerHTML="",e.appendChild(_e(this,this.menuEdge.topbar,this.element)),n.appendChild(Me(this,this.menuEdge.menu,this.element))}createCanvasMenu(){if(!this.menu)return;const t=this.menu.querySelector(".pvt-contextmenu-topbar"),e=this.menu.querySelector(".pvt-contextmenu-mainmenu");t.innerHTML="",e.innerHTML="",t.appendChild(_e(this,this.menuCanvas.topbar,this.element)),e.appendChild(Me(this,this.menuCanvas.menu,this.element))}show(){var t;this.visible||this.menu&&((t=this.uiManager.tooltip)==null||t.hide(),this.menu.classList.add("shown"),this.visible=!0)}hide(){this.visible&&this.menu&&(this.element=null,this.menu.classList.remove("shown"),this.menu.style.left="-10000px",this.visible=!1)}setPosition(t){if(!this.menu)return;const e=10,n=t.pageX,r=t.pageY;this.menu.style.left=`${n+e}px`,this.menu.style.top=`${r+e}px`}}class Nu{constructor(){f(this,"bindings",new Map)}register(t){this.bindings.set(t.key,t.callback)}handleKeyPress(t){const e=this.getKeyCombo(t),n=this.bindings.get(e);n&&(t.preventDefault(),n(t))}getKeyCombo(t){const e=[];return t.ctrlKey&&e.push("Ctrl"),t.shiftKey&&e.push("Shift"),t.altKey&&e.push("Alt"),e.push(t.key),e.join("+")}}const Pr=i=>{const t=[];for(const[e,n]of Object.entries(i.getData()))e&&n&&t.push({name:e,value:n});return t},Ye=(i,t,e="")=>{var r;const n=(r=i.getData())==null?void 0:r[t];return typeof n=="string"?n:e},Au=i=>Ye(i,"label","Could not resolve title"),Tu=i=>Ye(i,"description"),Iu=i=>Ye(i,"label",""),Lu=i=>Ye(i,"description"),Fr=i=>Pr(i),zr=i=>Pr(i),Or={nodeHeaderMap:{title:Au,subtitle:Tu},edgeHeaderMap:{title:Iu,subtitle:Lu},render:void 0},Du={mode:"viewer",mainHeader:Or,sidebar:{collapsed:"auto"},propertiesPanel:{nodePropertiesMap:Fr,edgePropertiesMap:zr},neighborsPanel:{},tooltip:{enabled:!0,allowPinning:!0,nodePropertiesMap:Fr,edgePropertiesMap:zr,...Or},navigation:{enabled:!0},contextMenu:{enabled:!0,menuNode:{topbar:[],menu:[]},menuEdge:{topbar:[],menu:[]},menuCanvas:{topbar:[],menu:[]}},selectionMenu:{menuNode:{topbar:[],menu:[]}},extraPanels:[]};class Pu{constructor(t,e,n){f(this,"graph");f(this,"container");f(this,"options");f(this,"layout");f(this,"slidePanel");f(this,"sidebar");f(this,"toolbar");f(this,"modal");f(this,"graphNaviation");f(this,"graphControls");f(this,"tooltip");f(this,"contextMenu");f(this,"keyManager");this.graph=t,this.container=e,this.options=Yt({},Du,n),this.keyManager=new Nu,this.setup()}setup(){switch(this.destroy(),this.options.theme&&this.container.setAttribute("data-theme",this.options.theme.toString()),this.options.mode){case"viewer":this.setupViewerMode();break;case"full":this.setupFullMode();break;case"light":this.setupLightMode();break;case"static":this.setupStaticMode();break;default:console.warn(`Unknown mode: ${this.options.mode}. Defaulting to 'viewer'.`),this.setupViewerMode();break}this.callAfterMount()}hasEnoughSpaceForFullMode(){const t=this.container.getBoundingClientRect();return t.width>1200&&t.height>800}hasEnoughSpaceForLightMode(){const t=this.container.getBoundingClientRect();return t.width>600&&t.height>600}setupViewerMode(){this.buildLayout(),this.buildUIGraphNavigation()}setupStaticMode(){this.buildLayout()}setupFullMode(){var t,e;((e=(t=this.options)==null?void 0:t.sidebar)==null?void 0:e.collapsed)==="auto"&&!this.hasEnoughSpaceForFullMode()&&(console.debug("Not enough space for full mode UI. Collapsing sidebar"),this.options.sidebar.collapsed=!0),this.buildLayout(),this.buildUIGraphNavigation(),this.buildUIGraphControls(),this.buildToolbar(),this.buildSidebar()}setupLightMode(){if(!this.hasEnoughSpaceForLightMode()){console.warn("Not enough space for light mode UI. Switching to viewer mode."),this.options.mode="viewer",this.setupViewerMode();return}this.buildLayout(),this.buildUIGraphNavigation(),this.buildUIGraphControls(),this.buildToolbar()}buildLayout(){this.layout=new ru,this.layout.mount(this.container,this.options.mode)}buildUIGraphNavigation(){var t,e,n,r,s;this.options.navigation.enabled&&(this.graphNaviation=new iu(this),this.graphNaviation.mount((t=this.layout)==null?void 0:t.graphnavigation)),(e=this.options.tooltip)!=null&&e.enabled&&(this.tooltip=new _u(this),this.tooltip.mount((n=this.layout)==null?void 0:n.canvas)),(r=this.options.contextMenu)!=null&&r.enabled&&(this.contextMenu=new ku(this),this.contextMenu.mount((s=this.layout)==null?void 0:s.canvas))}buildUIGraphControls(){var t;this.graphControls=new nu(this),this.graphControls.mount((t=this.layout)==null?void 0:t.graphcontrols)}buildToolbar(){var t;this.toolbar=new wu(this),this.toolbar.mount((t=this.layout)==null?void 0:t.toolbar)}buildSidebar(){var t;this.sidebar=new gu(this),this.sidebar.mount((t=this.layout)==null?void 0:t.sidebar)}destroy(){this.layout&&(this.layout.destroy(),this.layout=void 0)}callAfterMount(){var t,e,n,r,s,o,a,c,l;(t=this.layout)==null||t.afterMount(),(e=this.toolbar)==null||e.afterMount(),(n=this.sidebar)==null||n.afterMount(),(r=this.graphNaviation)==null||r.afterMount(),(s=this.graphControls)==null||s.afterMount(),(o=this.options.tooltip)!=null&&o.enabled&&((a=this.tooltip)==null||a.afterMount()),(c=this.options.contextMenu)!=null&&c.enabled&&((l=this.contextMenu)==null||l.afterMount()),this.container.addEventListener("keydown",h=>this.keyManager.handleKeyPress(h)),this.container.setAttribute("tabindex","0")}getOptions(){return this.options}getAppContainer(){const t=this.graph.getAppID();return document.getElementById(t)}callGraphReady(){var t,e,n,r;(t=this.graphControls)==null||t.graphReady(),(e=this.sidebar)==null||e.graphReady(),(n=this.tooltip)==null||n.graphReady(),(r=this.contextMenu)==null||r.graphReady()}showNotification(t){var h;const{level:e,title:n,message:r}=t,s=(h=this.layout)==null?void 0:h.notification;if(!s)return;const o=document.createElement("template");o.innerHTML=` +
+
+
+
+
+
+`;const a=o.content.firstElementChild,c=a.querySelector(".pivotick-toast-title"),l=a.querySelector(".pivotick-toast-body");c&&(c.textContent=n),l&&(l.textContent=r??""),s.appendChild(a),requestAnimationFrame(()=>{a.classList.add("show")}),setTimeout(()=>{a.classList.remove("show"),a.addEventListener("transitionend",()=>{a.remove()},{once:!0})},4e3)}createModal(t){var r,s;if(!((r=this.layout)==null?void 0:r.modal))return;const n=new xu(this,t);return n.mount((s=this.layout)==null?void 0:s.modal),requestAnimationFrame(()=>{n.show()}),n}createSlidepanel(t){var r,s;if(!((r=this.layout)==null?void 0:r.slidePanel))return;const n=new mu(this,t);return n.mount((s=this.layout)==null?void 0:s.slidePanel),n}}const Ze={Success:"success",Warning:"warning",Danger:"danger",Info:"info"};class Fu{constructor(t){f(this,"graph");f(this,"UIManager");this.graph=t,this.UIManager=this.graph.UIManager}notify(t,e,n){const r={level:t,title:e,message:n};this.UIManager.showNotification(r)}success(t,e){this.notify(Ze.Success,t,e)}warning(t,e){this.notify(Ze.Warning,t,e)}error(t,e){this.notify(Ze.Danger,t,e)}info(t,e){this.notify(Ze.Info,t,e)}}const Kn="manually_hidden";class zu{constructor(t){f(this,"graph");f(this,"listeners");f(this,"filters",{});f(this,"excludedNodeIds",new Set);f(this,"hiddenNodeCount",0);this.graph=t,this.listeners={filterAdd:[],filterRemove:[],filterReset:[],filterChange:[]}}on(t,e){this.listeners[t].push(e)}off(t,e){this.listeners[t]=this.listeners[t].filter(n=>n!==e)}emit(t,...e){for(const n of this.listeners[t])n(...e)}getFilters(){const t={value:[...this.excludedNodeIds],matchMode:"exact"};return{...this.filters,manuallyHidden:t}}setFilters(t){for(const[e,n]of Object.entries(t)){if(n===void 0){this.removeFilter(e);return}this.filters[e]=n}this.apply(),this.emit("filterChange",this.getFilters())}setFilter(t,e){if(e===void 0){this.removeFilter(t);return}this.filters[t]=e,this.apply(),this.emit("filterAdd",t,e),this.emit("filterChange",this.getFilters())}removeFilter(t){t in this.filters&&(delete this.filters[t],this.apply(),this.emit("filterRemove",t),this.emit("filterChange",this.getFilters()))}resetFilters(){this.filters={},this.apply(),this.emit("filterReset"),this.emit("filterChange",this.getFilters())}excludeNode(t){let e;if(t instanceof ut?e=t:e=this.graph.getNode(t),e===void 0)return;this.excludedNodeIds.add(e.id),this.hiddenNodeCount++;const n={value:e.id,matchMode:"exact"};this.graph.hideNode(e),this.emit("filterAdd",Kn,n),this.emit("filterChange",this.getFilters())}includeNode(t){let e;t instanceof ut?e=t:e=this.graph.getNode(t),e!==void 0&&(this.excludedNodeIds.delete(e.id),this.hiddenNodeCount--,this.graph.showNode(e),this.emit("filterRemove",Kn),this.emit("filterChange",this.getFilters()))}clearNodeExclusions(){this.hiddenNodeCount+=this.excludedNodeIds.size,this.excludedNodeIds.clear(),this.apply(),this.emit("filterRemove",Kn),this.emit("filterChange",this.getFilters())}getExcludedNodeCount(){return this.excludedNodeIds.size}getExcludedNodes(){return[...this.excludedNodeIds].map(t=>this.graph.getMutableNode(t)).filter(t=>t!==void 0)}getHiddenNodeCount(){return this.hiddenNodeCount}apply(){const t=this.graph.getMutableNodes(),n=t.filter(r=>this.nodeMatchesFilters(r)).filter(r=>r.childrenDepth===0);this.hiddenNodeCount=t.length-n.length,this.applyFiltersOnSubgraph(),this.graph.setVisibleNodes(n)}applyFiltersOnSubgraph(){const t=this.getFilters();this.graph.getMutableNodes().filter(e=>e.childrenDepth===0).forEach(e=>{const n=e.getSubgraph();e.isParent&&n&&(n.queryEngine.resetFilters(),n.queryEngine.setFilters(t))})}nodeMatchesFilters(t){if(this.excludedNodeIds.has(t.id))return!1;for(const[e,n]of Object.entries(this.filters)){if(e==="manuallyHidden")continue;const r=t.getData()[e];if(!this.matches(r,n))return!1}return!0}matches(t,e){if(e===void 0)return!0;if(t===void 0)return!1;const n=e.value,r=(e==null?void 0:e.matchMode)??"partial";if(typeof n=="string")return r==="partial"?String(t).includes(n):t===n;if(typeof n=="number"||typeof n=="boolean")return t===n;if(Array.isArray(n))return r==="partial"?n.includes(t):t===n;if(typeof n=="object"&&n!==null){const{min:s,max:o}=n;return!(typeof t!="number"||s!==void 0&&to)}return!1}}class ft{constructor(t,e,n){f(this,"nodes",new Map);f(this,"edges",new Map);f(this,"UIManager");f(this,"notifier");f(this,"renderer");f(this,"simulation");f(this,"queryEngine");f(this,"options");f(this,"app_id");f(this,"parentGraph");f(this,"graphDepth");f(this,"listeners");var c,l,h;if(this.listeners={ready:[],nodeAdd:[],nodeRemove:[],nodeChange:[],edgeAdd:[],edgeRemove:[],edgeChange:[],dataBatchChanged:[]},this.options={isDirected:!0,...n},((c=this.options.UI)==null?void 0:c.mode)==="static"&&(this.options.simulation||(this.options.simulation={}),this.options.simulation.enabled=!1,this.options.simulation.useWorker=!1,this.options.render||(this.options.render={}),this.options.render.zoomEnabled=!1,this.options.render.zoomAnimation=!1,this.options.render.dragEnabled=!1,this.options.render.selectionBox||(this.options.render.selectionBox={}),this.options.render.selectionBox.enabled=!1,this.options.UI.tooltip||(this.options.UI.tooltip={}),this.options.UI.tooltip.enabled=!1,this.options.UI.contextMenu||(this.options.UI.contextMenu={}),this.options.UI.contextMenu.enabled=!1),this.graphDepth=0,this.options.parentGraph){this.setParentGraph(this.options.parentGraph);let u=this.parentGraph;for(;u;)u=u.parentGraph,this.graphDepth++}const r={...this.options.render},s=this.options.UI,o=document.createElement("div");this.app_id=cn(8,"pivotick-app-"),o.id=this.app_id,o.classList.add("pivotick"),t.appendChild(o),this.queryEngine=new zu(this),this.UIManager=new Pu(this,o,s),this.notifier=new Fu(this),this.renderer=Yc(this,o,r),this.renderer.setupRendering();const a={...this.options.simulation,layout:(l=this.options)==null?void 0:l.layout};if(this.simulation=new Pt(this,a),e){const u=ft.normalizeGraphData(e);this._setData(u==null?void 0:u.nodes,u==null?void 0:u.edges),(h=this.simulation)==null||h.update(),this.renderer.init(),this.renderer.fitAndCenter(1)}this.startAndRender()}on(t,e){this.listeners[t].push(e)}off(t,e){this.listeners[t]=this.listeners[t].filter(n=>n!==e)}emit(t,...e){for(const n of this.listeners[t])n(...e)}async startAndRender(){await this.simulation.start(),await this.simulation.waitForSimulationStop(),this.renderer.nextTick(),this.renderer.fitAndCenter(),this.UIManager.callGraphReady(),this.ready()}static normalizeGraphData(t){const e=t.nodes.map(l=>ft.normalizeNode(l)),n=new Map,r=l=>{l.children.forEach(h=>{n.set(h.id,h),h.hasChildren()&&r(h)})};e.forEach(l=>{r(l)});const s=new Map(e.map(l=>[l.id,l])),o=new Map([...s,...n]),a=t.edges.map(l=>ft.normalizeEdge(l,o)).filter(l=>l!==null),c=[];for(const l of a)if(!l.from.isChild&&l.to.isChild&&l.to.parentNode){let h=l.to.parentNode;const u=new Set;for(;h&&!u.has(h.id);){u.add(h.id);const d=`synthetic-${l.from.id}-${h.id}`,p=new dt(d,l.from,h,{},{},null,l.to);if(p.to.isChild&&p.hide(),c.push(p),!h.parentNode)break;h=h.parentNode}}return a.push(...c),{nodes:e,edges:a}}static normalizeNode(t,e=0){let n=[];!(t instanceof ut)&&t.children&&(n=t.children.map(s=>ft.normalizeNode(s,e+1)));const r=t instanceof ut?t:new ut(t.id.toString(),t.data,t.style,t.domID,n);return r.children.forEach(s=>{s.markAsChild(r,e+1),s.hide()}),r.weight=t.weight,r.expanded=t.expanded,r}static normalizeEdge(t,e){var a;if(t instanceof dt)return t;const n=e,r=n.get(t.from.toString()),s=n.get(t.to.toString());if(!r||!s)return null;const o=new dt(((a=t.id)==null?void 0:a.toString())??`${t.from}-${t.to}`,r,s,t.data,t.style);return(r.isChild||s.isChild)&&o.hide(),o}ready(){this.emit("ready")}nodeAdd(t){this.emit("nodeAdd",t)}nodeRemove(t){this.emit("nodeRemove",t)}nodeChange(t,e,n){this.emit("nodeChange",t,e,n)}edgeAdd(t){this.emit("edgeAdd",t)}edgeRemove(t){this.emit("edgeRemove",t)}edgeChange(t,e,n){this.emit("edgeChange",t,e,n)}dataBatchChanged(t){t&&(this.emit("dataBatchChanged",t),t.forEach(e=>{switch(e.type){case"node:add":this.nodeAdd(e.node);break;case"node:change":this.nodeChange(e.node,e.previousData,e.nextData);break;case"node:remove":this.nodeRemove(e.node);break;case"edge:add":this.edgeAdd(e.edge);break;case"edge:change":this.edgeChange(e.edge,e.previousData,e.nextData);break;case"edge:remove":this.edgeRemove(e.edge);break}}))}getOptions(){return this.options}getCallbacks(){var t;return(t=this.options)==null?void 0:t.callbacks}onChange(){var t,e,n;(t=this.renderer)==null||t.update(!0),(e=this.simulation)==null||e.update(),(n=this.renderer)==null||n.nextTick()}updateData(t,e,n=!0){const r=[];t&&t.forEach(s=>{var o;this.nodes.has(s.id)?(r.push({type:"node:change",node:s,previousData:(o=this.nodes.get(s.id))==null?void 0:o.getData(),nextData:s.getData()}),this.nodes.set(s.id,s)):(this.addNode(s),r.push({type:"node:add",node:s}))}),e&&e.forEach(s=>{var o;this.edges.has(s.id)?(r.push({type:"edge:change",edge:s,previousData:(o=this.nodes.get(s.id))==null?void 0:o.getData(),nextData:s.getData()}),this.edges.set(s.id,s)):(this.addEdge(s),r.push({type:"edge:add",edge:s}))}),(t||e)&&this.onChange(),n&&this.dataBatchChanged(r)}setData(t=[],e=[]){this.nodes.clear(),this.edges.clear();const n=ft.normalizeGraphData({nodes:t,edges:e});this._setData(n==null?void 0:n.nodes,n==null?void 0:n.edges),this.onChange(),this.startAndRender()}_setData(t,e){const n=s=>{s.children.forEach(o=>{this.nodes.set(o.id,o),o.hasChildren()&&n(o)})},r=[];t.forEach(s=>{this.nodes.set(s.id,s),r.push({type:"node:add",node:s}),n(s)}),e.forEach(s=>{if(!this.nodes.has(s.from.id)||!this.nodes.has(s.to.id)){console.warn(`Edge is pointing a node that doesn't exist. (${this.nodes.get(s.from.id)}) -> (${this.nodes.get(s.to.id)}). It has been skipped`);return}this.edges.set(s.id,s),r.push({type:"edge:add",edge:s})}),this.dataBatchChanged(r)}addNode(t){const e=ft.normalizeNode(t);if(this.nodes.has(e.id))throw new Error(`Node with id ${e.id} already exists.`);return this.nodes.set(e.id,e),this.dataBatchChanged([{type:"node:add",node:e}]),this.onChange(),e}getNode(t){const e=this._getNode(t);return e?structuredClone(e):void 0}getMutableNode(t){return this._getNode(t)}_getNode(t){if(typeof t=="string"){const e=this.nodes.get(t);return e||void 0}else return t instanceof ut?t:void 0}removeNode(t){if(this.nodes.has(t)){this.dataBatchChanged([{type:"node:remove",node:this.nodes.get(t)}]),this.nodes.delete(t);for(const[e,n]of this.edges)(n.from.id===t||n.to.id===t)&&(this.dataBatchChanged([{type:"edge:remove",edge:this.edges.get(e)}]),this.edges.delete(e));this.onChange()}}addEdge(t){const e=ft.normalizeEdge(t,this.nodes);if(!e)throw new Error("Either of the from or to nodes do not exist");if(this.edges.has(e.id))throw new Error(`Edge with id ${e.id} already exists.`);if(!this.nodes.has(e.from.id)||!this.nodes.has(e.to.id))throw new Error("Both nodes must exist in the graph before adding an edge.");return this.edges.set(e.id,e),this.dataBatchChanged([{type:"edge:add",edge:e}]),this.onChange(),e}getEdge(t){const e=this.edges.get(t);return e?structuredClone(e):void 0}getMutableEdge(t){return this.edges.get(t)}removeEdge(t){this.edges.has(t)&&(this.dataBatchChanged([{type:"edge:remove",edge:this.edges.get(t)}]),this.edges.delete(t),this.onChange())}getNodeCount(){return this.nodes.size}getEdgeCount(){return this.edges.size}getNodes(){return Array.from(this.nodes.values()).filter(t=>!t.isChild).map(t=>t.clone())}getMutableNodes(){return Array.from(this.nodes.values())}getMutableVisibleNodes(){return this.getMutableNodes().filter(t=>t.visible)}getEdges(){return Array.from(this.edges.values()).map(t=>t.clone())}getMutableEdges(){return Array.from(this.edges.values())}getMutableVisibleEdges(){return this.getMutableEdges().filter(t=>t.visible)}getEdgesFromNode(t){const e=this._getNode(t);return e?this.getEdges().filter(n=>n.from.id===e.id):[]}getEdgesToNode(t){const e=this._getNode(t);return e?this.getEdges().filter(n=>n.to.id===e.id):[]}getConnectedNodes(t){const e=this._getNode(t);return e?this.getEdgesFromNode(e.id).map(s=>s.to):[]}setVisibleNodes(t){const e=new Set(t.map(r=>r.id));let n=!1;this.nodes.forEach(r=>{const s=e.has(r.id);r.visible!==s&&(r.toggleVisibility(s),n=!0)}),this.edges.forEach(r=>{var c,l;const s=(((c=r.getSubgraphFromNode())==null?void 0:c.visible)??r.from.visible)&&(((l=r.getSubgraphToNode())==null?void 0:l.visible)??r.to.visible),o=!r.isSynthetic||!r.to.expanded,a=s&&o;r.visible!==a&&(r.toggleVisibility(a),n=!0)}),n&&this.onChange()}hideNode(t){t.hide(),t.getEdgesOut().forEach(e=>{e.hide()}),t.getEdgesIn().forEach(e=>{e.hide()}),this.onChange()}showNode(t){t.show(),t.getEdgesOut().forEach(e=>{e.target.visible&&e.show()}),t.getEdgesIn().forEach(e=>{e.from.visible&&e.show()}),this.onChange()}toggleExpandNode(t){t.toggleExpand(),this.onChange()}toggleExpandNodes(t){t.forEach(e=>{e.toggleExpand()}),this.onChange()}nextTick(){var t;(t=this.renderer)==null||t.nextTick()}nextTickFor(t){var e;(e=this.renderer)==null||e.nextTickFor(t)}destroy(){this.UIManager.destroy()}getAppID(){return this.app_id}setParentGraph(t){this.parentGraph=t}getParentGraph(){return this.parentGraph}getGraphDepth(){return this.graphDepth}updateLayoutProgress(t,e,n){var r;(r=this.renderer)==null||r.updateLayoutProgress(t,e,n)}focusElement(t){this.renderer.focusElement(t)}selectElement(t){t instanceof dt?this.renderer.getGraphInteraction().selectEdge(t.getGraphElement(),t):t instanceof ut&&this.renderer.getGraphInteraction().selectNode(t.getGraphElement(),t)}deselectAll(){this.renderer.getGraphInteraction().unselectAll()}highlightElement(t){this.renderer.highlightElement(t)}unHighlightElement(t){this.renderer.unHighlightElement(t)}}const Qn={pivotick:{colors:["#7EA2FB","#A666F4","#85CB33","#FFB74D","#4DD0E1","#FFD54F","#BA68C8","#81C784","#00BCD4","#FFA726"],maxColors:10,colorblindSafe:!1,description:"Official Pivotick palette"},"d3-category10":{colors:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],maxColors:10,colorblindSafe:!1,description:"Classic D3 categorical palette"},"d3-tableau10":{colors:["#4E79A7","#F28E2B","#E15759","#76B7B2","#59A14F","#EDC948","#B07AA1","#FF9DA7","#9C755F","#BAB0AC"],maxColors:10,colorblindSafe:!1,description:"Modern Tableau 10 palette"},"okabe-ito":{colors:["#E69F00","#56B4E9","#009E73","#F0E442","#0072B2","#D55E00","#CC79A7","#000000"],maxColors:8,colorblindSafe:!0,description:"Colorblind-safe Okabe-Ito palette"},"brewer-set3":{colors:["#8DD3C7","#FFFFB3","#BEBADA","#FB8072","#80B1D3","#FDB462","#B3DE69","#FCCDE5","#D9D9D9","#BC80BD","#CCEBC5","#FFED6F"],maxColors:12,colorblindSafe:!1,description:"Large ColorBrewer Set3 palette"},"tol-bright":{colors:["#4477AA","#EE6677","#228833","#CCBB44","#66CCEE","#AA3377","#BBBBBB"],maxColors:7,colorblindSafe:!0,description:"Paul Tol bright palette"},"kelly-22":{colors:["#F2F3F4","#222222","#F3C300","#875692","#F38400","#A1CAF1","#BE0032","#C2B280","#848482","#008856","#E68FAC","#0067A5","#F99379","#604E97","#F6A600","#B3446C","#DCD300","#882D17","#8DB600","#654522","#E25822","#2B3D26"],maxColors:22,colorblindSafe:!1,description:"Kelly's 22 colors of maximum contrast"},"tableau-40":{colors:["#4E79A7","#A0CBE8","#F28E2B","#FFBE7D","#59A14F","#8CD17D","#B6992D","#F1CE63","#499894","#86BCB6","#E15759","#FF9D9A","#79706E","#BAB0AC","#D37295","#FABFD2","#B07AA1","#D4A6C8","#9D7660","#D7B5A6"],maxColors:40,colorblindSafe:!1,description:"Tableau extended palette, 40 colors"}};class Br{constructor(t){f(this,"palette");f(this,"valueToColor",new Map);f(this,"nextIndex",0);this.palette=this.resolvePalette(t)}resolvePalette(t){var n;if(!t)return((n=Qn.pivotick)==null?void 0:n.colors)??Object.values(Qn)[0].colors;if(Array.isArray(t)){if(t.length===0)throw new Error("Custom palette array cannot be empty.");return t}const e=Qn[t];if(!e)throw new Error(`Palette "${t}" not found in PALETTE_REGISTRY.`);return e.colors}getColor(t){if(t==null)return this.palette[0];const e=this.valueToColor.get(t);if(e)return e;const n=this.palette[this.nextIndex%this.palette.length];return this.valueToColor.set(t,n),this.nextIndex++,n}reset(){this.valueToColor.clear(),this.nextIndex=0}getMapping(){return new Map(this.valueToColor)}}ft.Node=ut,ft.Edge=dt,ft.ColorPaletteMapper=Br;const Rr=1e4,Ke=2e4,Qe=.15*Ke;self.onmessage=i=>{var v,b,y,_;if(i.data.source!=="simulation-worker-wrapper")return;const{nodes:t,edges:e,options:n,canvasBCR:r}=i.data,s=t.map(E=>{const x=new ut(E.id,E.data,E.style);return x.setCircleRadius(E._circleRadius??10),x}),o=new Map(s.map(E=>[E.id,E]));(v=n.layout)==null||v.type;const{simulation:a,simulationForces:c}=Pt.initSimulationForces(n,r),l=[];for(const E of e){const x=o.get(E.from.id),N=o.get(E.to.id);if(x&&N){const D=E.style??{};l.push(new dt(E.id,x,N,E.data,D,E.directed))}}a.nodes(s);const h=a.force("link");h&&h.id(E=>E.id).links(l),((b=n.layout)==null?void 0:b.type)==="tree"?nt.registerForcesOnSimulation(s,l,a,c,n.layout,r,nt):((y=n.layout)==null?void 0:y.type)==="egoTree"&&nt.registerForcesOnSimulation(s,l,a,c,n.layout,r,ve);let u=n.warmupTicks||Ke;u=u==="auto"?Ke:u,u=u-Qe;let d=.3;a.alphaTarget(d);const p=new Date().getTime();let m;for(let E=0;ERr||new Date().getTime()-p>n.cooldownTime||Je(n,a,d)&&new Date().getTime()-p>n.cooldownTime*.15);++E)E%5===0&&(m=Hr(E,new Date().getTime()-p,n),postMessage({type:"tick",progress:m,elapsedTime:new Date().getTime()-p})),a.tick();d=0,a.alphaTarget(d),a.alpha(1);for(let E=0;En.cooldownTime*.15);++E)a.tick(),E%5===0&&(m=Hr(u+E,new Date().getTime()-p,n),postMessage({type:"tick",progress:m,elapsedTime:new Date().getTime()-p}));postMessage({type:"tick",progress:1,elapsedTime:new Date().getTime()-p}),((_=n.layout)==null?void 0:_.type)==="tree"&&nt.simulationDone(s,l,a,n.layout),postMessage({type:"done",nodes:s.map(E=>E.toDict()),edges:l.map(E=>E.toDict())})};function Ou(i,t,e,n){var p,m,v,b;const r=i.map(y=>{const _=new ut(y.id,y.getData(),y.getStyle());return _.weight=y.weight||1,_.setCircleRadius(y.getCircleRadius()),_}),s=new Map(r.map(y=>[y.id,y]));(p=e.layout)==null||p.type;const{simulation:o,simulationForces:a}=Pt.initSimulationForces(e,n),c=[];for(const y of t){const _=s.get(y.from.id),E=s.get(y.to.id);if(_&&E){const x=y.getStyle()??{};c.push(new dt(y.id,_,E,y.getData(),x,y.directed))}}o.nodes(r);const l=o.force("link");l&&l.id(y=>y.id).links(c),(((m=e.layout)==null?void 0:m.type)==="tree"||((v=e.layout)==null?void 0:v.type)==="egoTree")&&nt.registerForcesOnSimulation(r,c,o,a,e.layout,n,nt);let h;e.warmupTicks==="auto"||e.warmupTicks==null?h=Ke:h=e.warmupTicks,h=h-Qe;let u=.3;o.alphaTarget(u);const d=new Date().getTime();for(let y=0;yRr||new Date().getTime()-d>e.cooldownTime||Je(e,o,u)&&new Date().getTime()-d>e.cooldownTime*.15);++y)o.tick();u=0,o.alphaTarget(u),o.alpha(1);for(let y=0;ye.cooldownTime*.15);++y)o.tick();return((b=e.layout)==null?void 0:b.type)==="tree"&&nt.simulationDone(r,c,o,e.layout),{nodes:r,edges:c}}function Hr(i,t,e){return t/e.cooldownTime}function Je(i,t,e){return i.d3AlphaMin>0&&t.alpha()-eht in at?Tg(at,ht,{enumerable:!0,configurable:!0,writable:!0,value:J}):at[ht]=J;var g=(at,ht,J)=>Lg(at,typeof ht!="symbol"?ht+"":ht,J);var ht=typeof document<"u"?document.currentScript:null;function J(i,...t){if(typeof i=="string")return i;if(typeof i=="function"){const e=i(...t);return typeof e=="string"?e:void 0}}function Le(i,...t){if(typeof i=="boolean")return i;if(typeof i=="function"){const e=i(...t);return typeof e=="boolean"?e:void 0}}function Oe(i,...t){if(typeof i=="number")return i;if(typeof i=="function"){const e=i(...t);return typeof e=="number"?e:void 0}}function $n(i,...t){if(Array.isArray(i))return i;if(typeof i=="function"){const e=i(...t);return Array.isArray(e)?e:[]}return[]}function _t(i,...t){if(i instanceof HTMLElement)return i;if(typeof i=="string"){const e=document.createElement("template"),n=i.trim();if(e.innerHTML=n,e.content.firstElementChild)return e.content.firstElementChild;const r=document.createElement("span");return r.textContent=n,r}else if(typeof i=="function"){const e=i(...t);if(typeof e=="string"){const n=document.createElement("template");if(n.innerHTML=e,n.content.firstElementChild)return n.content.firstElementChild;const r=document.createElement("span");return r.textContent=e,r}else return e}}function Gn(i){const t=document.createElement("i");t.className=i,document.body.appendChild(t);let r=getComputedStyle(t).getPropertyValue("--fa").replace(/["']/g,"");const s=parseInt(r.slice(1),16);return r=String.fromCharCode(s),document.body.removeChild(t),r}function vt(i){i.variant=i.variant??"primary";const{variant:t,size:e,onClick:n,onClickArgs:r,iconUnicode:s,iconClass:o,svgIcon:a,imagePath:c,text:l,...h}=i,d=document.createElement("button");d.classList.add("pivotick-button"),d.classList.add(`pivotick-button-${t}`),e&&d.classList.add(`pivotick-button-${e}`);for(const[f,m]of Object.entries(h))f==="class"?Array.isArray(m)?d.classList.add(...m):d.classList.add(String(m)):f in d?d[f]=m:d.setAttribute(f,String(m));let u;s&&(u=j({iconUnicode:s})),o&&(u=j({iconClass:o})),a&&(u=j({svgIcon:a})),c&&(u=j({imagePath:c})),u&&d.append(u);const p=document.createElement("text");if(l&&(u&&(u.style.marginRight="0.1em"),p.textContent=l),d.append(p),typeof n=="function"){const f=r??[];d.addEventListener("click",m=>{n(m,...f)})}return d}const so="outline-primary";function oo(i,t={},e=[]){const n=document.createElementNS("http://www.w3.org/2000/svg",i);for(const[r,s]of Object.entries(t))Array.isArray(s)?n.setAttribute(r,s.join(" ")):n.setAttribute(r,s.toString());for(const r of e)typeof r=="string"?n.appendChild(document.createTextNode(r)):n.appendChild(r);return n}function O(i,t={},e=[]){const n=document.createElement(i);for(const[r,s]of Object.entries(t))Array.isArray(s)?n.setAttribute(r,s.join(" ")):n.setAttribute(r,s.toString());for(const r of e)typeof r=="string"?n.appendChild(document.createTextNode(r)):n.appendChild(r);return n}function st(i){const t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstElementChild}function Pe(i,t){const e=O("dl",{class:"pvt-property-list"});for(const n of i){const r=_t(n.name,t)||"",s=_t(n.value,t)||"",o=O("dl",{class:"pvt-property-row"},[O("dt",{class:"pvt-property-name"},[r]),O("dd",{class:"pvt-property-value"},[s])]);e.append(o)}return e}function De(i,t,e){const n=O("div",{class:"pvt-action-list"}),r=Array.isArray(e)?e[0]:e;return t.forEach(s=>{if(s.visible=s.visible??!0,Le(s.visible,r)??!0){const a=ao(i,s,e);n.appendChild(a)}}),n}function Fe(i,t,e){const n=O("div",{class:"pvt-action-list"}),r=Array.isArray(e)?e[0]:e;return t.forEach(s=>{if(s.visible=s.visible??!0,Le(s.visible,r)??!0){const a=lo(i,s,e);n.appendChild(a)}}),n}function ao(i,t,e){t.variant=t.variant??so;const{onclick:n,...r}=t,s=O("span",{class:["pvt-action-item",`pvt-action-item-${t.variant}`],style:`${t.flushRight?"margin-left: auto;":""}`},[vt({size:"sm",...r})]);return typeof n=="function"&&s.addEventListener("click",o=>{n.call(i,o,e)}),s}function lo(i,t,e){const n=O("div",{class:["pvt-action-item",`pvt-action-item-${t.variant}`]},[j({fixedWidth:!0,...t}),O("span",{class:"pvt-action-text",title:t.title??""},[t.text??""])]);return typeof t.onclick=="function"&&n.addEventListener("click",r=>{t.onclick.call(i,r,e)}),n}function Ai(i=8,t="id-"){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",n=e+"0123456789-_";let r=e.charAt(Math.floor(Math.random()*e.length));for(let s=1;s{var b;const f=new AbortController,{signal:m}=f;r=!0,t.style.transition="none",s=p.clientX,o=p.clientY,a=i.offsetLeft,c=i.offsetTop,l=i.getBoundingClientRect(),h=e.getBoundingClientRect(),(b=n.onDragStart)==null||b.call(n,p,i),document.addEventListener("mousemove",d,{signal:m}),document.addEventListener("mouseup",y=>{f.abort(),u(y)},{signal:m})});function d(p){var C;if(!r||!h||!l)return;const f=p.clientX-s,m=p.clientY-o;let b=a+f,y=c+m;const w=l.width,M=l.height;b=Math.max(h.left,Math.min(b,h.right-w)),y=Math.max(h.top,Math.min(y,h.bottom-M)),i.style.left=b+"px",i.style.top=y+"px",(C=n.onDrag)==null||C.call(n,p,i)}function u(p){var f;r=!1,i.style.transition="",(f=n.onDragStop)==null||f.call(n,p,i)}}let yt=class ro{constructor(t,e,n,r=Ai(),s=[]){g(this,"id");g(this,"data");g(this,"children");g(this,"style");g(this,"edgesOut");g(this,"edgesIn");g(this,"defaultCircleRadius",10);g(this,"x");g(this,"y");g(this,"vx");g(this,"vy");g(this,"fx");g(this,"fy");g(this,"weight");g(this,"frozen");g(this,"visible");g(this,"expanded");g(this,"isChild");g(this,"childrenDepth");g(this,"isParent");g(this,"parentNode");g(this,"_original_object");g(this,"_deepest_node_clone");g(this,"_subgraph");g(this,"_circleRadius",this.defaultCircleRadius);g(this,"_circleRadiusCollapsed",this.defaultCircleRadius);g(this,"_dirty");g(this,"domID");this.id=t,this.domID=r,this.data=e??{},this.style=n??{},this.children=[],this.isParent=!1,this.setChildren(s),this._dirty=!0,this.frozen=!1,this.visible=!0,this.expanded=!1,this.isChild=!1,this.childrenDepth=0,this.edgesOut=new Set,this.edgesIn=new Set}getData(){return this.data}setData(t){this.data=t,this.markDirty()}updateData(t){this.data={...this.data,...t},this.markDirty()}registerEdgeOut(t){this.edgesOut.add(t)}registerEdgeIn(t){this.edgesIn.add(t)}emptyEdges(){this.edgesOut.clear(),this.edgesIn.clear()}getConnectedNodes(){return[...this.edgesOut].map(t=>t.to)}getConnectingNodes(){return[...this.edgesIn].map(t=>t.from)}getEdgesOut(){return[...this.edgesOut]}getEdgesIn(){return[...this.edgesIn]}getStyle(){return this.style}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`node-${this.domID}`):null}toDict(t=!1){const e={id:this.id,data:this.data,style:this.style,weight:this.weight};return t||(e.x=this.x,e.y=this.y,e.vx=this.vx,e.vy=this.vy,e.fx=this.fx,e.fy=this.fy),this.hasChildren()&&(e.children=this.children.map(n=>n.toDict(t))),e}clone(){const t={...this.data},e={...this.style},n=new ro(this.id,t,e);return n.x=this.x,n.y=this.y,n.vx=this.vx,n.vy=this.vy,n.fx=this.fx,n.fy=this.fy,n.weight=this.weight,n.frozen=this.frozen,n.visible=this.visible,n.expanded=this.expanded,n.isChild=this.isChild,n.childrenDepth=this.childrenDepth,n.isParent=this.isParent,n.parentNode=this.parentNode,n._circleRadius=this._circleRadius,n.children=this.children.map(r=>r.clone()),n}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}freeze(){this.frozen=!0,this.fx=this.x,this.fy=this.y}unfreeze(){this.frozen=!1,this.fx=void 0,this.fy=void 0}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}toggleExpand(t){t===void 0?this.expanded?this.collapse():this.expand():t?this.expand():this.collapse(),this.markDirty()}expand(){this.expanded=!0,this._original_object&&(this._original_object.expanded=!0)}collapse(){this.expanded=!1,this._original_object&&(this._original_object.expanded=!1)}degree(){return this.edgesOut.size+this.edgesIn.size}setCircleRadius(t){this._circleRadius=t}getCircleRadius(){return this._circleRadius}setCircleRadiusCollapsed(t){this._circleRadiusCollapsed=t}getCircleRadiusCollapsed(){return this._circleRadiusCollapsed}setChildren(t){this.children=t,this.hasChildren()?this.isParent=!0:this.isParent=!1}hasChildren(){return this.children.length>0}markAsChild(t,e){this.isChild=!0,this.childrenDepth=e,this.parentNode=t}markAsParent(){this.isParent=!0}setSubgraph(t){this._subgraph=t}getSubgraph(){return this._subgraph}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setDeepestNodeClone(t){this._deepest_node_clone=t}getDeepestNodeClone(){return this._deepest_node_clone}};class bt{constructor(t,e,n,r,s,o=null,a){g(this,"id");g(this,"from");g(this,"to");g(this,"directed");g(this,"data");g(this,"style");g(this,"visible");g(this,"isSynthetic");g(this,"syntheticTerminalNode");g(this,"_original_object");g(this,"_subgraphFromNode");g(this,"_subgraphToNode");g(this,"_dirty");g(this,"domID");this.id=t,this.domID=Ai(),this.from=e,this.to=n,this.directed=o,this.data=r??{},this.style=s??{},this.visible=!0,this._dirty=!0,this.isSynthetic=a!==void 0,this.syntheticTerminalNode=a,this.from.registerEdgeOut(this),this.to.registerEdgeIn(this)}get source(){return this.from}get target(){return this.to}getData(){return this.data}setData(t){this.data=t,this.markDirty()}updateData(t){this.data={...this.data,...t},this.markDirty()}getStyle(){return this.style}getEdgeStyle(){var t;return((t=this.style)==null?void 0:t.edge)??{}}getLabelStyle(){var t;return((t=this.style)==null?void 0:t.label)??{}}setStyle(t){this.style=t,this.markDirty()}updateStyle(t){this.style={...this.style,...t},this.markDirty()}getGraphElement(){return document?document.getElementById(`edge-${this.domID}`):null}setFrom(t){this.from=t}setTo(t){this.to=t}toDict(){return{id:this.id,from:this.from.id,to:this.to.id,data:this.data,style:this.style}}clone(){const t={...this.data},e={...this.style},n=new bt(this.id,this.from.clone(),this.to.clone(),t,e,this.directed);return n.visible=this.visible,n}markDirty(){this._dirty=!0}clearDirty(){this._dirty=!1}isDirty(){return this._dirty}toggleVisibility(t){t?this.show():this.hide(),this.markDirty()}show(){this.visible=!0}hide(){this.visible=!1}setOriginalObject(t){this._original_object=t}getOriginalObject(){return this._original_object}setSubgraphFromNode(t){this._subgraphFromNode=t}setSubgraphToNode(t){this._subgraphToNode=t}getSubgraphFromNode(){return this._subgraphFromNode}getSubgraphToNode(){return this._subgraphToNode}}var Ii="http://www.w3.org/1999/xhtml";const qn={svg:"http://www.w3.org/2000/svg",xhtml:Ii,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function ze(i){var t=i+="",e=t.indexOf(":");return e>=0&&(t=i.slice(0,e))!=="xmlns"&&(i=i.slice(e+1)),qn.hasOwnProperty(t)?{space:qn[t],local:i}:i}function ho(i){return function(){var t=this.ownerDocument,e=this.namespaceURI;return e===Ii&&t.documentElement.namespaceURI===Ii?t.createElement(i):t.createElementNS(e,i)}}function uo(i){return function(){return this.ownerDocument.createElementNS(i.space,i.local)}}function Vn(i){var t=ze(i);return(t.local?uo:ho)(t)}function po(){}function Ti(i){return i==null?po:function(){return this.querySelector(i)}}function fo(i){typeof i!="function"&&(i=Ti(i));for(var t=this._groups,e=t.length,n=new Array(e),r=0;r=M&&(M=w+1);!(N=b[M])&&++M=0;)(o=n[r])&&(s&&o.compareDocumentPosition(s)^4&&s.parentNode.insertBefore(o,s),s=o);return this}function Ro(i){i||(i=Ho);function t(d,u){return d&&u?i(d.__data__,u.__data__):!d-!u}for(var e=this._groups,n=e.length,r=new Array(n),s=0;st?1:i>=t?0:NaN}function $o(){var i=arguments[0];return arguments[0]=this,i.apply(null,arguments),this}function Go(){return Array.from(this)}function qo(){for(var i=this._groups,t=0,e=i.length;t1?this.each((t==null?ta:typeof t=="function"?ia:ea)(i,t,e??"")):te(this.node(),i)}function te(i,t){return i.style.getPropertyValue(t)||Wn(i).getComputedStyle(i,null).getPropertyValue(t)}function ra(i){return function(){delete this[i]}}function sa(i,t){return function(){this[i]=t}}function oa(i,t){return function(){var e=t.apply(this,arguments);e==null?delete this[i]:this[i]=e}}function aa(i,t){return arguments.length>1?this.each((t==null?ra:typeof t=="function"?oa:sa)(i,t)):this.node()[i]}function Kn(i){return i.trim().split(/^|\s+/)}function Li(i){return i.classList||new Zn(i)}function Zn(i){this._node=i,this._names=Kn(i.getAttribute("class")||"")}Zn.prototype={add:function(i){var t=this._names.indexOf(i);t<0&&(this._names.push(i),this._node.setAttribute("class",this._names.join(" ")))},remove:function(i){var t=this._names.indexOf(i);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(i){return this._names.indexOf(i)>=0}};function Qn(i,t){for(var e=Li(i),n=-1,r=t.length;++n=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}})}function Da(i){return function(){var t=this.__on;if(t){for(var e=0,n=-1,r=t.length,s;e{}};function ue(){for(var i=0,t=arguments.length,e={},n;i=0&&(n=e.slice(r+1),e=e.slice(0,r)),e&&!t.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:n}})}Re.prototype=ue.prototype={constructor:Re,on:function(i,t){var e=this._,n=Ua(i+"",e),r,s=-1,o=n.length;if(arguments.length<2){for(;++s0)for(var e=new Array(r),n=0,r,s;n=0&&i._call.call(void 0,t),i=i._next;--ie}function sr(){Vt=($e=me.now())+Ge,ie=pe=0;try{Xa()}finally{ie=0,Ka(),Vt=0}}function Wa(){var i=me.now(),t=i-$e;t>nr&&(Ge-=t,$e=i)}function Ka(){for(var i,t=He,e,n=1/0;t;)t._call?(n>t._time&&(n=t._time),i=t,t=t._next):(e=t._next,t._next=null,t=i?i._next=e:He=e);ge=i,Di(n)}function Di(i){if(!ie){pe&&(pe=clearTimeout(pe));var t=i-Vt;t>24?(i<1/0&&(pe=setTimeout(sr,i-me.now()-Ge)),fe&&(fe=clearInterval(fe))):(fe||($e=me.now(),fe=setInterval(Wa,nr)),ie=1,rr(sr))}}function or(i,t,e){var n=new qe;return t=t==null?0:+t,n.restart(r=>{n.stop(),i(r+t)},t,e),n}var Za=ue("start","end","cancel","interrupt"),Qa=[],ar=0,lr=1,Fi=2,Ve=3,cr=4,zi=5,Ue=6;function je(i,t,e,n,r,s){var o=i.__transition;if(!o)i.__transition={};else if(e in o)return;Ja(i,e,{name:t,index:n,group:r,on:Za,tween:Qa,time:s.time,delay:s.delay,duration:s.duration,ease:s.ease,timer:null,state:ar})}function Bi(i,t){var e=kt(i,t);if(e.state>ar)throw new Error("too late; already scheduled");return e}function Tt(i,t){var e=kt(i,t);if(e.state>Ve)throw new Error("too late; already running");return e}function kt(i,t){var e=i.__transition;if(!e||!(e=e[t]))throw new Error("transition not found");return e}function Ja(i,t,e){var n=i.__transition,r;n[t]=e,e.timer=Pi(s,0,e.time);function s(l){e.state=lr,e.timer.restart(o,e.delay,e.time),e.delay<=l&&o(l-e.delay)}function o(l){var h,d,u,p;if(e.state!==lr)return c();for(h in n)if(p=n[h],p.name===e.name){if(p.state===Ve)return or(o);p.state===cr?(p.state=Ue,p.timer.stop(),p.on.call("interrupt",i,i.__data__,p.index,p.group),delete n[h]):+hFi&&n.state>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):e===8?We(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):e===4?We(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=il.exec(i))?new wt(t[1],t[2],t[3],1):(t=nl.exec(i))?new wt(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=rl.exec(i))?We(t[1],t[2],t[3],t[4]):(t=sl.exec(i))?We(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=ol.exec(i))?vr(t[1],t[2]/100,t[3]/100,1):(t=al.exec(i))?vr(t[1],t[2]/100,t[3]/100,t[4]):dr.hasOwnProperty(i)?fr(dr[i]):i==="transparent"?new wt(NaN,NaN,NaN,0):null}function fr(i){return new wt(i>>16&255,i>>8&255,i&255,1)}function We(i,t,e,n){return n<=0&&(i=t=e=NaN),new wt(i,t,e,n)}function hl(i){return i instanceof ve||(i=we(i)),i?(i=i.rgb(),new wt(i.r,i.g,i.b,i.opacity)):new wt}function Hi(i,t,e,n){return arguments.length===1?hl(i):new wt(i,t,e,n??1)}function wt(i,t,e,n){this.r=+i,this.g=+t,this.b=+e,this.opacity=+n}Ri(wt,Hi,hr(ve,{brighter(i){return i=i==null?Xe:Math.pow(Xe,i),new wt(this.r*i,this.g*i,this.b*i,this.opacity)},darker(i){return i=i==null?ye:Math.pow(ye,i),new wt(this.r*i,this.g*i,this.b*i,this.opacity)},rgb(){return this},clamp(){return new wt(Ut(this.r),Ut(this.g),Ut(this.b),Ke(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:gr,formatHex:gr,formatHex8:dl,formatRgb:mr,toString:mr}));function gr(){return`#${jt(this.r)}${jt(this.g)}${jt(this.b)}`}function dl(){return`#${jt(this.r)}${jt(this.g)}${jt(this.b)}${jt((isNaN(this.opacity)?1:this.opacity)*255)}`}function mr(){const i=Ke(this.opacity);return`${i===1?"rgb(":"rgba("}${Ut(this.r)}, ${Ut(this.g)}, ${Ut(this.b)}${i===1?")":`, ${i})`}`}function Ke(i){return isNaN(i)?1:Math.max(0,Math.min(1,i))}function Ut(i){return Math.max(0,Math.min(255,Math.round(i)||0))}function jt(i){return i=Ut(i),(i<16?"0":"")+i.toString(16)}function vr(i,t,e,n){return n<=0?i=t=e=NaN:e<=0||e>=1?i=t=NaN:t<=0&&(i=NaN),new Nt(i,t,e,n)}function yr(i){if(i instanceof Nt)return new Nt(i.h,i.s,i.l,i.opacity);if(i instanceof ve||(i=we(i)),!i)return new Nt;if(i instanceof Nt)return i;i=i.rgb();var t=i.r/255,e=i.g/255,n=i.b/255,r=Math.min(t,e,n),s=Math.max(t,e,n),o=NaN,a=s-r,c=(s+r)/2;return a?(t===s?o=(e-n)/a+(e0&&c<1?0:o,new Nt(o,a,c,i.opacity)}function ul(i,t,e,n){return arguments.length===1?yr(i):new Nt(i,t,e,n??1)}function Nt(i,t,e,n){this.h=+i,this.s=+t,this.l=+e,this.opacity=+n}Ri(Nt,ul,hr(ve,{brighter(i){return i=i==null?Xe:Math.pow(Xe,i),new Nt(this.h,this.s,this.l*i,this.opacity)},darker(i){return i=i==null?ye:Math.pow(ye,i),new Nt(this.h,this.s,this.l*i,this.opacity)},rgb(){var i=this.h%360+(this.h<0)*360,t=isNaN(i)||isNaN(this.s)?0:this.s,e=this.l,n=e+(e<.5?e:1-e)*t,r=2*e-n;return new wt($i(i>=240?i-240:i+120,r,n),$i(i,r,n),$i(i<120?i+240:i-120,r,n),this.opacity)},clamp(){return new Nt(br(this.h),Ze(this.s),Ze(this.l),Ke(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const i=Ke(this.opacity);return`${i===1?"hsl(":"hsla("}${br(this.h)}, ${Ze(this.s)*100}%, ${Ze(this.l)*100}%${i===1?")":`, ${i})`}`}}));function br(i){return i=(i||0)%360,i<0?i+360:i}function Ze(i){return Math.max(0,Math.min(1,i||0))}function $i(i,t,e){return(i<60?t+(e-t)*i/60:i<180?e:i<240?t+(e-t)*(240-i)/60:t)*255}const wr=i=>()=>i;function pl(i,t){return function(e){return i+e*t}}function fl(i,t,e){return i=Math.pow(i,e),t=Math.pow(t,e)-i,e=1/e,function(n){return Math.pow(i+n*t,e)}}function gl(i){return(i=+i)==1?xr:function(t,e){return e-t?fl(t,e,i):wr(isNaN(t)?e:t)}}function xr(i,t){var e=t-i;return e?pl(i,e):wr(isNaN(i)?t:i)}const Cr=(function i(t){var e=gl(t);function n(r,s){var o=e((r=Hi(r)).r,(s=Hi(s)).r),a=e(r.g,s.g),c=e(r.b,s.b),l=xr(r.opacity,s.opacity);return function(h){return r.r=o(h),r.g=a(h),r.b=c(h),r.opacity=l(h),r+""}}return n.gamma=i,n})(1);function Rt(i,t){return i=+i,t=+t,function(e){return i*(1-e)+t*e}}var Gi=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,qi=new RegExp(Gi.source,"g");function ml(i){return function(){return i}}function vl(i){return function(t){return i(t)+""}}function yl(i,t){var e=Gi.lastIndex=qi.lastIndex=0,n,r,s,o=-1,a=[],c=[];for(i=i+"",t=t+"";(n=Gi.exec(i))&&(r=qi.exec(t));)(s=r.index)>e&&(s=t.slice(e,s),a[o]?a[o]+=s:a[++o]=s),(n=n[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:Rt(n,r)})),e=qi.lastIndex;return e180?h+=360:h-l>180&&(l+=360),u.push({i:d.push(r(d)+"rotate(",null,n)-2,x:Rt(l,h)})):h&&d.push(r(d)+"rotate("+h+n)}function a(l,h,d,u){l!==h?u.push({i:d.push(r(d)+"skewX(",null,n)-2,x:Rt(l,h)}):h&&d.push(r(d)+"skewX("+h+n)}function c(l,h,d,u,p,f){if(l!==d||h!==u){var m=p.push(r(p)+"scale(",null,",",null,")");f.push({i:m-4,x:Rt(l,d)},{i:m-2,x:Rt(h,u)})}else(d!==1||u!==1)&&p.push(r(p)+"scale("+d+","+u+")")}return function(l,h){var d=[],u=[];return l=i(l),h=i(h),s(l.translateX,l.translateY,h.translateX,h.translateY,d,u),o(l.rotate,h.rotate,d,u),a(l.skewX,h.skewX,d,u),c(l.scaleX,l.scaleY,h.scaleX,h.scaleY,d,u),l=h=null,function(p){for(var f=-1,m=u.length,b;++f=0&&(t=t.slice(0,e)),!t||t==="start"})}function ec(i,t,e){var n,r,s=tc(t)?Bi:Tt;return function(){var o=s(this,i),a=o.on;a!==n&&(r=(n=a).copy()).on(t,e),o.on=r}}function ic(i,t){var e=this._id;return arguments.length<2?kt(this.node(),e).on.on(i):this.each(ec(e,i,t))}function nc(i){return function(){var t=this.parentNode;for(var e in this.__transition)if(+e!==i)return;t&&t.removeChild(this)}}function rc(){return this.on("end.remove",nc(this._id))}function sc(i){var t=this._name,e=this._id;typeof i!="function"&&(i=Ti(i));for(var n=this._groups,r=n.length,s=new Array(r),o=0;o()=>i;function Xi(i,{sourceEvent:t,subject:e,target:n,identifier:r,active:s,x:o,y:a,dx:c,dy:l,dispatch:h}){Object.defineProperties(this,{type:{value:i,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:s,enumerable:!0,configurable:!0},x:{value:o,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:h}})}Xi.prototype.on=function(){var i=this._.on.apply(this._,arguments);return i===this._?this:i};function Tc(i){return!i.ctrlKey&&!i.button}function Lc(){return this.parentNode}function Oc(i,t){return t??{x:i.x,y:i.y}}function Pc(){return navigator.maxTouchPoints||"ontouchstart"in this}function Dc(){var i=Tc,t=Lc,e=Oc,n=Pc,r={},s=ue("start","drag","end"),o=0,a,c,l,h,d=0;function u(C){C.on("mousedown.drag",p).filter(n).on("touchstart.drag",b).on("touchmove.drag",y,Ic).on("touchend.drag touchcancel.drag",w).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(C,N){if(!(h||!i.call(this,C,N))){var P=M(this,t.call(this,C,N),C,N,"mouse");P&&(et(C.view).on("mousemove.drag",f,xe).on("mouseup.drag",m,xe),Ir(C.view),Yi(C),l=!1,a=C.clientX,c=C.clientY,P("start",C))}}function f(C){if(re(C),!l){var N=C.clientX-a,P=C.clientY-c;l=N*N+P*P>d}r.mouse("drag",C)}function m(C){et(C.view).on("mousemove.drag mouseup.drag",null),Tr(C.view,l),re(C),r.mouse("end",C)}function b(C,N){if(i.call(this,C,N)){var P=C.changedTouches,k=t.call(this,C,N),A=P.length,I,z;for(I=0;I()=>i;function Fc(i,{sourceEvent:t,target:e,transform:n,dispatch:r}){Object.defineProperties(this,{type:{value:i,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},transform:{value:n,enumerable:!0,configurable:!0},_:{value:r}})}function zt(i,t,e){this.k=i,this.x=t,this.y=e}zt.prototype={constructor:zt,scale:function(i){return i===1?this:new zt(this.k*i,this.x,this.y)},translate:function(i,t){return i===0&t===0?this:new zt(this.k,this.x+this.k*i,this.y+this.k*t)},apply:function(i){return[i[0]*this.k+this.x,i[1]*this.k+this.y]},applyX:function(i){return i*this.k+this.x},applyY:function(i){return i*this.k+this.y},invert:function(i){return[(i[0]-this.x)/this.k,(i[1]-this.y)/this.k]},invertX:function(i){return(i-this.x)/this.k},invertY:function(i){return(i-this.y)/this.k},rescaleX:function(i){return i.copy().domain(i.range().map(this.invertX,this).map(i.invert,i))},rescaleY:function(i){return i.copy().domain(i.range().map(this.invertY,this).map(i.invert,i))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var ei=new zt(1,0,0);zt.prototype;function Wi(i){i.stopImmediatePropagation()}function Ce(i){i.preventDefault(),i.stopImmediatePropagation()}function zc(i){return(!i.ctrlKey||i.type==="wheel")&&!i.button}function Bc(){var i=this;return i instanceof SVGElement?(i=i.ownerSVGElement||i,i.hasAttribute("viewBox")?(i=i.viewBox.baseVal,[[i.x,i.y],[i.x+i.width,i.y+i.height]]):[[0,0],[i.width.baseVal.value,i.height.baseVal.value]]):[[0,0],[i.clientWidth,i.clientHeight]]}function Lr(){return this.__zoom||ei}function Rc(i){return-i.deltaY*(i.deltaMode===1?.05:i.deltaMode?1:.002)*(i.ctrlKey?10:1)}function Hc(){return navigator.maxTouchPoints||"ontouchstart"in this}function $c(i,t,e){var n=i.invertX(t[0][0])-e[0][0],r=i.invertX(t[1][0])-e[1][0],s=i.invertY(t[0][1])-e[0][1],o=i.invertY(t[1][1])-e[1][1];return i.translate(r>n?(n+r)/2:Math.min(0,n)||Math.max(0,r),o>s?(s+o)/2:Math.min(0,s)||Math.max(0,o))}function Gc(){var i=zc,t=Bc,e=$c,n=Rc,r=Hc,s=[0,1/0],o=[[-1/0,-1/0],[1/0,1/0]],a=250,c=_l,l=ue("start","zoom","end"),h,d,u,p=500,f=150,m=0,b=10;function y(S){S.property("__zoom",Lr).on("wheel.zoom",A,{passive:!1}).on("mousedown.zoom",I).on("dblclick.zoom",z).filter(r).on("touchstart.zoom",F).on("touchmove.zoom",Z).on("touchend.zoom touchcancel.zoom",Q).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}y.transform=function(S,T,_,L){var B=S.selection?S.selection():S;B.property("__zoom",Lr),S!==B?N(S,T,_,L):B.interrupt().each(function(){P(this,arguments).event(L).start().zoom(null,typeof T=="function"?T.apply(this,arguments):T).end()})},y.scaleBy=function(S,T,_,L){y.scaleTo(S,function(){var B=this.__zoom.k,R=typeof T=="function"?T.apply(this,arguments):T;return B*R},_,L)},y.scaleTo=function(S,T,_,L){y.transform(S,function(){var B=t.apply(this,arguments),R=this.__zoom,H=_==null?C(B):typeof _=="function"?_.apply(this,arguments):_,V=R.invert(H),Y=typeof T=="function"?T.apply(this,arguments):T;return e(M(w(R,Y),H,V),B,o)},_,L)},y.translateBy=function(S,T,_,L){y.transform(S,function(){return e(this.__zoom.translate(typeof T=="function"?T.apply(this,arguments):T,typeof _=="function"?_.apply(this,arguments):_),t.apply(this,arguments),o)},null,L)},y.translateTo=function(S,T,_,L,B){y.transform(S,function(){var R=t.apply(this,arguments),H=this.__zoom,V=L==null?C(R):typeof L=="function"?L.apply(this,arguments):L;return e(ei.translate(V[0],V[1]).scale(H.k).translate(typeof T=="function"?-T.apply(this,arguments):-T,typeof _=="function"?-_.apply(this,arguments):-_),R,o)},L,B)};function w(S,T){return T=Math.max(s[0],Math.min(s[1],T)),T===S.k?S:new zt(T,S.x,S.y)}function M(S,T,_){var L=T[0]-_[0]*S.k,B=T[1]-_[1]*S.k;return L===S.x&&B===S.y?S:new zt(S.k,L,B)}function C(S){return[(+S[0][0]+ +S[1][0])/2,(+S[0][1]+ +S[1][1])/2]}function N(S,T,_,L){S.on("start.zoom",function(){P(this,arguments).event(L).start()}).on("interrupt.zoom end.zoom",function(){P(this,arguments).event(L).end()}).tween("zoom",function(){var B=this,R=arguments,H=P(B,R).event(L),V=t.apply(B,R),Y=_==null?C(V):typeof _=="function"?_.apply(B,R):_,$=Math.max(V[1][0]-V[0][0],V[1][1]-V[0][1]),nt=B.__zoom,Et=typeof T=="function"?T.apply(B,R):T,gt=c(nt.invert(Y).concat($/nt.k),Et.invert(Y).concat($/Et.k));return function(xt){if(xt===1)xt=Et;else{var mt=gt(xt),ce=$/mt[2];xt=new zt(ce,Y[0]-mt[0]*ce,Y[1]-mt[1]*ce)}H.zoom(null,xt)}})}function P(S,T,_){return!_&&S.__zooming||new k(S,T)}function k(S,T){this.that=S,this.args=T,this.active=0,this.sourceEvent=null,this.extent=t.apply(S,T),this.taps=0}k.prototype={event:function(S){return S&&(this.sourceEvent=S),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(S,T){return this.mouse&&S!=="mouse"&&(this.mouse[1]=T.invert(this.mouse[0])),this.touch0&&S!=="touch"&&(this.touch0[1]=T.invert(this.touch0[0])),this.touch1&&S!=="touch"&&(this.touch1[1]=T.invert(this.touch1[0])),this.that.__zoom=T,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(S){var T=et(this.that).datum();l.call(S,this.that,new Fc(S,{sourceEvent:this.sourceEvent,target:y,transform:this.that.__zoom,dispatch:l}),T)}};function A(S,...T){if(!i.apply(this,arguments))return;var _=P(this,T).event(S),L=this.__zoom,B=Math.max(s[0],Math.min(s[1],L.k*Math.pow(2,n.apply(this,arguments)))),R=Pt(S);if(_.wheel)(_.mouse[0][0]!==R[0]||_.mouse[0][1]!==R[1])&&(_.mouse[1]=L.invert(_.mouse[0]=R)),clearTimeout(_.wheel);else{if(L.k===B)return;_.mouse=[R,L.invert(R)],Ye(this),_.start()}Ce(S),_.wheel=setTimeout(H,f),_.zoom("mouse",e(M(w(L,B),_.mouse[0],_.mouse[1]),_.extent,o));function H(){_.wheel=null,_.end()}}function I(S,...T){if(u||!i.apply(this,arguments))return;var _=S.currentTarget,L=P(this,T,!0).event(S),B=et(S.view).on("mousemove.zoom",Y,!0).on("mouseup.zoom",$,!0),R=Pt(S,_),H=S.clientX,V=S.clientY;Ir(S.view),Wi(S),L.mouse=[R,this.__zoom.invert(R)],Ye(this),L.start();function Y(nt){if(Ce(nt),!L.moved){var Et=nt.clientX-H,gt=nt.clientY-V;L.moved=Et*Et+gt*gt>m}L.event(nt).zoom("mouse",e(M(L.that.__zoom,L.mouse[0]=Pt(nt,_),L.mouse[1]),L.extent,o))}function $(nt){B.on("mousemove.zoom mouseup.zoom",null),Tr(nt.view,L.moved),Ce(nt),L.event(nt).end()}}function z(S,...T){if(i.apply(this,arguments)){var _=this.__zoom,L=Pt(S.changedTouches?S.changedTouches[0]:S,this),B=_.invert(L),R=_.k*(S.shiftKey?.5:2),H=e(M(w(_,R),L,B),t.apply(this,T),o);Ce(S),a>0?et(this).transition().duration(a).call(N,H,L,S):et(this).call(y.transform,H,L,S)}}function F(S,...T){if(i.apply(this,arguments)){var _=S.touches,L=_.length,B=P(this,T,S.changedTouches.length===L).event(S),R,H,V,Y;for(Wi(S),H=0;H=(d=(a+l)/2))?a=d:l=d,(b=e>=(u=(c+h)/2))?c=u:h=u,r=s,!(s=s[y=b<<1|m]))return r[y]=o,i;if(p=+i._x.call(null,s.data),f=+i._y.call(null,s.data),t===p&&e===f)return o.next=s,r?r[y]=o:i._root=o,i;do r=r?r[y]=new Array(4):i._root=new Array(4),(m=t>=(d=(a+l)/2))?a=d:l=d,(b=e>=(u=(c+h)/2))?c=u:h=u;while((y=b<<1|m)===(w=(f>=u)<<1|p>=d));return r[w]=s,r[y]=o,i}function Uc(i){var t,e,n=i.length,r,s,o=new Array(n),a=new Array(n),c=1/0,l=1/0,h=-1/0,d=-1/0;for(e=0;eh&&(h=r),sd&&(d=s));if(c>h||l>d)return this;for(this.cover(c,l).cover(h,d),e=0;ei||i>=r||n>t||t>=s;)switch(l=(th||(a=f.y0)>d||(c=f.x1)=y)<<1|i>=b)&&(f=u[u.length-1],u[u.length-1]=u[u.length-1-m],u[u.length-1-m]=f)}else{var w=i-+this._x.call(null,p.data),M=t-+this._y.call(null,p.data),C=w*w+M*M;if(C=(u=(o+c)/2))?o=u:c=u,(m=d>=(p=(a+l)/2))?a=p:l=p,t=e,!(e=e[b=m<<1|f]))return this;if(!e.length)break;(t[b+1&3]||t[b+2&3]||t[b+3&3])&&(n=t,y=b)}for(;e.data!==i;)if(r=e,!(e=e.next))return this;return(s=e.next)&&delete e.next,r?(s?r.next=s:delete r.next,this):t?(s?t[b]=s:delete t[b],(e=t[0]||t[1]||t[2]||t[3])&&e===(t[3]||t[2]||t[1]||t[0])&&!e.length&&(n?n[y]=e:this._root=e),this):(this._root=s,this)}function Zc(i){for(var t=0,e=i.length;tu.index){var F=p-A.x-A.vx,Z=f-A.y-A.vy,Q=F*F+Z*Z;Qp+z||Pf+z||kl.r&&(l.r=l[h].r)}function c(){if(t){var l,h=t.length,d;for(e=new Array(h),l=0;l[t(N,P,o),N])),C;for(b=0,a=new Array(y);b(i=(dh*i+uh)%Fr)/Fr}function fh(i){return i.x}function gh(i){return i.y}var mh=10,vh=Math.PI*(3-Math.sqrt(5));function yh(i){var t,e=1,n=.001,r=1-Math.pow(n,1/300),s=0,o=.6,a=new Map,c=Pi(d),l=ue("tick","end"),h=ph();i==null&&(i=[]);function d(){u(),l.call("tick",t),e1?(b==null?a.delete(m):a.set(m,f(b)),t):a.get(m)},find:function(m,b,y){var w=0,M=i.length,C,N,P,k,A;for(y==null?y=1/0:y*=y,w=0;w1?(l.on(m,b),t):l.on(m)}}}function bh(){var i,t,e,n,r=rt(-30),s,o=1,a=1/0,c=.81;function l(p){var f,m=i.length,b=Ki(i,fh,gh).visitAfter(d);for(n=p,f=0;f=a)return;(p.data!==t||p.next)&&(y===0&&(y=Ht(e),C+=y*y),w===0&&(w=Ht(e),C+=w*w),Cr){const h=r/l,d=o*h,u=a*h;s.x=d,s.y=u}}}return n.initialize=r=>{e=r},n}class wh{static globalToLocal(t,e,n){const r=n.x??0,s=n.y??0;return{x:t-r,y:e-s}}static localToGlobal(t,e,n){const r=n.x??0,s=n.y??0;return{x:t+r,y:e+s}}}class it{constructor(t){g(this,"nodeDrawer");g(this,"edgeDrawer");this.nodeDrawer=t}render(t,e,n){this.edgeDrawer||(this.edgeDrawer=this.nodeDrawer.graphSvgRenderer.edgeDrawer);let r=t.select(".pvt-cluster-area");if(r.empty()){r=t.append("circle").classed("pvt-cluster-area",!0).lower();const d=it.buildGradientForNode(t.node().querySelector(".node"),r,e);d&&r.style("stroke",`color-mix(in srgb, ${d} 70%, transparent)`)}const s=it.updateToNewRadiusExpanded(this.nodeDrawer.graph,e);r.attr("r",0).attr("_final_r",s).attr("cx",0).attr("cy",0),r.transition().duration(250).attr("r",s);const o=new Set,a=e.children.flatMap(d=>[...d.getEdgesOut()??[],...d.getEdgesIn()??[]]).filter(d=>o.has(d.id)?!1:(o.add(d.id),!0)),c=t.node(),l=this.createSubgraph(e.children,a,c,e,this.nodeDrawer.graph);e.setSubgraph(l),t.select(":scope > .zoom-layer").attr("opacity",0).transition().duration(250).attr("opacity",1),it.toggleSyntheticEdges(e);let h=this.nodeDrawer.graph.getParentGraph();for(;h;)h.renderer.update(!1),h=h.getParentGraph();return n&&requestAnimationFrame(()=>{n(s)}),r}createSubgraph(t,e,n,r,s){const o=u=>{u.getMutableNodes().forEach(p=>{let f=s.getMutableNode(p.id);f=f.getOriginalObject()??f,p.setOriginalObject(f),f.setDeepestNodeClone(p),p.isChild=!0}),u.getMutableEdges().forEach(p=>{let f=s.getMutableEdge(p.id);f&&(f=f.getOriginalObject()??f,p.setOriginalObject(f))}),t.forEach(p=>{var f;if(((f=p.parentNode)==null?void 0:f.id)===r.id){const m=u.getMutableNode(p.id);m&&(m.parentNode=r)}}),s.getMutableEdges().forEach(p=>{const f=p.getOriginalObject()??p,m=u.getMutableNode(p.from.id),b=u.getMutableNode(p.to.id);m&&f.setSubgraphFromNode(m),b&&f.setSubgraphToNode(b)})},a={UI:{mode:"viewer",tooltip:{enabled:!1},contextMenu:{enabled:!1},navigation:{enabled:!1}},render:{...this.nodeDrawer.graph.getOptions().render,zoomEnabled:!1,zoomAnimationDuration:100,beforeRender:o},simulation:{useWorker:!1,warmupTicks:10,cooldownTime:50,freezeNodesOnDrag:!1},callbacks:{onNodeSelect:u=>{const p=s.getMutableNode(u.id);p&&s.selectElement(p)},onNodesSelect:u=>{const p=h.renderer.getGraphInteraction().getSelectedNodeIDs();if(p===null)return;const f=p.map(m=>{const b=s.getMutableNode(m);return{node:b,element:b==null?void 0:b.getGraphElement()}});s.renderer.getGraphInteraction().addNodesToSelection(f)},onEdgeSelect:u=>{const p=s.getMutableEdge(u.id);p&&s.selectElement(p)},onNodeHoverIn:(u,p)=>{var f;(f=s.UIManager.tooltip)==null||f.openForNodeOnElement(u,p)}},parentGraph:this.nodeDrawer.graph},c={nodes:[...t].map(u=>u.toDict(!0)),edges:[...e].map(u=>u.toDict())},l=document.createElement("div"),h=new ft(l,c,a),d=l.querySelector(".zoom-layer");return n.appendChild(d),h.getMutableNodes().forEach(u=>{it.toggleSyntheticEdges(u)}),h.on("ready",()=>{h.simulation.getSimulation().force("center",qc(0,0)).force("constrainParent",Qi(r.getCircleRadius(),10)),h.simulation.restart()}),h.renderer.getGraphInteraction().on("dragended",()=>{}),h.renderer.getGraphInteraction().on("simulationTick",()=>{h.getMutableNodes().filter(p=>p.visible).forEach(p=>{const f=p.x??0,m=p.y??0;this.updatePositionOnRealChild(f,m,p.id)})}),s.renderer.getGraphInteraction().on("dragging",()=>{this.updatePositionOnAllRealChildren(s)}),s.renderer.getGraphInteraction().on("simulationTick",()=>{this.updatePositionOnAllRealChildren(s)}),s.renderer.getGraphInteraction().on("canvasClick",()=>{h.deselectAll()}),h}updatePositionOnAllRealChildren(t){t.getMutableNodes().filter(e=>e.isParent&&e.expanded).forEach(e=>{const n=e.children,r=e.getSubgraph(),s=new Map;r&&(r.getMutableNodes().forEach(o=>{s.set(o.id,o)}),this.updatePositionOnAllRealChildren(r)),n.forEach(o=>{const a=s.get(o.id);!a||!a.x||!a.y||this.updatePositionOnRealChild(a.x,a.y,o.id)})})}updatePositionOnRealChild(t,e,n){const r=this.nodeDrawer.graph.getMutableNode(n),s=r==null?void 0:r.parentNode;if(r&&s){const o=wh.localToGlobal(t,e,s);r.x=o.x,r.y=o.y,this.nodeDrawer.graph.renderer.nextTickFor([r]);const a=this.nodeDrawer.graph.getParentGraph();a&&a.renderer.nodeDrawer.clusterDrawer.updatePositionOnRealChild(t,e,n)}}static toggleSyntheticEdges(t){if(t.expanded){t.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{n.hide()});const e=t.getOriginalObject()??t;e.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{n.hide()}),e.children.forEach(n=>{n.getEdgesIn().filter(r=>!e.children.includes(r.from)).forEach(r=>{r.show()})})}else{t.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{n.show()});const e=t.getOriginalObject()??t;e.getEdgesIn().filter(n=>n.isSynthetic===!0).forEach(n=>{t.visible&&n.show()}),it.hideNestedEdges(e)}}static hideNestedEdges(t){t.children.forEach(e=>{it.hideNestedEdges(e),e.getEdgesIn().filter(n=>!t.children.includes(n.from)).forEach(n=>{n.hide()})})}static collapseAllOpenedClusters(t){t.children.forEach(e=>{it.collapseAllOpenedClusters(e),e.collapse(),e.setCircleRadius(e.getCircleRadiusCollapsed())})}static updateToNewRadiusExpanded(t,e){const n=it.getRadiusForClusterNode(e);e.expanded||e.setCircleRadiusCollapsed(e.getCircleRadius()),e.setCircleRadius(n);const r=t.getParentGraph();if(r){const s=it.updateParentGraph(r,e,n);s&&t.simulation.getSimulation().force("link",null).force("constrainParent",Qi(s,10)),r.getParentGraph()&&e.parentNode&&it.updateToNewRadiusExpanded(r,e.parentNode)}return n}static updateToNewRadiusCollapsed(t,e,n){const r=e?t.getCircleRadiusCollapsed():it.getRadiusForClusterNode(t);if(t.setCircleRadius(r),n){it.updateParentGraph(n,t,r);const s=n.getParentGraph();t.parentNode&&it.updateToNewRadiusCollapsed(t.parentNode,!1,s)}}static getRadiusForClusterNode(t){if(!t.expanded)return t.getCircleRadius()+4;const e=50,n=16,s=t.children.reduce((a,c)=>{const l=c.getCircleRadius();return a+l+n},0)/t.children.length,o=Math.sqrt(t.children.length)*(2*s)+e;return Math.max(50,o)}static updateParentGraph(t,e,n){var a;const r=t.getMutableNode(e.id);r==null||r.setCircleRadius(n);const s=e.getOriginalObject();s&&s.setCircleRadius(n);const o=e.parentNode;if(o){const c=it.getRadiusForClusterNode(o);o.setCircleRadius(c),t.onChange(),t.simulation.reheat(.1);const l=(a=o.getGraphElement())==null?void 0:a.querySelector("& > .pvt-cluster-area");if(l){const h=et(l);h.attr("_final_r",c).transition().duration(250).attr("r",c),ii.handleChildrenExpanded(t,o,h)}return c}}static buildGradientForNode(t,e,n){if(t){const r=getComputedStyle(t).fill,s=`color-mix(in srgb, ${r} 40%, transparent)`,o=`pvt-cluster-area-${n.id}`,a=t.closest(".pvt-canvas-element"),c=a==null?void 0:a.querySelector("defs");if(!c)return;const l=c.appendChild(document.createElementNS("http://www.w3.org/2000/svg","radialGradient"));l.setAttribute("id",o);const h=document.createElementNS("http://www.w3.org/2000/svg","stop");h.setAttribute("offset","90%"),h.setAttribute("stop-color","#ffffff00"),l.appendChild(h);const d=document.createElementNS("http://www.w3.org/2000/svg","stop");return d.setAttribute("offset","100%"),d.setAttribute("stop-color",s),l.appendChild(d),e.style("fill",`url(#${o})`),r}}}et.prototype.transition=ji;class ii{constructor(t,e,n){g(this,"graph");g(this,"rendererOptions");g(this,"graphSvgRenderer");g(this,"clusterDrawer");g(this,"renderCB");var r;this.graphSvgRenderer=n,this.graph=e,this.rendererOptions=t,this.renderCB=(r=this.rendererOptions)==null?void 0:r.renderNode,this.clusterDrawer=new it(this)}render(t,e){var n,r;if(this.renderCB){const s=t.append("foreignObject"),o=(n=this==null?void 0:this.renderCB)==null?void 0:n.call(this,e);s.attr("width",20).attr("height",20),typeof o=="string"?s.text(o):o instanceof HTMLElement&&((r=s.node())==null||r.append(o)),requestAnimationFrame(()=>{const a=s.node();if(!a)return;const c=a.firstElementChild;if(!c)return;const l=c.getBoundingClientRect(),h=Math.ceil(l.width),d=Math.ceil(l.height);s.attr("width",h).attr("height",d),s.attr("x",-h/2).attr("y",-d/2),this.rendererOptions.enableNodeExpansion&&(!e.hasChildren()||!e.expanded)&&e.setCircleRadius(.5*Math.max(h,d))})}else this.defaultNodeRender(t,e),requestAnimationFrame(()=>{const s=t.node();if(!s)return;let o=50,a=50;const c=s.getBBox();c.width>0&&c.height>0&&(o=Math.ceil(c.width),a=Math.ceil(c.height)),this.rendererOptions.enableNodeExpansion&&(!e.hasChildren()||!e.expanded)&&(this.getNodeStyle(e).shape=="square"?e.setCircleRadius(Math.SQRT1_2*Math.max(o,a)):e.setCircleRadius(.5*Math.max(o,a)))});if(this.rendererOptions.enableNodeExpansion&&e.hasChildren()){if(e.expanded){const s=this.clusterDrawer.render(t,e,()=>{ii.handleChildrenExpanded(this.graph,e,s)});requestAnimationFrame(()=>{it.updateToNewRadiusExpanded(this.graph,e)})}requestAnimationFrame(()=>{this.addExpandCollapseIcons(t,e)})}}updatePositions(t){t.attr("transform",e=>{const n=e.x&&isFinite(e.x)?e.x:0,r=e.y&&isFinite(e.y)?e.y:0;return`translate(${n},${r})`})}defaultNodeRender(t,e){const n=this.getNodeStyle(e);this.genericNodeRender(t,n,e)}mergeNodeStylingOptions(t){return{shape:(t==null?void 0:t.shape)??this.rendererOptions.defaultNodeStyle.shape,strokeColor:(t==null?void 0:t.strokeColor)??this.rendererOptions.defaultNodeStyle.strokeColor,strokeWidth:(t==null?void 0:t.strokeWidth)??this.rendererOptions.defaultNodeStyle.strokeWidth,fontFamily:(t==null?void 0:t.fontFamily)??this.rendererOptions.defaultNodeStyle.fontFamily,size:(t==null?void 0:t.size)??this.rendererOptions.defaultNodeStyle.size,color:(t==null?void 0:t.color)??this.rendererOptions.defaultNodeStyle.color,textColor:(t==null?void 0:t.textColor)??this.rendererOptions.defaultNodeStyle.textColor,textVerticalShift:(t==null?void 0:t.textVerticalShift)??this.rendererOptions.defaultNodeStyle.textVerticalShift,iconUnicode:(t==null?void 0:t.iconUnicode)??this.rendererOptions.defaultNodeStyle.iconUnicode,iconClass:(t==null?void 0:t.iconClass)??this.rendererOptions.defaultNodeStyle.iconClass,svgIcon:(t==null?void 0:t.svgIcon)??this.rendererOptions.defaultNodeStyle.svgIcon,imagePath:(t==null?void 0:t.imagePath)??this.rendererOptions.defaultNodeStyle.imagePath,text:(t==null?void 0:t.text)??this.rendererOptions.defaultNodeStyle.text,html:(t==null?void 0:t.html)??this.rendererOptions.defaultNodeStyle.html}}computeNodeStyle(t){let e={};if(this.rendererOptions.nodeStyleMap&&typeof this.rendererOptions.nodeTypeAccessor=="function"){const s=this.rendererOptions.nodeTypeAccessor(t);s&&(e=this.rendererOptions.nodeStyleMap[s]??{})}const n=t.getStyle();let r={};return n.styleCb?r=n.styleCb(t):r={shape:(n==null?void 0:n.shape)??(e==null?void 0:e.shape),strokeColor:(n==null?void 0:n.strokeColor)??(e==null?void 0:e.strokeColor),strokeWidth:(n==null?void 0:n.strokeWidth)??(e==null?void 0:e.strokeWidth),fontFamily:(n==null?void 0:n.fontFamily)??(e==null?void 0:e.fontFamily),size:(n==null?void 0:n.size)??(e==null?void 0:e.size),color:(n==null?void 0:n.color)??(e==null?void 0:e.color),textColor:(n==null?void 0:n.textColor)??(e==null?void 0:e.textColor),textVerticalShift:(n==null?void 0:n.textVerticalShift)??(e==null?void 0:e.textVerticalShift),iconUnicode:(n==null?void 0:n.iconUnicode)??(e==null?void 0:e.iconUnicode),iconClass:(n==null?void 0:n.iconClass)??(e==null?void 0:e.iconClass),svgIcon:(n==null?void 0:n.svgIcon)??(e==null?void 0:e.svgIcon),imagePath:(n==null?void 0:n.imagePath)??(e==null?void 0:e.imagePath),text:(n==null?void 0:n.text)??(e==null?void 0:e.text),html:(n==null?void 0:n.html)??(e==null?void 0:e.html)},this.mergeNodeStylingOptions(r)}getNodeStyle(t){const e=this.computeNodeStyle(t);return typeof e.shape=="function"&&(e.shape=e.shape(t)),e.strokeWidth=e.strokeWidth!==void 0?J(e.strokeWidth.toString(),t)??"var(--pvt-node-stroke-width, 2)":"var(--pvt-node-stroke-width, 2)",e.strokeColor=e.strokeColor!==void 0?J(e.strokeColor,t)??"var(--pvt-node-stroke, #fff)":"var(--pvt-node-stroke, #fff)",e.size=e.size!==void 0?Oe(e.size,t)??10:10,e.color=e.color!==void 0?J(e.color,t)??"var(--pvt-node-color, #007acc)":"var(--pvt-node-color, #007acc)",e.textColor=e.textColor!==void 0?J(e.textColor,t)??"var(--pvt-node-text-color, #fff)":"var(--pvt-node-text-color, #fff)",e.textVerticalShift=e.textVerticalShift!==void 0?Oe(e.textVerticalShift,t)??0:0,e.text=e.text!==void 0?J(e.text,t):void 0,e.iconUnicode=e.iconUnicode!==void 0?J(e.iconUnicode,t):void 0,e.iconClass=e.iconClass!==void 0?J(e.iconClass,t):void 0,e.svgIcon=e.svgIcon!==void 0?J(e.svgIcon,t):void 0,e.imagePath=e.imagePath!==void 0?J(e.imagePath,t):void 0,e}isCustomShape(t){return typeof t=="object"&&t!==null&&"d"in t}genericNodeRender(t,e,n){var o,a;e.size=e.size,e.shape=e.shape,e.text=e.text,e.textVerticalShift=e.textVerticalShift;let r=e.shape;e.shape=="square"?r="rect":(this.isCustomShape(e.shape)||["triangle","hexagon"].includes(e.shape))&&(r="path");const s=t.append(r).attr("stroke",e.strokeColor).attr("stroke-width",e.strokeWidth).attr("fill",e.color).classed("node",!0);switch(e.shape){case"circle":s.attr("r",e.size),n.setCircleRadius(e.size);break;case"square":s.attr("width",e.size*2).attr("height",e.size*2).attr("x",-e.size).attr("y",-e.size),n.setCircleRadius(Math.SQRT1_2*e.size);break;case"triangle":{const c=[[0,-e.size],[e.size,e.size],[-e.size,e.size]].map(l=>l.join(",")).join(" ");s.attr("d",`M${c}Z`),n.setCircleRadius(e.size);break}case"hexagon":{const c=Math.PI/3,l=Array.from({length:6},(h,d)=>{const u=c*d;return[Math.cos(u)*e.size,Math.sin(u)*e.size]}).map(h=>h.join(",")).join(" ");s.attr("d",`M${l}Z`),n.setCircleRadius(e.size);break}default:this.isCustomShape(e.shape)?(s.attr("d",e.shape.d),n.setCircleRadius(15)):(s.attr("r",e.size),n.setCircleRadius(e.size));break}if(e.iconUnicode||e.iconClass)t.append("text").attr("fill",e.textColor).attr("text-anchor","middle").attr("dominant-baseline","central").attr("font-size",e.size*1.2).attr("class","node-content icon "+(e.iconUnicode?"icon-unicode":e.iconClass??"")).text(e.iconUnicode??Gn(e.iconClass??"")??"☐");else if(e.svgIcon){const c=document.createElementNS("http://www.w3.org/2000/svg","svg");c.innerHTML=e.svgIcon,((o=c.children[0])==null?void 0:o.nodeName)==="svg"&&(c.children[0].removeAttribute("width"),c.children[0].removeAttribute("height")),t.append(()=>c).attr("class","node-content").attr("x",-e.size*.7).attr("y",-e.size*.7).attr("width",e.size*1.4).attr("height",e.size*1.4).attr("color",e.strokeColor)}else if(e.imagePath)t.append("image").attr("class","node-content").attr("xlink:href",e.imagePath).attr("x",-e.size*(1.2/2)).attr("y",-e.size*(1.2/2)).attr("width",e.size*1.2).attr("height",e.size*1.2);else if(e.html){const c=t.append("foreignObject"),l=e.html(n);c.attr("width",e.size*2).attr("height",e.size*2).attr("x",-e.size).attr("y",-e.size),typeof l=="string"?c.text(l):l instanceof HTMLElement&&((a=c.node())==null||a.append(l))}if(e.text){const[c,l]=this.computeTextLayout(e.text,e.size,e.textVerticalShift);t.append("text").attr("text-anchor","middle").attr("y",-e.textVerticalShift*(e.size+c/2*1.2)).attr("dominant-baseline","central").attr("font-size",c).attr("font-family",e.fontFamily).attr("fill",e.textColor).text(l)}}checkForHighlight(t,e){this.isNodeSelected(e)?this.highlightSelection(t,e):this.deHighlightSelection(t,e)}isNodeSelected(t){var a;const e=this.graphSvgRenderer.getGraphInteraction(),n=e.getSelectedNode(),r=e.getSelectedNodeIDs(),s=((a=n==null?void 0:n.node)==null?void 0:a.id)===t.id,o=Array.isArray(r)?r.includes(t.id):!1;return s||o}deHighlightSelection(t,e){t.classed("pvt-node-selected-highlight",!1),this.rendererOptions.enableFocusMode&&(this.graph.getMutableNodes().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-node-selected-highlight-shadow",!1)}),this.graph.getMutableEdges().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!1)}))}highlightSelection(t,e){this.rendererOptions.enableFocusMode&&(this.graph.getMutableNodes().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-node-selected-highlight-shadow",!0)}),this.graph.getMutableEdges().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!0)}),t.classed("pvt-node-selected-highlight-shadow",!1)),t.classed("pvt-node-selected-highlight",!0),this.rendererOptions.enableFocusMode&&(e.getEdgesOut().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!1);const s=n.to.getGraphElement();s==null||s.classList.toggle("pvt-node-selected-highlight-shadow",!1)}),e.getEdgesIn().forEach(n=>{const r=n.getGraphElement();r==null||r.classList.toggle("pvt-edge-selected-highlight-shadow",!1);const s=n.from.getGraphElement();s==null||s.classList.toggle("pvt-node-selected-highlight-shadow",!1)}))}computeTextLayout(t,e,n=0){const r=e*.9,s=Math.abs(n)>=1?r*6:r*2,o=r*.5,a=r*.5,c=Math.floor(s/a);if(t.length>c&&t.length>7){const l=Math.max(6,s/a)-1,h=Math.min(3,Math.floor(l/2)),d=l-h;t=t.slice(0,d)+"..."+t.slice(t.length-h)}return[o,t]}addExpandCollapseIcons(t,e){const s=(o,a)=>{this.graph.UIManager.tooltip&&this.graph.UIManager.tooltip.hide(o),this.graph.toggleExpandNode(o),a||(this.graph.simulation.reheat(.05),this.graph.renderer.fitAndCenter())};t.each((o,a,c)=>{const l=et(c[a]);l.selectAll(":scope > .node-icon").remove();const h=(o.getCircleRadius()+2)/Math.sqrt(2),d=l.append("g").classed("node-icon",!0).classed(o.expanded?"collapse-icon":"expand-icon",!0).attr("transform",o.expanded?`translate(${h}, ${h})`:`translate(${h}, ${-h})`);d.append("title").text(o.expanded?"Collapse nodes":"Expand node"),d.append("circle").attr("r",8).style("cursor","pointer").on("click",u=>{u.stopPropagation(),s(o,!o.expanded)}),l.select(o.expanded?":scope > .collapse-icon":":scope > .expand-icon").append("text").text(o.expanded?"-":"+")})}static handleChildrenExpanded(t,e,n){var h,d;t.simulation.reheat(.1);const r=Number(n.attr("_final_r")),o=(r+2)/Math.sqrt(2),a=(h=e.getGraphElement())==null?void 0:h.querySelector("& > .node");a&&et(a).transition().duration(250).on("end",()=>{t.renderer.fitAndCenter()}).attr("transform",`translate(${-o}, ${-o})`);const c=(d=e.getGraphElement())==null?void 0:d.querySelector("& > .node-icon");c&&et(c).transition().duration(250).attr("transform",e.expanded?`translate(${o}, ${o})`:`translate(${o}, ${-o})`);const l=e.getSubgraph();l&&l.simulation.getSimulation().force("constrainParent",Qi(Number(r),10))}}function xh(i){return i*Math.PI/180}function Me(i){for(;i<0;)i+=2*Math.PI;for(;i>=2*Math.PI;)i-=2*Math.PI;return i}function Ch(i){let{rx:t,ry:e}=i;const{xAxisRotation:n,from:r,to:s}=i,o=xh(n),a=Math.cos(o),c=Math.sin(o),l=(r.x-s.x)/2,h=(r.y-s.y)/2,d=a*l+c*h,u=-c*l+a*h;let p=t*t,f=e*e;const m=d*d,b=u*u,y=m/p+b/f;if(y>1){const L=Math.sqrt(y);t*=L,e*=L,p=t*t,f=e*e}const w=1,M=p*f-p*b-f*m,C=p*b+f*m,N=w*Math.sqrt(Math.max(0,M/C)),P=N*(t*u/e),k=N*(-(e*d)/t),A=a*P-c*k+(r.x+s.x)/2,I=c*P+a*k+(r.y+s.y)/2;function z(L,B,R,H){const V=L*R+B*H,Y=Math.sqrt(L*L+B*B)*Math.sqrt(R*R+H*H);let $=Math.acos(Math.min(Math.max(V/Y,-1),1));return L*H-B*R<0&&($=-$),$}const F=(d-P)/t,Z=(u-k)/e,Q=(-d-P)/t,S=(-u-k)/e;let T=z(1,0,F,Z),_=z(F,Z,Q,S);return _<0&&(_+=2*Math.PI),T=Me(T),_=Me(_),{cx:A,cy:I,startAngle:T,deltaAngle:_,rx:t,ry:e,xAxisRotation:n}}function Mh(i,t,e,n,r,s){const o=n-i,a=r-t,c=Math.sqrt(o*o+a*a);if(c>e+s)return[];if(c=0?t<=n?i>=t&&i<=n:i>=t||i<=n:n<=t?i<=t&&i>=n:i<=t||i>=n}function Sh(i,t){const{cx:e,cy:n,startAngle:r,deltaAngle:s}=t;for(const o of i){const a=Math.atan2(o.y-n,o.x-e);if(Eh(a,r,s))return o}return null}function Hr(i,t){const e=Ch(i);if(e.rx===e.ry&&e.xAxisRotation===0){const n=Mh(e.cx,e.cy,e.rx,t.cx,t.cy,t.r),r=Sh(n,e);return r||null}else return console.log("Arc is elliptical or rotated, numerical methods needed for intersection."),null}function _h(i){if(!i)return null;const t=i.getAttribute("d");if(!t)return null;const e=Th(t);if(!e)return null;const{x0:n,y0:r,x1:s,y1:o}=e,a=s-n,c=o-r,l={x:n+a/2,y:r+c/2};return{length:Math.sqrt(a*a+c*c),midpoint:l}}function kh(i){if(!i)return null;const t=i.getAttribute("d");if(!t)return null;const e=Ah(t);if(!e)return null;const n=e.to.x-e.from.x,r=e.to.y-e.from.y,s=Math.hypot(n,r),o=e.rx,a=2*Math.asin(Math.min(s/(2*o),1)),c=o*a,l=(e.from.x+e.to.x)/2,h=(e.from.y+e.to.y)/2,d=Math.sqrt(Math.max(0,o*o-(s/2)**2)),u=-r/s,p=n/s,f=e.sweepFlag!==e.largeArcFlag?1:-1,m=l+f*d*u,b=h+f*d*p,y=Math.atan2(e.from.y-b,e.from.x-m);let M=Math.atan2(e.to.y-b,e.to.x-m)-y;for(;M>Math.PI;)M-=2*Math.PI;for(;M<-Math.PI;)M+=2*Math.PI;e.sweepFlag&&M<0&&(M+=2*Math.PI),!e.sweepFlag&&M>0&&(M-=2*Math.PI);const C=y+M/2,N={x:m+o*Math.cos(C),y:b+o*Math.sin(C)};return{length:c,midpoint:N}}function Nh(i){if(!i)return null;const t=i.getAttribute("d");if(!t)return null;const e=Ih(t);if(!e)return null;const n=.5,r=Math.pow(1-n,3)*e.x0+3*Math.pow(1-n,2)*n*e.px0+3*(1-n)*n*n*e.px1+n*n*n*e.x1,s=Math.pow(1-n,3)*e.y0+3*Math.pow(1-n,2)*n*e.py0+3*(1-n)*n*n*e.py1+n*n*n*e.y1;return{length:Math.hypot(r,s),midpoint:{x:r,y:s}}}function Ah(i){if(!i)return null;const t=Ji(i);return t.length!==9||t[0][0]!=="M"||t[2][0]!=="A"?null:{from:{x:parseFloat(t[0].slice(1)),y:parseFloat(t[1])},to:{x:parseFloat(t[7]),y:parseFloat(t[8])},rx:parseFloat(t[2].slice(1)),ry:parseFloat(t[3]),xAxisRotation:0,largeArcFlag:!1,sweepFlag:!0}}function Ih(i){if(!i)return null;const t=Ji(i);return t.length!==10||t[0][0]!=="M"||t[3][0]!=="C"?null:{x0:parseFloat(t[1]),y0:parseFloat(t[2]),x1:parseFloat(t[8]),y1:parseFloat(t[9]),px0:parseFloat(t[4]),py0:parseFloat(t[5]),px1:parseFloat(t[6]),py1:parseFloat(t[7])}}function Th(i){if(!i)return null;const t=Ji(i);return t.length!==6||t[0]!=="M"||t[3]!=="L"?null:{x0:parseFloat(t[1]),y0:parseFloat(t[2]),x1:parseFloat(t[4]),y1:parseFloat(t[5])}}function Ji(i){const t=[];let e="",n=0,r=i.length-1;for(;n<=r&&(i[n]===" "||i[n]===` -`||i[n]===" "||i[n]===",");)n++;for(;r>=n&&(i[r]===" "||i[r]===` -`||i[r]===" "||i[r]===",");)r--;for(let s=n;s<=r;s++){const o=i[s];o===" "||o===","||o===` -`||o===" "?e&&(t.push(e),e=""):e+=o}return e&&t.push(e),t}function Yt(i,t){var n;if(t.nodeHeaderMap.title)return J(t.nodeHeaderMap.title,i)||"Could not resolve title";const e=(n=i.getData())==null?void 0:n.label;return typeof e=="string"?e:"Optional name or label"}function $r(i,t){var n;if(t.nodeHeaderMap.subtitle)return J(t.nodeHeaderMap.subtitle,i)||null;const e=(n=i.getData())==null?void 0:n.description;return typeof e=="string"?e:"Optional subtitle or description"}function Ee(i,t){var n;if(t.edgeHeaderMap.title)return J(t.edgeHeaderMap.title,i)||"";const e=(n=i.getData())==null?void 0:n.label;return typeof e=="string"?e:"Optional name or label"}function Gr(i,t){var n;if(t.edgeHeaderMap.subtitle)return J(t.edgeHeaderMap.subtitle,i)||null;const e=(n=i.getData())==null?void 0:n.label;return typeof e=="string"?e:"Optional subtitle or description"}function qr(i){var e;const t=(e=i.getData())==null?void 0:e.label;return typeof t=="string"?t:""}function tn(i,t){const e=i.getData(),n=[];if(t.nodePropertiesMap)return $n(t.nodePropertiesMap,i);for(const[r,s]of Object.entries(e))r&&s&&n.push({name:r,value:s});return n}function en(i,t){const e=i.getData(),n=[];if(t.edgePropertiesMap)return $n(t.edgePropertiesMap,i);for(const[r,s]of Object.entries(e))r&&s&&n.push({name:r,value:s});return n}class Lh{constructor(t,e,n){g(this,"graph");g(this,"rendererOptions");g(this,"graphSvgRenderer");g(this,"renderLabelCB");var r;this.graphSvgRenderer=n,this.graph=e,this.rendererOptions=t,this.renderLabelCB=(r=this.rendererOptions)==null?void 0:r.renderLabel}render(t,e){this.defaultEdgeRender(t,e)}defaultEdgeRender(t,e){var s,o;const n=this.getEdgeStyle(e),r=this.getLabelStyle(e);if(this.graph.getOptions().isDirected||e.directed){const a=this.genericEdgeRender(t,n);this.drawEdgeMarker(a,n,e)}if(this.renderLabelCB){const a=t.append("g").classed("label-container",!0).append("foreignObject"),c=(s=this==null?void 0:this.renderLabelCB)==null?void 0:s.call(this,e);a.attr("width",200).attr("height",100),typeof c=="string"?a.text(c):c instanceof HTMLElement&&((o=a.node())==null||o.append(c)),requestAnimationFrame(()=>{const l=a.node();if(!l)return;const h=l.firstElementChild;if(!h)return;const d=h.getBoundingClientRect(),u=Math.ceil(d.width),p=Math.ceil(d.height);a.attr("width",u).attr("height",p),a.attr("x",-u/2).attr("y",-p/2),this.highlightSelection(t,e)})}else this.defaultLabelRender(t,e,r),this.highlightSelection(t,e)}getLabelStyle(t){var r,s,o,a;let e;const n=t.getLabelStyle();return n&&n.styleCb?e=n.styleCb(t):e={backgroundColor:(r=t.getLabelStyle())==null?void 0:r.backgroundColor,fontSize:(s=t.getLabelStyle())==null?void 0:s.fontSize,fontFamily:(o=t.getLabelStyle())==null?void 0:o.fontFamily,color:(a=t.getLabelStyle())==null?void 0:a.color},this.mergeLabelStylingOptions(e)}mergeLabelStylingOptions(t){return{backgroundColor:(t==null?void 0:t.backgroundColor)??this.rendererOptions.defaultLabelStyle.backgroundColor,fontSize:(t==null?void 0:t.fontSize)??this.rendererOptions.defaultLabelStyle.fontSize,fontFamily:(t==null?void 0:t.fontFamily)??this.rendererOptions.defaultLabelStyle.fontFamily,color:(t==null?void 0:t.color)??this.rendererOptions.defaultLabelStyle.color}}getEdgeStyle(t){var s;let e;const n=t.getEdgeStyle();n&&n.styleCb?e=n.styleCb(t):e={strokeColor:n==null?void 0:n.strokeColor,strokeWidth:n==null?void 0:n.strokeWidth,opacity:n==null?void 0:n.opacity,curveStyle:n==null?void 0:n.curveStyle,dashed:n==null?void 0:n.dashed,animateDash:n==null?void 0:n.animateDash,rotateLabel:n==null?void 0:n.rotateLabel,markerEnd:n==null?void 0:n.markerEnd,markerStart:n==null?void 0:n.markerStart};const r=this.mergeEdgeStylingOptions(e);if(r.strokeColor=r.strokeColor!==void 0?J(r.strokeColor,t)??"var(--pvt-edge-stroke, #999)":"var(--pvt-edge-stroke, #999)",r.strokeWidth=r.strokeWidth!==void 0?Oe(r.strokeWidth,t)??2:2,r.opacity=r.opacity!==void 0?Oe(r.opacity,t)??1:1,r.curveStyle=r.curveStyle!==void 0?J(r.curveStyle,t):"bidirectional",r.markerEnd=r.markerEnd!==void 0?J(r.markerEnd,t):void 0,r.markerStart=r.markerStart!==void 0?J(r.markerStart,t):void 0,r.dashed=r.dashed!==void 0?Le(r.dashed,t):void 0,r.animateDash=r.animateDash!==void 0?Le(r.animateDash,t):void 0,t.to.parentNode&&t.to.parentNode===t.from){r.curveStyle="straight";const a=(s=(t.getSubgraphFromNode()??t.from).getGraphElement())==null?void 0:s.querySelector(".node");a&&(r.strokeColor=getComputedStyle(a).fill,r.markerStart="bigcircle",r.markerEnd="arrow")}return r}mergeEdgeStylingOptions(t){return{strokeColor:(t==null?void 0:t.strokeColor)??this.rendererOptions.defaultEdgeStyle.strokeColor,strokeWidth:(t==null?void 0:t.strokeWidth)??this.rendererOptions.defaultEdgeStyle.strokeWidth,opacity:(t==null?void 0:t.opacity)??this.rendererOptions.defaultEdgeStyle.opacity,curveStyle:(t==null?void 0:t.curveStyle)??this.rendererOptions.defaultEdgeStyle.curveStyle,dashed:(t==null?void 0:t.dashed)??this.rendererOptions.defaultEdgeStyle.dashed,animateDash:(t==null?void 0:t.animateDash)??this.rendererOptions.defaultEdgeStyle.animateDash,rotateLabel:(t==null?void 0:t.rotateLabel)??this.rendererOptions.defaultEdgeStyle.rotateLabel,markerEnd:(t==null?void 0:t.markerEnd)??this.rendererOptions.defaultEdgeStyle.markerEnd,markerStart:(t==null?void 0:t.markerStart)??this.rendererOptions.defaultEdgeStyle.markerStart}}genericEdgeRender(t,e){const n=t.append("path").attr("stroke",e.strokeColor??"var(--pvt-edge-stroke)").attr("stroke-width",e.strokeWidth??"var(--pvt-edge-stroke-width)").attr("stroke-opacity",e.opacity);return e.dashed&&(n.classed("dashed",!0),e.animateDash&&n.classed("animated",!0)),n}drawEdgeMarker(t,e,n){if(!this.rendererOptions.markerStyleMap)return;const r=e.markerEnd,s=e.markerStart;r&&this.rendererOptions.markerStyleMap[r]&&t.attr("marker-end",`url(#${r})`),s&&this.rendererOptions.markerStyleMap[s]&&t.attr("marker-start",`url(#${s})`)}updatePositions(t){const e=t.selectAll("path"),n=t.selectAll("g.label-container");e.attr("d",r=>this.linkPathRouter(r)),n.attr("transform",(r,s,o)=>{const{from:a,to:c}=r,l=this.getEdgeStyle(r),h=o[s].parentNode;let d=null;h&&h instanceof Element&&(d=et(h).select("path").node());let u,p,f={x:0,y:0},m=0;if(a===c){const b=d?Nh(d):void 0,{length:y=0,midpoint:w={x:0,y:0}}=b??{};m=y,f=w}else if(l.curveStyle==="straight"){const b=d?_h(d):void 0,{length:y=0,midpoint:w={x:0,y:0}}=b??{};m=y,f=w}else{const b=d?kh(d):void 0,{length:y=0,midpoint:w={x:0,y:0}}=b??{};m=y,f=w}if(d&&m>0)u=f.x,p=f.y,a===c&&(u+=12,p-=4);else{const b=r.source.x??0,y=r.source.y??0,w=r.target.x??0,M=r.target.y??0;u=(b+w)/2,p=(y+M)/2}if(u=isFinite(u)?u:0,p=isFinite(p)?p:0,l.rotateLabel){const b=(r.target.x??0)-(r.source.x??0),y=(r.target.y??0)-(r.source.y??0),w=Math.atan2(y,b)*180/Math.PI,M=w>90||w<-90?w+180:w;return`translate(${u}, ${p}) rotate(${M})`}else return`translate(${u}, ${p})`})}linkPathRouter(t){const{from:e,to:n}=t;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;if(e===n)return this.linkSelfLoop(t);const r=n.getConnectedNodes(),s=this.getEdgeStyle(t);return s.curveStyle==="straight"?this.linkStraight(t):s.curveStyle==="curved"?this.linkArc(t):r.filter(o=>o.id===e.id).length>0?(t.updateStyle({edge:{curveStyle:"curved"}}),this.linkArc(t)):(t.updateStyle({edge:{curveStyle:"straight"}}),this.linkStraight(t))}linkSelfLoop(t){var k;const{from:e,to:n}=t,r=((k=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:k.edge.id)===t.id;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;const s=4+(r?2:0),o=4+(r?2:0),a=e.x??0,c=e.y??0,l=e.getCircleRadius()?e.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(e).size,h=l+16*Math.log(l+1),d=Math.max(10,110/Math.sqrt(l)),u=45,p=(u+d)*Math.PI/180,f=a+h*Math.cos(p),m=c-h*Math.sin(p),b=(u-d)*Math.PI/180,y=a+h*Math.cos(b),w=c-h*Math.sin(b),M=a+(l+s)*Math.cos(p),C=c-(l+s)*Math.sin(p),N=a+(l+o)*Math.cos(b),P=c-(l+o)*Math.sin(b);return`M ${M} ${C} C ${f} ${m}, ${y} ${w}, ${N} ${P}`}linkStraight(t){var N;const{from:e,to:n}=t,r=((N=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:N.edge.id)===t.id;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;const s=this.graphSvgRenderer.edgeDrawer.getEdgeStyle(t),o=4+(s.markerStart!==void 0,0)+0,a=4+(s.markerEnd!==void 0?2:0)+2;let c=n.x-e.x,l=n.y-e.y,h=Math.sqrt(c*c+l*l),d=c/h,u=l/h;const p=e.getCircleRadius()?e.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(e).size,f=t.getSubgraphToNode()??t.to,m=f.getCircleRadius()?f.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(f).size;h===0&&(d=-Math.SQRT1_2,u=-Math.SQRT1_2,c=d*p,l=u*p,h=p);const b=h<=p;let y,w,M,C;return b?(y=e.x+p*d,w=e.y+p*u,M=n.x+(m+a)*d,C=n.y+(m+a)*u):(y=e.x+(p+o)*d,w=e.y+(p+o)*u,M=n.x-(m+a)*d,C=n.y-(m+a)*u),`M ${y},${w} L ${M},${C}`}linkArc(t){var b;const{from:e,to:n}=t,r=((b=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:b.edge.id)===t.id;if(e.x===void 0||e.y===void 0||n.x===void 0||n.y===void 0)return null;const s=Math.hypot(n.x-e.x,n.y-e.y),o=this.graphSvgRenderer.edgeDrawer.getEdgeStyle(t),a=4+(o.markerStart!==void 0,0)+(r?2:0),c=4+(o.markerStart!==void 0?2:0)+(r?2:0),l=t.source.getCircleRadius()?t.source.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(e).size,h=t.target.getCircleRadius()?t.target.getCircleRadius():this.graphSvgRenderer.nodeDrawer.getNodeStyle(n).size,d={from:{x:e.x,y:e.y},to:{x:n.x,y:n.y},rx:s,ry:s,xAxisRotation:0},u={cx:e.x,cy:e.y,r:l+a},p={cx:n.x,cy:n.y,r:h+c},f=Hr(d,u),m=Hr(d,p);return f&&m?`M${f.x},${f.y} A${s},${s} 0 0,1 ${m.x},${m.y}`:""}defaultLabelRender(t,e,n){var c;const r=t.append("g").classed("label-container",!0),s=qr(e);if(!s||s==="")return;const a=(c=r.append("text").text(s).attr("text-anchor","middle").attr("alignment-baseline","middle").style("font-size",n.fontSize).style("font-family",n.fontFamily).style("pointer-events","none").style("fill",n.color).node())==null?void 0:c.getBBox();a&&r.insert("rect","text").attr("x",a.x-4).attr("y",a.y-2).attr("width",a.width+8).attr("height",a.height+4).attr("fill",n.backgroundColor).attr("rx",2).attr("ry",2)}renderDefinitions(){this.renderMarkers()}renderMarkers(){if(this.rendererOptions.markerStyleMap)for(const t in this.rendererOptions.markerStyleMap)this.renderMarker(this.rendererOptions.markerStyleMap[t],t)}renderMarker(t,e){var a,c,l,h,d,u,p,f,m;const n=this.graphSvgRenderer.defs;if(!n.select(`#${e}`).empty())return;n.append("marker").attr("id",e).attr("viewBox",t.viewBox).attr("refX",t.refX).attr("refY",t.refY).attr("markerWidth",t.markerWidth).attr("markerHeight",t.markerHeight).attr("markerUnits",t.markerUnits||"userSpaceOnUse").attr("orient",t.orient??"auto").append("path").attr("d",t.pathD).attr("fill",t.fill??"context-stroke");const s=e+"_selected";if(!n.select(`#${s}`).empty())return;n.append("marker").attr("id",s).attr("viewBox",((a=t.selected)==null?void 0:a.viewBox)??t.viewBox).attr("refX",((c=t.selected)==null?void 0:c.refX)??t.refX).attr("refY",((l=t.selected)==null?void 0:l.refY)??t.refY).attr("markerWidth",((h=t.selected)==null?void 0:h.markerWidth)??t.markerWidth).attr("markerHeight",((d=t.selected)==null?void 0:d.markerHeight)??t.markerHeight).attr("markerUnits",(((u=t.selected)==null?void 0:u.markerUnits)??t.markerUnits)||"userSpaceOnUse").attr("orient",((p=t.selected)==null?void 0:p.orient)??t.orient??"auto").append("path").attr("d",((f=t.selected)==null?void 0:f.pathD)??t.pathD).attr("fill",((m=t.selected)==null?void 0:m.fill)??t.fill??"context-stroke")}highlightSelection(t,e){var n,r,s;if(t.classed("selected",!1),((n=this.graphSvgRenderer.getGraphInteraction().getSelectedEdge())==null?void 0:n.edge.id)===e.id){t.classed("selected",!0);const o=t.selectAll("path"),a=(r=o.attr("marker-start"))==null?void 0:r.match(/#.*(?=\))/);a&&o.attr("marker-start",`url(${a[0]}_selected)`);const c=(s=o.attr("marker-end"))==null?void 0:s.match(/#.*(?=\))/);c&&o.attr("marker-end",`url(${c[0]}_selected)`)}}}class Oh{constructor(t){g(this,"graph");g(this,"renderer");g(this,"graphInteraction");this.graph=t}init(t,e){this.renderer=t,this.graphInteraction=e,this.registerListeners()}update(){this.registerListeners()}registerListeners(){this.renderer.getOptions().dragEnabled&&this.renderer.getNodeSelection().call(this.graph.simulation.createDragBehavior()),this.renderer.getOptions().interactionEnabled&&(this.renderer.getNodeSelection().on("dblclick.node",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeDbclick(n,t,e)}).on("click.node",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeClick(n,t,e)}).on("contextmenu.node",(t,e)=>{var r;t.preventDefault(),t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeContextmenu(n,t,e)}).on("mouseenter.node",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeHoverIn(n,t,e)}).on("mouseleave.node",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.nodeHoverOut(n,t,e)}).on("dragging.node",(t,e)=>{var n;(n=this.graphInteraction)==null||n.dragging(t,e)}),this.renderer.getEdgeSelection().on("dblclick.edge",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeDbclick(n,t,e)}).on("click.edge",(t,e)=>{var r;t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeClick(n,t,e)}).on("contextmenu.edge",(t,e)=>{var r;t.preventDefault(),t.stopPropagation();const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeContextmenu(n,t,e)}).on("mouseenter.edge",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeHoverIn(n,t,e)}).on("mouseleave.edge",(t,e)=>{var r;const n=t.currentTarget;(r=this.graphInteraction)==null||r.edgeHoverOut(n,t,e)}),this.renderer.getCanvasSelection().on("click.canvas",t=>{var e;(e=this.graphInteraction)==null||e.canvasClick(t)}).on("contextmenu.canvas",t=>{var e;t.preventDefault(),(e=this.graphInteraction)==null||e.canvasContextmenu(t)}).on("mousemove.canvas",t=>{var e;(e=this.graphInteraction)==null||e.canvasMousemove(t)}))}}var ni=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ph(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var Se={exports:{}};Se.exports;var Vr;function Dh(){return Vr||(Vr=1,(function(i,t){var e=200,n="__lodash_hash_undefined__",r=800,s=16,o=9007199254740991,a="[object Arguments]",c="[object Array]",l="[object AsyncFunction]",h="[object Boolean]",d="[object Date]",u="[object Error]",p="[object Function]",f="[object GeneratorFunction]",m="[object Map]",b="[object Number]",y="[object Null]",w="[object Object]",M="[object Proxy]",C="[object RegExp]",N="[object Set]",P="[object String]",k="[object Undefined]",A="[object WeakMap]",I="[object ArrayBuffer]",z="[object DataView]",F="[object Float32Array]",Z="[object Float64Array]",Q="[object Int8Array]",S="[object Int16Array]",T="[object Int32Array]",_="[object Uint8Array]",L="[object Uint8ClampedArray]",B="[object Uint16Array]",R="[object Uint32Array]",H=/[\\^$.*+?()[\]{}|]/g,V=/^\[object .+?Constructor\]$/,Y=/^(?:0|[1-9]\d*)$/,$={};$[F]=$[Z]=$[Q]=$[S]=$[T]=$[_]=$[L]=$[B]=$[R]=!0,$[a]=$[c]=$[I]=$[h]=$[z]=$[d]=$[u]=$[p]=$[m]=$[b]=$[w]=$[C]=$[N]=$[P]=$[A]=!1;var nt=typeof ni=="object"&&ni&&ni.Object===Object&&ni,Et=typeof self=="object"&&self&&self.Object===Object&&self,gt=nt||Et||Function("return this")(),xt=t&&!t.nodeType&&t,mt=xt&&!0&&i&&!i.nodeType&&i,ce=mt&&mt.exports===xt,An=ce&&nt.process,Bs=(function(){try{var v=mt&&mt.require&&mt.require("util").types;return v||An&&An.binding&&An.binding("util")}catch{}})(),Rs=Bs&&Bs.isTypedArray;function yf(v,x,E){switch(E.length){case 0:return v.call(x);case 1:return v.call(x,E[0]);case 2:return v.call(x,E[0],E[1]);case 3:return v.call(x,E[0],E[1],E[2])}return v.apply(x,E)}function bf(v,x){for(var E=-1,D=Array(v);++E-1}function $f(v,x){var E=this.__data__,D=Si(E,v);return D<0?(++this.size,E.push([v,x])):E[D][1]=x,this}Bt.prototype.clear=zf,Bt.prototype.delete=Bf,Bt.prototype.get=Rf,Bt.prototype.has=Hf,Bt.prototype.set=$f;function he(v){var x=-1,E=v==null?0:v.length;for(this.clear();++x1?E[G-1]:void 0,W=G>2?E[2]:void 0;for(U=v.length>3&&typeof U=="function"?(G--,U):void 0,W&&mg(E[0],E[1],W)&&(U=G<3?void 0:U,G=1),x=Object(x);++D-1&&v%1==0&&v0){if(++x>=r)return arguments[0]}else x=0;return v.apply(void 0,arguments)}}function Eg(v){if(v!=null){try{return Ci.call(v)}catch{}try{return v+""}catch{}}return""}function Ni(v,x){return v===x||v!==v&&x!==x}var Dn=Xs((function(){return arguments})())?Xs:function(v){return Ie(v)&&qt.call(v,"callee")&&!kf.call(v,"callee")},Fn=Array.isArray;function zn(v){return v!=null&&Js(v.length)&&!Bn(v)}function Sg(v){return Ie(v)&&zn(v)}var Qs=Af||Ig;function Bn(v){if(!Jt(v))return!1;var x=_i(v);return x==p||x==f||x==l||x==M}function Js(v){return typeof v=="number"&&v>-1&&v%1==0&&v<=o}function Jt(v){var x=typeof v;return v!=null&&(x=="object"||x=="function")}function Ie(v){return v!=null&&typeof v=="object"}function _g(v){if(!Ie(v)||_i(v)!=w)return!1;var x=Vs(v);if(x===null)return!0;var E=qt.call(x,"constructor")&&x.constructor;return typeof E=="function"&&E instanceof E&&Ci.call(E)==Sf}var to=Rs?wf(Rs):ig;function kg(v){return dg(v,eo(v))}function eo(v){return zn(v)?Qf(v):ng(v)}var Ng=ug(function(v,x,E){Ws(v,x,E)});function Ag(v){return function(){return v}}function io(v){return v}function Ig(){return!1}i.exports=Ng})(Se,Se.exports)),Se.exports}var Fh=Dh();const se=Ph(Fh);class zh{constructor(t){g(this,"graph");g(this,"callbacks");g(this,"listeners");g(this,"selectedNode",null);g(this,"selectedEdge",null);g(this,"selectedNodes",[]);g(this,"selectedEdges",[]);g(this,"nodeHoverIn",(t,e,n)=>{this.emit("nodeHoverIn",e,n,t),this.callbacks.onNodeHoverIn&&typeof this.callbacks.onNodeHoverIn=="function"&&this.callbacks.onNodeHoverIn(e,n,t)});g(this,"nodeHoverOut",(t,e,n)=>{this.emit("nodeHoverOut",e,n,t),this.callbacks.onNodeHoverOut&&typeof this.callbacks.onNodeHoverOut=="function"&&this.callbacks.onNodeHoverOut(e,n,t)});g(this,"dragging",(t,e)=>{this.emit("dragging",t,e),this.callbacks.onNodeDragging&&typeof this.callbacks.onNodeDragging=="function"&&this.callbacks.onNodeDragging(t,e)});g(this,"dragended",(t,e)=>{this.emit("dragended",t,e),this.callbacks.onNodeDragended&&typeof this.callbacks.onNodeDragended=="function"&&this.callbacks.onNodeDragended(t,e)});this.graph=t,this.callbacks=this.graph.getCallbacks()??{},this.listeners={nodeClick:[],nodeDbclick:[],nodeHoverIn:[],nodeHoverOut:[],nodeSelect:[],nodeBlur:[],dragging:[],dragended:[],nodeContextmenu:[],edgeClick:[],edgeDbclick:[],edgeHoverIn:[],edgeHoverOut:[],edgeSelect:[],edgeBlur:[],edgeContextmenu:[],canvasClick:[],canvasMousemove:[],canvasContextmenu:[],canvasZoom:[],simulationTick:[],simulationSlowTick:[],selectNode:[],unselectNode:[],selectEdge:[],unselectEdge:[],selectNodes:[],unselectNodes:[],selectEdges:[],unselectEdges:[]},this.graph.UIManager.keyManager.register({key:"Enter",callback:()=>{this.expandNodeSelection()}})}on(t,e){this.listeners[t].push(e)}off(t,e){this.listeners[t]=this.listeners[t].filter(n=>n!==e)}getGraph(){return this.graph}emit(t,...e){for(const n of this.listeners[t])n(...e)}nodeClick(t,e,n){var r;e.shiftKey?this.addNodesToSelection([{node:n,element:t}]):((r=this.getSelectedNode())==null?void 0:r.node)!==n&&(t.classList.contains("pvt-node-expanded"),this.selectNode(t,n)),this.emit("nodeClick",e,n,t),this.callbacks.onNodeClick&&typeof this.callbacks.onNodeClick=="function"&&this.callbacks.onNodeClick(e,n,t)}nodeDbclick(t,e,n){this.emit("nodeDbclick",e,n,t),this.callbacks.onNodeDbclick&&typeof this.callbacks.onNodeDbclick=="function"&&this.callbacks.onNodeDbclick(e,n,t)}nodeContextmenu(t,e,n){this.emit("nodeContextmenu",e,n,t),this.callbacks.onNodeContextmenu&&typeof this.callbacks.onNodeContextmenu=="function"&&this.callbacks.onNodeContextmenu(e,n,t)}edgeClick(t,e,n){this.selectEdge(t,n),this.emit("edgeClick",e,n,t),this.callbacks.onEdgeClick&&typeof this.callbacks.onEdgeClick=="function"&&this.callbacks.onEdgeClick(e,n,t)}edgeDbclick(t,e,n){this.emit("edgeDbclick",e,n,t),this.callbacks.onEdgeDbclick&&typeof this.callbacks.onEdgeDbclick=="function"&&this.callbacks.onEdgeDbclick(e,n,t)}edgeContextmenu(t,e,n){this.emit("edgeContextmenu",e,n,t),this.callbacks.onEdgeContextmenu&&typeof this.callbacks.onEdgeContextmenu=="function"&&this.callbacks.onEdgeContextmenu(e,n,t)}edgeHoverIn(t,e,n){this.emit("edgeHoverIn",e,n,t),this.callbacks.onEdgeHoverIn&&typeof this.callbacks.onEdgeHoverIn=="function"&&this.callbacks.onEdgeHoverIn(e,n,t)}edgeHoverOut(t,e,n){this.emit("edgeHoverOut",e,n,t),this.callbacks.onEdgeHoverOut&&typeof this.callbacks.onNodeHoverOut=="function"&&this.callbacks.onEdgeHoverOut(e,n,t)}canvasClick(t){this.unselectAll(),this.emit("canvasClick",t),this.callbacks.onCanvasClick&&typeof this.callbacks.onCanvasClick=="function"&&this.callbacks.onCanvasClick(t)}canvasZoom(t){this.emit("canvasZoom",t),this.callbacks.onCanvasZoom&&typeof this.callbacks.onCanvasZoom=="function"&&this.callbacks.onCanvasZoom(t)}canvasContextmenu(t){this.emit("canvasContextmenu",t),this.callbacks.onCanvasContextmenu&&typeof this.callbacks.onCanvasContextmenu=="function"&&this.callbacks.onCanvasContextmenu(t)}canvasMousemove(t){this.emit("canvasMousemove",t),this.callbacks.onCanvasMousemove&&typeof this.callbacks.onCanvasMousemove=="function"&&this.callbacks.onCanvasMousemove(t)}simulationTick(){this.emit("simulationTick"),this.callbacks.onSimulationTick&&typeof this.callbacks.onSimulationTick=="function"&&this.callbacks.onSimulationTick()}simulationSlowTick(){this.emit("simulationSlowTick"),this.callbacks.onSimulationSlowTick&&typeof this.callbacks.onSimulationSlowTick=="function"&&this.callbacks.onSimulationSlowTick()}selectNode(t,e){this.unselectAll(),this.selectedNode={node:e,element:t},this.selectedNodes=[this.selectedNode],this.emit("selectNode",e,t),this.callbacks.onNodeSelect&&typeof this.callbacks.onNodeSelect=="function"&&this.callbacks.onNodeSelect(e,t),this.refreshRendering()}unselectNode(){if(this.selectedNode===null)return;const t=this.selectedNode.node,e=this.selectedNode.element;this.selectedNode=null,this.selectedNodes=[],this.emit("unselectNode",t,e),this.callbacks.onNodeBlur&&typeof this.callbacks.onNodeBlur=="function"&&this.callbacks.onNodeBlur(t,e),this.unselectFromDirectSubgraph(t),this.refreshRendering()}unselectFromAncestorSubgraphs(t){var a,c;const e=this.buildAncestorStack(t);let n=this.findOutermostSubgraph(e);if(!n)return;let r;for(;e.length>0&&n;){const l=e.pop();r=n,l&&(n=(a=n.getMutableNode(l.id))==null?void 0:a.getSubgraph())}if(!r)return;const s=r.renderer.getGraphInteraction();((c=s.getSelectedNode())==null?void 0:c.node.id)===t.id&&s.unselectNode()}unselectFromDirectSubgraph(t){var n,r;const e=(n=t.parentNode)==null?void 0:n.getSubgraph();if(e){const s=e.renderer.getGraphInteraction();((r=s.getSelectedNode())==null?void 0:r.node.id)===t.id&&s.unselectNode()}this.refreshRendering()}buildAncestorStack(t){const e=[];let n=t.parentNode;for(;n;)e.push(n),n=n.parentNode;return e}findOutermostSubgraph(t){var e;for(let n=t.length-1;n>=0;n--){const r=(e=t[n])==null?void 0:e.getSubgraph();if(r)return r}}selectNodes(t){if(t.length===1)return this.selectNode(t[0].element,t[0].node);this.unselectAll(),this.selectedNodes=t,this.emit("selectNodes",this.selectedNodes),this.callbacks.onNodesSelect&&typeof this.callbacks.onNodesSelect=="function"&&this.callbacks.onNodesSelect(t),this.refreshRendering()}addNodesToSelection(t){if(t.length==0)return;if(this.selectedNodes.length===0&&t.length===1)return this.selectNode(t[0].element,t[0].node);const e=this.getSelectedNodeIDs()??[];t=t.filter(n=>!e.includes(n.node.id)),this.selectedNodes=this.selectedNodes.concat(t),this.callbacks.onNodesSelect&&typeof this.callbacks.onNodesSelect=="function"&&this.callbacks.onNodesSelect(t),this.emit("selectNodes",t),this.refreshRendering()}removeNodesFromSelection(t){const e=t.map(n=>n.node.id);this.selectedNodes=this.selectedNodes.filter(n=>!e.includes(n.node.id)),t.forEach(({node:n,element:r})=>{this.callbacks.onNodeBlur&&typeof this.callbacks.onNodeBlur=="function"&&this.callbacks.onNodeBlur(n,r)}),this.emit("unselectNodes",t),this.refreshRendering()}selectEdge(t,e){this.unselectAll(),this.selectedEdge={edge:e,element:t},this.emit("selectEdge",e,t),this.callbacks.onEdgeSelect&&typeof this.callbacks.onEdgeSelect=="function"&&this.callbacks.onEdgeSelect(e,t),this.refreshRendering()}selectEdges(t){this.unselectAll(),this.selectedEdges=t.map(e=>({edge:e[0],element:e[1]})),this.emit("selectEdges",this.selectedEdges),this.selectedEdges.forEach(({edge:e,element:n})=>{this.callbacks.onEdgeSelect&&typeof this.callbacks.onEdgeSelect=="function"&&this.callbacks.onEdgeSelect(e,n)}),this.refreshRendering()}unselectEdge(){if(this.selectedEdge===null)return;const t=this.selectedEdge.edge,e=this.selectedEdge.element;this.selectedEdge=null,this.emit("unselectEdge",t,e),this.callbacks.onEdgeBlur&&typeof this.callbacks.onEdgeBlur=="function"&&this.callbacks.onEdgeBlur(t,e),this.refreshRendering()}unselectAll(){this.unselectNode(),this.unselectEdge(),this.clearNodeSelectionList(),this.clearEdgeSelectionList(),this.refreshRendering()}clearNodeSelectionList(){this.selectedNodes.forEach(({node:t,element:e})=>{this.callbacks.onNodeBlur&&typeof this.callbacks.onNodeBlur=="function"&&this.callbacks.onNodeBlur(t,e)}),this.selectedNodes=[],this.emit("unselectNodes",this.selectedNodes)}clearEdgeSelectionList(){this.emit("unselectEdges",this.selectedEdges),this.selectedEdges.forEach(({edge:t,element:e})=>{this.callbacks.onEdgeBlur&&typeof this.callbacks.onEdgeBlur=="function"&&this.callbacks.onEdgeBlur(t,e)}),this.selectedEdges=[]}hasActiveMultiselection(){return this.selectedNodes.length>1||this.selectedEdges.length>1}refreshRendering(){this.graph.renderer.update(!1),this.graph.renderer.nextTick()}getSelectedNode(){return this.selectedNode}getSelectedEdge(){return this.selectedEdge}getSelectedNodeIDs(){var t;return((t=this.selectedNodes)==null?void 0:t.map(e=>e.node.id))??null}getSelectedNodes(){return this.selectedNodes}getSelectedEdgeIDs(){var t;return((t=this.selectedEdges)==null?void 0:t.map(e=>e.edge.id))??null}getSelectedEdges(){return this.selectedEdges}expandNodeSelection(){this.selectedNodes.length>1?this.graph.toggleExpandNodes(this.selectedNodes.map(t=>t.node)):this.selectedNode&&this.graph.toggleExpandNode(this.selectedNode.node)}}class Bh{constructor(t,e,n){g(this,"graph");g(this,"container");g(this,"options");g(this,"layoutProgress",0);g(this,"layoutProgressType","done");g(this,"progressBar",null);g(this,"timerLabel",null);g(this,"textLabel",null);g(this,"loadingPb",null);this.graph=t,this.container=e,this.options=n}getCanvas(){return this.container.querySelector(".pvt-canvas")}updateLayoutProgress(t,e,n){this.layoutProgress=t,this.layoutProgressType=n,!(!this.progressBar||!this.timerLabel||!this.textLabel)&&(this.progressBar.style.width=`${t*100}%`,this.timerLabel.textContent=`Elapsed time: ${(e/1e3).toFixed(1)} sec`,this.layoutProgressType==="simulation"?this.textLabel.textContent="Optimizing node positions...":this.layoutProgressType==="rendering"?(this.progressBar.style.width="100%",this.textLabel.textContent="Rendering in progress"):this.layoutProgressType==="done"&&(this.progressBar.style.width="100%",this.timerLabel.textContent="All done"),this.toggleLayoutProgressVisibility())}toggleLayoutProgressVisibility(){const t=this.getZoomGroup();t&&t.classList.toggle("hidden",this.layoutProgressType!=="done"),this.loadingPb&&this.loadingPb.classList.toggle("hidden",this.layoutProgressType==="done")}setupRendering(){this.createHtmlProgressBar()}createHtmlProgressBar(){const t=this.getCanvas();if(!t)throw new Error("Canvas element is not defined in the graph renderer.");const e=document.createElement("div");e.classList.add("pvt-loading-progress-bar"),e.style.position="absolute",e.style.left="50%",e.style.top="50%",e.style.transform="translate(-50%, -50%)";const n=document.createElement("div");n.classList.add("background"),n.style.width="100%";const r=document.createElement("div");r.classList.add("track"),n.style.width="100%";const s=document.createElement("div");s.classList.add("fill"),s.style.width="0px";const o=document.createElement("span");o.classList.add("label"),o.textContent="Optimizing node positions...";const a=document.createElement("span");a.classList.add("label"),a.textContent="Elapsed time: 0 sec",r.appendChild(s),n.appendChild(r),e.append(n,o,a),t.appendChild(e),this.progressBar=s,this.timerLabel=a,this.textLabel=o,this.loadingPb=e}}class Rh{}class Hh extends Rh{constructor(e,n,r){super();g(this,"renderer");g(this,"svg");g(this,"selectionBoxGroup");g(this,"rect",null);g(this,"startX",0);g(this,"startY",0);g(this,"isSelecting",!1);g(this,"selectionMode","start");g(this,"onSvgMouseLeave",()=>{this.isSelecting&&this.onMouseUp()});g(this,"onMouseDown",e=>{if(!this.selectionBoxGroup)return;if(e.shiftKey)this.selectionMode="add";else if(e.altKey)this.selectionMode="start";else if(e.ctrlKey)this.selectionMode="remove";else{this.selectionMode="start";return}e.preventDefault(),this.svg.querySelectorAll(".pvt-selection-rectangle").forEach(s=>s.remove()),this.isSelecting=!0;const{x:n,y:r}=this.getSvgPoint(e);this.startX=n,this.startY=r,this.rect=document.createElementNS("http://www.w3.org/2000/svg","rect"),this.rect.setAttribute("x",n.toString()),this.rect.setAttribute("y",r.toString()),this.rect.setAttribute("width","0"),this.rect.setAttribute("height","0"),this.rect.setAttribute("class","pvt-selection-rectangle"),this.selectionBoxGroup.appendChild(this.rect),this.svg.addEventListener("mouseleave",this.onSvgMouseLeave)});g(this,"onMouseMove",e=>{if(!this.isSelecting||!this.rect)return;const{x:n,y:r}=this.getSvgPoint(e),s=Math.min(this.startX,n),o=Math.min(this.startY,r),a=Math.abs(n-this.startX),c=Math.abs(r-this.startY);this.rect.setAttribute("x",s.toString()),this.rect.setAttribute("y",o.toString()),this.rect.setAttribute("width",a.toString()),this.rect.setAttribute("height",c.toString())});g(this,"onMouseUp",()=>{if(!this.selectionBoxGroup||!this.isSelecting||!this.rect)return;this.isSelecting=!1;const e=this.rect.getBoundingClientRect(),n=this.getNodesInRect(e).map(r=>({node:r[0],element:r[1]}));this.selectionMode=="start"?this.renderer.getGraphInteraction().selectNodes(n):this.selectionMode=="add"?this.renderer.getGraphInteraction().addNodesToSelection(n):this.selectionMode=="remove"&&this.renderer.getGraphInteraction().removeNodesFromSelection(n),this.selectionBoxGroup.removeChild(this.rect),this.rect=null,this.svg.removeEventListener("mouseleave",this.onSvgMouseLeave)});this.renderer=e,this.svg=n,this.selectionBoxGroup=r,this.init()}selectionInProgress(){return this.isSelecting}init(){this.svg.addEventListener("mousedown",this.onMouseDown),this.svg.addEventListener("mousemove",this.onMouseMove),this.svg.addEventListener("mouseup",this.onMouseUp)}getSvgPoint(e){var r;const n=this.svg.createSVGPoint();return n.x=e.clientX,n.y=e.clientY,n.matrixTransform((r=this.svg.getScreenCTM())==null?void 0:r.inverse())}getNodesInRect(e){const n=this.renderer.getGraphInteraction().getGraph().getMutableNodes(),r=[];return n.forEach(s=>{if(!s.x||!s.y)return;const o=s.getGraphElement();if(!o||!(o instanceof SVGGElement))return;const a=o.getBoundingClientRect();a.xe.x&&a.ye.y&&r.push([s,o])}),r}}et.prototype.transition=ji;const $h={type:"svg",enableFocusMode:!0,enableNodeExpansion:!0,beforeRender:()=>{},zoomEnabled:!0,dragEnabled:!0,interactionEnabled:!0,minZoom:.05,maxZoom:10,zoomAnimation:!0,zoomAnimationDuration:300,defaultNodeStyle:{shape:"circle",size:10,strokeWidth:"var(--pvt-node-stroke-width, 2)",color:"var(--pvt-node-color, #007acc)",strokeColor:"var(--pvt-node-stroke, #fff)",fontFamily:"var(--pvt-label-font, system-ui, sans-serif)",textColor:"var(--pvt-node-text-color, #fff)",textVerticalShift:0,iconUnicode:void 0,iconClass:void 0,svgIcon:void 0,imagePath:void 0,text:void 0,html:void 0},defaultEdgeStyle:{strokeWidth:2,opacity:1,curveStyle:"bidirectional",dashed:!1,animateDash:!0,rotateLabel:!1,markerEnd:"arrow",markerStart:void 0,strokeColor:"var(--pvt-edge-stroke, #999)"},defaultLabelStyle:{fontSize:12,fontFamily:"var(--pvt-label-font, system-ui, sans-serif)",color:"var(--pvt-edge-label-color, #333)",backgroundColor:"var(--pvt-edge-label-bg, #ffffffa0)"},markerStyleMap:{arrow:{pathD:"M0,-5L10,0L0,5",viewBox:"0 -5 10 10",refX:6,refY:0,markerWidth:12,markerHeight:12,markerUnits:"userSpaceOnUse",orient:"auto",selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)"}},circle:{pathD:"M5,5m-3,0a3,3 0 1,0 6,0a3,3 0 1,0 -6,0",viewBox:"0 0 10 10",refX:5,refY:5,markerWidth:10,markerHeight:10,markerUnits:"userSpaceOnUse",orient:0,selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)",markerWidth:16,markerHeight:16}},diamond:{pathD:"M0,-4L4,0L0,4L-4,0Z",viewBox:"-5 -5 10 10",refX:0,refY:0,markerWidth:8,markerHeight:8,markerUnits:"userSpaceOnUse",orient:0,selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)",markerWidth:14,markerHeight:14}},bigcircle:{pathD:"M5,5m-3,0a3,3 0 1,0 6,0a3,3 0 1,0 -6,0",viewBox:"0 0 10 10",refX:5,refY:5,markerWidth:16,markerHeight:16,markerUnits:"userSpaceOnUse",orient:0,selected:{fill:"var(--pvt-edge-selected-stroke, #007acc)",markerWidth:24,markerHeight:24}}},selectionBox:{enabled:!0}};class Gh extends Bh{constructor(e,n,r,s){super(e,n,s);g(this,"options");g(this,"zoom");g(this,"eventHandler");g(this,"selectionBox",null);g(this,"graphInteraction");g(this,"nodeDrawer");g(this,"edgeDrawer");g(this,"svgCanvas");g(this,"svg");g(this,"zoomGroup");g(this,"edgeGroup");g(this,"nodeGroup");g(this,"selectionBoxGroup");g(this,"defs");g(this,"nodeGroupSelection");g(this,"edgeGroupSelection");g(this,"nodeSelection");g(this,"edgeSelection");this.options=se({},$h,s),this.graphInteraction=r,this.eventHandler=new Oh(this.graph),this.nodeDrawer=new ii(this.options,this.graph,this),this.edgeDrawer=new Lh(this.options,this.graph,this),this.svgCanvas=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svgCanvas.setAttribute("width","100%"),this.svgCanvas.setAttribute("height","100%"),this.svgCanvas.setAttribute("fill","none"),this.svgCanvas.setAttribute("class","pvt-canvas-element"),this.svgCanvas.setAttribute("data-renderer-drag-enabled",this.options.dragEnabled?"1":"0"),this.getCanvas().appendChild(this.svgCanvas),this.svg=et(this.svgCanvas),this.zoomGroup=this.svg.append("g").attr("class","zoom-layer hidden"),this.edgeGroup=this.zoomGroup.append("g").attr("class","edges"),this.selectionBoxGroup=this.svg.append("g").attr("class","selection-box"),this.nodeGroup=this.zoomGroup.append("g").attr("class","nodes"),this.defs=this.svg.append("defs"),this.edgeDrawer.renderDefinitions(),this.zoom=Gc(),this.zoom=this.zoom.filter(a=>{if(!this.options.zoomEnabled||a.ctrlKey||a.shiftKey||a.altKey)return!1;const c=a.target;return!(c.tagName==="INPUT"||c.tagName==="SELECT"||c.tagName==="TEXTAREA")}).scaleExtent([this.options.minZoom,this.options.maxZoom]).on("zoom",a=>{this.zoomGroup.attr("transform",a.transform),this.graphInteraction.canvasZoom(a)}),this.svg.call(this.zoom),this.svg.on("dblclick.zoom",null),this.options.selectionBox.enabled&&(this.selectionBox=new Hh(this,this.svgCanvas,this.selectionBoxGroup.node())),new IntersectionObserver(a=>{a.forEach(c=>{c.isIntersecting&&this.nodeSelection.each((l,h,d)=>{if(l.getCircleRadius()!==25)return;const u=d[h].getBBox();l.setCircleRadius(.5*Math.max(u.width,u.height))})})},{threshold:0}).observe(this.svgCanvas)}setupRendering(){this.createHtmlProgressBar()}getZoomBehavior(){return this.zoom}getSelectionBox(){return this.selectionBox}getOptions(){return this.options}init(){this.options.beforeRender&&this.options.beforeRender(this.graph),this.dataUpdate(),this.eventHandler.init(this,this.graphInteraction)}update(e=!1){this.dataUpdate(),e&&this.eventHandler.update()}dataUpdate(){const e=this.graph.getMutableNodes().filter(s=>s.visible),n=this.nodeGroup.node();this.nodeGroupSelection=this.nodeGroup.selectAll("g.pvt-node").filter(function(){return this.parentNode===n}),this.nodeSelection=this.nodeGroupSelection.data(e,s=>s.id).join(s=>s.append("g").classed("pvt-node",!0).classed("pvt-node-has-children",o=>o.hasChildren()).classed("pvt-node-expanded",o=>o.expanded===!0).each((o,a,c)=>{o.clearDirty();const l=et(c[a]);l.attr("id",`node-${o.domID}`),this.nodeDrawer.render(l,o)}),s=>s.classed("pvt-node-expanded",o=>o.expanded===!0).each((o,a,c)=>{const l=et(c[a]);if(o.isDirty()){if(o.clearDirty(),!o.expanded){it.collapseAllOpenedClusters(o),it.toggleSyntheticEdges(o);const h=this.nodeDrawer.graph.getParentGraph();let d=h;for(;d;)d.renderer.update(!1),d=d.getParentGraph();h&&it.updateToNewRadiusCollapsed(o,!0,h)}l.selectChildren().remove(),this.nodeDrawer.render(l,o)}this.nodeDrawer.checkForHighlight(l,o)}),s=>s.remove());const r=this.graph.getMutableEdges().filter(s=>s.visible);this.edgeGroupSelection=this.edgeGroup.selectAll("g.pvt-edge-group"),this.edgeSelection=this.edgeGroupSelection.data(r,s=>s.id).join(s=>s.append("g").classed("pvt-edge-group",!0).classed("pvt-edge-synthetic",o=>o.isSynthetic===!0).each((o,a,c)=>{o.clearDirty();const l=et(c[a]);l.attr("id",`edge-${o.domID}`),this.edgeDrawer.render(l,o)}),s=>s.each((o,a,c)=>{if(o.isDirty()){o.clearDirty();const l=et(c[a]);l.selectChildren().remove(),this.edgeDrawer.render(l,o)}}),s=>s.remove())}getCanvasSelection(){return this.svg}getZoomGroup(){return this.zoomGroup.node()}nextTick(){this.updateEdgePositions(),this.updateNodePositions()}nextTickFor(e){this.updateEdgePositions(e),this.updateNodePositions(e)}zoomIn(){const e=this.getZoomBehavior(),n=this.getCanvasSelection();!e||!n||(this.options.zoomAnimation?n.transition().duration(300).call(e.scaleBy,1.5):n.call(e.scaleBy,1.5))}zoomOut(){const e=this.getZoomBehavior(),n=this.getCanvasSelection();!e||!n||(this.options.zoomAnimation?n.transition().duration(300).call(e.scaleBy,.667):n.call(e.scaleBy,.667))}fitAndCenter(e){const n=this.getZoomBehavior(),r=this.getCanvasSelection(),s=r.node(),o=r.select(".zoom-layer").node();if(!n||!s||!o)return;const a=o.getBBox();if(a.width==0||a.height==0)return;const c=s.clientWidth,l=s.clientHeight,h=a.width,d=a.height,u=a.x+h/2,p=a.y+d/2;let f;e?f=e:(f=Math.min(c/h,l/d)*.8,f=Math.min(f,3));const m=c/2-f*u,b=l/2-f*p,y=ei.translate(m,b).scale(f);this.options.zoomAnimation?r.transition().duration(this.options.zoomAnimationDuration).call(n.transform,y):r.call(n.transform,y)}focusElement(e){const n=e.getGraphElement(),r=this.getZoomBehavior(),s=this.getCanvasSelection(),o=s.node(),a=s.select(".zoom-layer").node();if(!r||!o||!a||!n)return;const c=a.getBBox(),l=o.clientWidth,h=o.clientHeight,d=c.width,u=c.height,p=n.transform.baseVal;let f=0,m=0;if(p.numberOfItems>0){const C=p.getItem(0);f=C.matrix.e,m=C.matrix.f}const b=Math.min(l/d,h/u)*1.5,y=l/2-b*f,w=h/2-b*m,M=ei.translate(y,w).scale(b);s.transition().duration(300).call(r.transform,M)}highlightElement(e){const n=e.getGraphElement();e instanceof bt?(this.edgeSelection.classed("pvt-edge-highlighted",!1),n==null||n.classList.add("pvt-edge-highlighted")):e instanceof yt&&(this.nodeSelection.classed("pvt-node-highlighted",!1),n==null||n.classList.add("pvt-node-highlighted"))}unHighlightElement(e){const n=e.getGraphElement();e instanceof bt?n==null||n.classList.remove("pvt-edge-highlighted"):e instanceof yt&&(n==null||n.classList.remove("pvt-node-highlighted"))}clearHighlightedElements(){this.edgeSelection.classed("pvt-edge-highlighted",!1),this.nodeSelection.classed("pvt-node-highlighted",!1)}updateNodePositions(e){if(e){const n=new Set(e==null?void 0:e.map(s=>s.id)),r=this.nodeSelection.filter(s=>n.has(s.id));this.nodeDrawer.updatePositions(r)}else this.nodeDrawer.updatePositions(this.nodeSelection)}updateEdgePositions(e){if(e){const n=e.flatMap(o=>[...o.getEdgesOut(),...o.getEdgesIn()]),r=new Set(n==null?void 0:n.map(o=>o.id)),s=this.edgeSelection.filter(o=>r.has(o.id));this.edgeDrawer.updatePositions(s)}else this.edgeDrawer.updatePositions(this.edgeSelection)}getNodeSelection(){return this.nodeSelection}getEdgeSelection(){return this.edgeSelection}getGraphInteraction(){return this.graphInteraction}getEventHandler(){return this.eventHandler}}function qh(i,t,e){const n=e.type??"svg";if(n==="svg"){const r=new zh(i);return new Gh(i,t,r,e)}throw new Error(`\`${n}\` renderer is not implemented yet.`)}function Vh(i=0,t=0,e=.001){let n=[],r;function s(){r=typeof e=="function"?e:()=>e}function o(a){for(let c=0,l=n.length;c{n=a,s()},o.x=function(a){return arguments.length?(i=a,o):i},o.y=function(a){return arguments.length?(t=a,o):t},o.strength=function(a){return arguments.length?(e=a,s(),o):e},o}const Uh=(i,t,e,n,r)=>new Promise((s,o)=>{const a=new Worker(new URL("/static/js/assets/SimulationWorker-kgekWV9K.js",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:ht&&ht.tagName.toUpperCase()==="SCRIPT"&&ht.src||new URL("pivotick.umd.cjs",document.baseURI).href),{type:"module"});a.postMessage({source:"simulation-worker-wrapper",nodes:i,edges:t,options:e,canvasBCR:n}),a.onmessage=c=>{const{type:l,progress:h,nodes:d,edges:u,elapsedTime:p}=c.data;if(l==="tick"&&typeof h=="number"){r==null||r(h,p);return}l==="done"&&(s({nodes:d,edges:u}),a.terminate())},a.onerror=o});function jh(i){var t=0,e=i.children,n=e&&e.length;if(!n)t=1;else for(;--n>=0;)t+=e[n].value;i.value=t}function Yh(){return this.eachAfter(jh)}function Xh(i,t){let e=-1;for(const n of this)i.call(t,n,++e,this);return this}function Wh(i,t){for(var e=this,n=[e],r,s,o=-1;e=n.pop();)if(i.call(t,e,++o,this),r=e.children)for(s=r.length-1;s>=0;--s)n.push(r[s]);return this}function Kh(i,t){for(var e=this,n=[e],r=[],s,o,a,c=-1;e=n.pop();)if(r.push(e),s=e.children)for(o=0,a=s.length;o=0;)e+=n[r].value;t.value=e})}function Jh(i){return this.eachBefore(function(t){t.children&&t.children.sort(i)})}function td(i){for(var t=this,e=ed(t,i),n=[t];t!==e;)t=t.parent,n.push(t);for(var r=n.length;i!==e;)n.splice(r,0,i),i=i.parent;return n}function ed(i,t){if(i===t)return i;var e=i.ancestors(),n=t.ancestors(),r=null;for(i=e.pop(),t=n.pop();i===t;)r=i,i=e.pop(),t=n.pop();return r}function id(){for(var i=this,t=[i];i=i.parent;)t.push(i);return t}function nd(){return Array.from(this)}function rd(){var i=[];return this.eachBefore(function(t){t.children||i.push(t)}),i}function sd(){var i=this,t=[];return i.each(function(e){e!==i&&t.push({source:e.parent,target:e})}),t}function*od(){var i=this,t,e=[i],n,r,s;do for(t=e.reverse(),e=[];i=t.pop();)if(yield i,n=i.children)for(r=0,s=n.length;r=0;--a)r.push(s=o[a]=new _e(o[a])),s.parent=n,s.depth=n.depth+1;return e.eachBefore(dd)}function ad(){return ri(this).eachBefore(hd)}function ld(i){return i.children}function cd(i){return Array.isArray(i)?i[1]:null}function hd(i){i.data.value!==void 0&&(i.value=i.data.value),i.data=i.data.data}function dd(i){var t=0;do i.height=t;while((i=i.parent)&&i.height<++t)}function _e(i){this.data=i,this.depth=this.height=0,this.parent=null}_e.prototype=ri.prototype={constructor:_e,count:Yh,each:Xh,eachAfter:Kh,eachBefore:Wh,find:Zh,sum:Qh,sort:Jh,path:td,ancestors:id,descendants:nd,leaves:rd,links:sd,copy:ad,[Symbol.iterator]:od};function ud(i,t){return i.parent===t.parent?1:2}function nn(i){var t=i.children;return t?t[0]:i.t}function rn(i){var t=i.children;return t?t[t.length-1]:i.t}function pd(i,t,e){var n=e/(t.i-i.i);t.c-=n,t.s+=e,i.c+=n,t.z+=e,t.m+=e}function fd(i){for(var t=0,e=0,n=i.children,r=n.length,s;--r>=0;)s=n[r],s.z+=t,s.m+=t,t+=s.s+(e+=s.c)}function gd(i,t,e){return i.a.parent===t.parent?i.a:e}function si(i,t){this._=i,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=t}si.prototype=Object.create(_e.prototype);function md(i){for(var t=new si(i,0),e,n=[t],r,s,o,a;e=n.pop();)if(s=e._.children)for(e.children=new Array(a=s.length),o=a-1;o>=0;--o)n.push(r=e.children[o]=new si(s[o],o)),r.parent=e;return(t.parent=new si(null,0)).children=[t],t}function Ur(){var i=ud,t=1,e=1,n=null;function r(l){var h=md(l);if(h.eachAfter(s),h.parent.m=-h.z,h.eachBefore(o),n)l.eachBefore(c);else{var d=l,u=l,p=l;l.eachBefore(function(w){w.xu.x&&(u=w),w.depth>p.depth&&(p=w)});var f=d===u?1:i(d,u)/2,m=f-d.x,b=t/(u.x+f+m),y=e/(p.depth||1);l.eachBefore(function(w){w.x=(w.x+m)*b,w.y=w.depth*y})}return l}function s(l){var h=l.children,d=l.parent.children,u=l.i?d[l.i-1]:null;if(h){fd(l);var p=(h[0].z+h[h.length-1].z)/2;u?(l.z=u.z+i(l._,u._),l.m=l.z-p):l.z=p}else u&&(l.z=u.z+i(l._,u._));l.parent.A=a(l,u,l.parent.A||d[0])}function o(l){l._.x=l.z+l.parent.m,l.m+=l.parent.m}function a(l,h,d){if(h){for(var u=l,p=l,f=h,m=u.parent.children[0],b=u.m,y=p.m,w=f.m,M=m.m,C;f=rn(f),u=nn(u),f&&u;)m=nn(m),p=rn(p),p.a=l,C=f.z+w-u.z-b+i(f._,u._),C>0&&(pd(gd(f,l,d),l,C),b+=C,y+=C),w+=f.m,b+=u.m,M+=m.m,y+=p.m;f&&!rn(p)&&(p.t=f,p.m+=w-y),u&&!nn(m)&&(m.t=u,m.m+=b-M,d=l)}return d}function c(l){l.x*=t,l.y=l.depth*e}return r.separation=function(l){return arguments.length?(i=l,r):i},r.size=function(l){return arguments.length?(n=!1,t=+l[0],e=+l[1],r):n?null:[t,e]},r.nodeSize=function(l){return arguments.length?(n=!0,t=+l[0],e=+l[1],r):n?[t,e]:null},r}function ke(i,t){const e={};for(const o of i)e[o.id]=[];for(const{source:o,target:a}of t)e[o.id]||(e[o.id]=[]),e[o.id].push(a.id);const n=new Set,r=new Set,s=o=>{if(!n.has(o)&&(n.add(o),r.add(o),e[o]))for(const a of e[o]){if(!n.has(a)&&s(a))return!0;if(r.has(a))return!0}return r.delete(o),!1};return i.some(o=>s(o.id))}function jr(i,t){const e=new Set(t.map(n=>n.target.id));for(const n of i)if(!e.has(n.id))return n;return i[0]}function vd(i,t){const e=new Map;for(const c of i)e.set(c.id,[]);for(const c of t)e.get(c.from.id)||console.log(c),e.get(c.from.id).push(c.to);const n=new Map,r=new Map;function s(c,l=new Set){if(r.has(c))return new Set(r.get(c));const h=new Set;for(const d of e.get(c.id)??[])if(!l.has(d)){l.add(d),h.add(d);const u=s(d,l);for(const p of u)h.add(p)}return r.set(c,h),n.set(c,h.size),h}for(const c of i)n.has(c)||s(c);let o=null,a=-1;for(const c of i){const l=n.get(c)??0;l>a&&(a=l,o=c)}return o??i[0]}function yd(i,t){const e=new Map,n=new Map;for(const l of i)e.set(l.id,[]),n.set(l.id,0);for(const l of t)l.directed!==!1&&(e.get(l.from.id).push(l.to),n.set(l.to.id,(n.get(l.to.id)||0)+1));const r=[],s=i.filter(l=>n.get(l.id)===0);for(;s.length;){const l=s.shift();r.push(l);for(const h of e.get(l.id))n.set(h.id,n.get(h.id)-1),n.get(h.id)===0&&s.push(h)}if(r.length!==i.length)return console.warn("Graph has a cycle! Min-max distance root undefined."),i[0];const o=new Map;for(let l=r.length-1;l>=0;l--){const h=r[l];let d=0;for(const u of e.get(h.id))d=Math.max(d,1+(o.get(u.id)||0));o.set(h.id,d)}let a=null,c=1/0;for(const l of i){const h=o.get(l.id);hn.get(l.id)===0);for(;s.length;){const l=s.shift();r.push(l);for(const h of e.get(l.id))n.set(h.id,n.get(h.id)-1),n.get(h.id)===0&&s.push(h)}if(r.length!==i.length)return console.warn("Graph has a cycle! Cannot minimize DAG height."),i[0];const o=new Map;for(let l=r.length-1;l>=0;l--){const h=r[l];let d=0;for(const u of e.get(h.id))d=Math.max(d,1+(o.get(u.id)??0));o.set(h.id,d)}let a=null,c=1/0;for(const l of i){const h=o.get(l.id);h{const n=e.from;e.setFrom(e.to),e.setTo(n)}),t}setSizes(){const t=this.graph.renderer.getCanvas();if(!t)throw new Error("Canvas element is not defined in the graph renderer.");this.canvasBCR=t.getBoundingClientRect()}setNodePositions(t,e){for(const n of t){const r=this.graph.getMutableNode(n.data.id);if(r)if(e.radial){const s=n.x??0,o=n.y??0;r.x=o*Math.cos(s-Math.PI/2),r.y=o*Math.sin(s-Math.PI/2),r.fx=r.x,r.fy=r.y}else e.horizontal?(r.x=n.y,r.fx=n.y,r.y=n.x,delete r.fy):(r.x=n.x,r.y=n.y,r.fy=n.y,delete r.fx)}}unsetNodePositions(){this.graph.getMutableNodes().forEach(t=>{delete t.fy,delete t.fx})}registerForces(){const t=this.options.strength??.1;if(this.options.radial){const e=zr(n=>(this.levels[n.id]??1)*100,0,0).strength(t);this.simulation.force("tree-radial",e)}else this.simulation.force("tree-y",Rr(e=>{var n,r;return this.options.horizontal?((n=this.positionedNodesByID.get(e.id))==null?void 0:n.x)??0:((r=this.positionedNodesByID.get(e.id))==null?void 0:r.y)??0}).strength(t)),this.simulation.force("tree-x",Br(e=>{var n,r;return this.options.horizontal?((n=this.positionedNodesByID.get(e.id))==null?void 0:n.y)??0:((r=this.positionedNodesByID.get(e.id))==null?void 0:r.x)??0}).strength(t));lt.adjustOtherSimulationForces(this.simulationForces,this.options)}unregisterLayout(){this.unregisterForces(),this.unsetNodePositions()}unregisterForces(){this.simulation.force("tree-radial",null),this.simulation.force("tree-y",null),this.simulation.force("tree-x",null),lt.resetOtherSimulationForces(this.simulationForces,this.originalForceStrength)}static registerForcesOnSimulation(t,e,n,r,s,o,a=this){const c=se({},sn,s),l=c.strength??.1,h=o.width,d=o.height,u=[h/2,d/2];if(ke(t,e))return;const{levels:p}=a.buildLevels(t,e,void 0,c.rootIdAlgorithmFinder),{nodeById:f}=a.buildTree(t,e,c,o);if(c.radial){const m=zr(b=>(p[b.id]??1)*100,u[0],u[1]).strength(l);n.force("tree-radial",m)}else n.force("tree-y",Rr(m=>{var b,y;return c.horizontal?((b=f.get(m.id))==null?void 0:b.x)??0:((y=f.get(m.id))==null?void 0:y.y)??0}).strength(l)),n.force("tree-x",Br(m=>{var b,y;return c.horizontal?((b=f.get(m.id))==null?void 0:b.y)??0:((y=f.get(m.id))==null?void 0:y.x)??0}).strength(l));a.adjustOtherSimulationForces(r,c)}static adjustOtherSimulationForces(t,e){e!=null&&e.radial?(t.link.strength(0),t.charge.strength(0),t.center.strength(0),t.gravity.strength(0)):(t.link.strength(0),t.charge.strength(0),t.gravity.strength(1e-5),t.center.strength(1e-5))}static resetOtherSimulationForces(t,e){t.link.strength(e.link),t.charge.strength(e.charge),t.center.strength(e.center),t.gravity.strength(e.gravity)}static simulationDone(t,e,n,r){const s=se({},sn,r);for(const o of t)s.radial?(o.fx=o.x,o.fy=o.y):s.horizontal?(o.fx=o.x,delete o.fy):(o.fy=o.y,delete o.fx)}static buildTree(t,e,n,r){if(!t.length)return{root:null,nodes:[],nodeById:new Map};if(ke(t,e))return console.warn("Cycle detected in graph. Tree layout will not be computed."),{root:null,nodes:[],nodeById:new Map};const s=new Map;for(const m of t){const b=m;b.children=[],s.set(m.id,b)}for(const m of e){const b=s.get(m.source.id),y=s.get(m.target.id);b&&y&&(b.children.push(y),y.parent=b)}const o=n.rootId||lt.findRootId(t,e,n.rootIdAlgorithmFinder),a=s.get(o);if(!a)throw new Error(`Root node with id "${o}" not found.`);const c=n.radialGap,l=n.radial?2*Math.PI:r.width,h=n.radial?c:r.height,d=Ur();n.radial?d.size([l,h]):d.size([l,h]).separation((m,b)=>{var w,M;const y=((M=(w=m.parent)==null?void 0:w.children)==null?void 0:M.length)??1;return m.parent===b.parent?1.5/y:1.5});const u=ri(a),p=d(u),f=new Map;return p.descendants().forEach(m=>{f.set(m.data.id,m)}),{root:p,nodes:p.descendants(),nodeById:f}}static buildLevels(t,e,n,r){if(!t.length)return{levels:{},maxDepth:0,nodeCountPerLevel:{}};const s=n||lt.findRootId(t,e,r),o={[s]:0},a={};for(const u of t)a[u.id]=[];for(const{source:u,target:p}of e)a[u.id].push(p.id);const c=[s];let l=0;for(;l{var w,M;const y=((M=(w=m.parent)==null?void 0:w.children)==null?void 0:M.length)??1;return m.parent===b.parent?1.5/y:1.5});const u=ri(a),p=d(u),f=new Map;return p.descendants().forEach(m=>{f.set(m.data.id,m)}),{root:p,nodes:p.descendants(),nodeById:f}}}function xd(i=0,t=0,e=.001,n=()=>!0){let r=[];function s(){if(!r.length)return;let o=0,a=0,c=0;r.forEach((l,h)=>{n(l,h,r)&&(l.x==null||l.y==null||(o+=l.x,a+=l.y,c++))}),c&&(o=(o/c-i)*e,a=(a/c-t)*e,r.forEach((l,h)=>{n(l,h,r)&&(l.x==null||l.y==null||(l.x-=o,l.y-=a))}))}return s.initialize=o=>{r=o},s.x=function(o){return arguments.length?(i=o,s):i},s.y=function(o){return arguments.length?(t=o,s):t},s.strength=function(o){return arguments.length?(e=o,s):e},s.filter=function(o){return arguments.length?(n=o,s):n},s}const Xt={d3Alpha:1,d3AlphaMin:.001,d3AlphaDecay:.05,d3AlphaTarget:0,d3VelocityDecay:.45,d3LinkDistance:40,d3LinkStrength:null,d3ManyBodyStrength:-150,d3ManyBodyTheta:.9,d3CollideRadius:12,d3CollideStrength:1,d3CollideIterations:1,d3CenterStrength:1,d3GravityStrength:.01,enabled:!0,cooldownTime:2e3,useWorker:!0,warmupTicks:"auto",freezeNodesOnDrag:!0,layout:{type:"force"},callbacks:{onInit:()=>{},onStart:()=>{},onStop:()=>{},onTick:()=>{}}};class $t{constructor(t,e={}){g(this,"simulation");g(this,"graph");g(this,"canvas");g(this,"graphInteraction");g(this,"layout");g(this,"canvasBCR");g(this,"animationFrameId",null);g(this,"startSimulationTime",0);g(this,"engineRunning",!1);g(this,"slowTickThresholdReached",!1);g(this,"lastTickTime",0);g(this,"avgTickDuration",0);g(this,"SLOW_TICK_THRESHOLD",50);g(this,"dragInProgress",!1);g(this,"dragSelection",[]);g(this,"totalTickCount",0);g(this,"options");g(this,"callbacks");g(this,"simulationForces");g(this,"scaledForces",{d3ManyBodyStrength:Xt.d3ManyBodyStrength,d3CollideStrength:Xt.d3CollideStrength});if(this.graph=t,this.options=se({},Xt,e),this.callbacks=this.options.callbacks??{},this.canvas=this.graph.renderer.getCanvas(),!this.canvas)throw new Error("Canvas element is not defined in the graph renderer.");if(this.canvasBCR=this.canvas.getBoundingClientRect(),this.graphInteraction=this.graph.renderer.getGraphInteraction(),!this.graphInteraction)throw new Error("Graph interaction is not available.");const n=$t.initSimulationForces(this.options,this.canvasBCR);this.simulation=n.simulation,this.simulationForces=n.simulationForces,this.scaledForces.d3ManyBodyStrength=this.options.d3ManyBodyStrength||Xt.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=this.options.d3CollideStrength||Xt.d3CollideStrength,this.options.layout.type==="tree"?this.layout=new lt(this.graph,this.simulation,this.simulationForces,this.options.layout):this.options.layout.type==="egoTree"&&(this.layout=new wd(this.graph,this.simulation,this.simulationForces,this.options.layout)),this.callbacks.onInit&&this.callbacks.onInit(this)}static initSimulationForces(t,e){const n={link:hh(),charge:bh(),center:xd(),collide:lh(),gravity:Vh()},r=yh().force("link",n.link).force("charge",n.charge).force("center",n.center).force("collide",n.collide).force("gravity",n.gravity);return this.initSimulationForceCenter(n.center,t),this.initSimulationForceGravity(n.gravity,t,e),this.initSimulationForceLink(n.link,t),this.initSimulationForceCharge(n.charge,t),this.initSimulationForceCollide(n.collide,t),r.alphaMin(t.d3AlphaMin),r.alphaDecay(t.d3AlphaDecay),r.alphaTarget(0),r.velocityDecay(t.d3VelocityDecay),{simulation:r,simulationForces:n}}static initSimulationForceCenter(t,e){t.x(0).y(0).strength(.05).filter(n=>!n.isChild)}static initSimulationForceGravity(t,e,n){t.x(n.width/2).y(n.height/2).strength(r=>(r.degree()??0)===0?e.d3GravityStrength:0)}static initSimulationForceLink(t,e){t.distance(n=>{const r=qr(n);if(!r||r==="")return e.d3LinkDistance;const s=r.length*10;return Math.max(e.d3LinkDistance,s)}),e.d3LinkStrength&&t.strength(e.d3LinkStrength)}static initSimulationForceCharge(t,e){t.theta(e.d3ManyBodyTheta).strength(n=>{const r=n,s=e.d3ManyBodyStrength,o=r.getCircleRadius(),a=10+Math.sqrt(o-10);let c=r.weight??1;return c*=r.isParent?10:1,s*(a*a)/100*c})}static initSimulationForceCollide(t,e){t.radius(n=>{const r=n;return r.expanded?1.2*r.getCircleRadius()+20:r.getCircleRadius()?1.2*r.getCircleRadius():e.d3CollideRadius}).strength(e.d3CollideStrength)}static initSimulationForceClusterRadialConstraint(t,e){t.strength(e.d3CollideStrength)}update(){this.layout&&this.layout.update();const t=this.graph.getMutableNodes().filter(n=>n.visible);this.simulation.nodes(t);const e=this.simulation.force("link");e&&e.id(n=>n.id).links(this.getActiveEdges()),this.restart()}getActiveEdges(){const t=this.graph.getMutableEdges().filter(n=>{if(!n.visible)return!1;const r=n.source,s=n.target;return!(r.isChild||s.isChild)}),e=this.getClusterLinks();return[...t,...e]}getClusterLinks(){return this.graph.getMutableEdges().filter(e=>e.visible)}scaleSimulationOptions(){const t=$t.scaleSimulationOptions(this.options,this.canvasBCR,this.graph.getNodeCount());this.scaledForces.d3ManyBodyStrength=t.d3ManyBodyStrength??Xt.d3ManyBodyStrength,this.scaledForces.d3CollideStrength=t.d3CollideStrength??Xt.d3CollideStrength}static scaleSimulationOptions(t,e,n){const r=n/(e.width*e.height),s=Math.min(2,75e-6/r);return{d3ManyBodyStrength:t.d3ManyBodyStrength*s,d3CollideStrength:t.d3ManyBodyStrength*s}}applyScalledSimulationOptions(){$t.initSimulationForceCharge(this.simulationForces.charge,this.options),$t.initSimulationForceCollide(this.simulationForces.collide,this.options)}enable(){this.avgTickDuration=0,this.options.enabled=!0,this.start(!1)}disable(){this.options.enabled=!1,this.stop()}pause(){this.engineRunning=!1,this.slowTickThresholdReached=!1}restart(){this.startSimulationTime=new Date().getTime(),this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1}async start(t=!0){if(t&&await this.runSimulationWorkerRouter(),!this.options.enabled){this.engineRunning=!1;return}this.lastTickTime=performance.now(),this.engineRunning=!0,this.slowTickThresholdReached=!1,this.callbacks.onStart&&this.callbacks.onStart(this),this.animationFrameId===null&&this.startAnimationLoop()}stop(){this.engineRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.simulation.stop(),this.callbacks.onStop&&this.callbacks.onStop(this)}startAnimationLoop(){const t=()=>{this.animationFrameId=requestAnimationFrame(t),this.simulationTick()};this.engineRunning=!0,this.simulation.alpha(.01).restart(),this.animationFrameId=requestAnimationFrame(t)}simulationTick(){this.engineRunning&&(!this.dragInProgress&&(new Date().getTime()-this.startSimulationTime>this.options.cooldownTime||this.options.d3AlphaMin>0&&this.simulation.alpha()this.SLOW_TICK_THRESHOLD&&(this.slowTickThresholdReached=!0,this.disable(),(n=this.graph.UIManager.graphControls)==null||n.updatePhysicSimulationIndicator(!1),this.graph.UIManager.showNotification({level:"warning",title:"Physics engine running slow",message:"The physic has been disabled."}))}async waitForSimulationStop(){if(this.engineRunning)return new Promise(t=>{const e=this.callbacks.onStop;this.callbacks.onStop=n=>{e==null||e(n),this.callbacks.onStop=e,t()}})}isEnabled(){return this.options.enabled}async computeGraph(t={}){var h;const{runSimulation:e}=await Promise.resolve().then(()=>vf),n=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!n)return;const r=this.graph.getMutableNodes(),s=this.graph.getNodes().map(d=>(d.fx=void 0,d.fy=void 0,d)),o=this.graph.getEdges(),{callbacks:a,...c}=this.options;Object.assign(c,t);const{nodes:l}=e(s,o,c,n);l.forEach((d,u)=>{r[u].x=d.x,r[u].y=d.y,d.fx?r[u].fx=d.fx:r[u].fx=void 0,d.fy?r[u].fy=d.fy:r[u].fy=void 0}),this.graph.updateData(r,void 0,!1)}async runSimulationWorkerRouter(t={}){this.options.useWorker?await this.runSimulationWorker(t):(await this.computeGraph(t),this.graph.updateLayoutProgress(100,0,"done"))}async runSimulationWorker(t={}){var h;const e=(h=this.canvas)==null?void 0:h.getBoundingClientRect();if(!e)return;const n=this.graph.getMutableNodes(),r=this.graph.getNodes().map(d=>(d.fx=void 0,d.fy=void 0,d)),s=this.graph.getEdges(),o=(d,u)=>{this.graph.updateLayoutProgress(d,u,"simulation")},{callbacks:a,...c}=this.options;Object.assign(c,t);const{nodes:l}=await Uh(r,s,c,e,o);this.graph.updateLayoutProgress(100,0,"rendering"),l.forEach((d,u)=>{n[u].x=d.x,n[u].y=d.y,d.fx?n[u].fx=d.fx:n[u].fx=void 0,d.fy?n[u].fy=d.fy:n[u].fy=void 0}),this.graph.updateData(n,void 0,!1),this.graph.updateLayoutProgress(100,0,"done")}reheat(t=.7){this.restart(),this.simulation.alpha(t).restart()}createDragBehavior(){return Dc().on("start.draggedelement",(t,e)=>{this.graphInteraction.hasActiveMultiselection()?this.dragSelection=this.graphInteraction.getSelectedNodes().map(n=>{const{node:r}=n;return r.freeze(),{node:r,dx:r.x-e.x,dy:r.y-e.y}}):(this.dragSelection=[],e.freeze())}).on("drag.draggedelement",(t,e)=>{if(!this.dragInProgress&&this.isEnabled()&&(this.dragInProgress=!0,this.restart(),this.simulation.alphaTarget(.3).restart()),this.graphInteraction.hasActiveMultiselection()?this.dragSelection.forEach(({node:n,dx:r,dy:s})=>{n.fx=t.x+r,n.fy=t.y+s,n.x=t.x+r,n.y=t.y+s}):(e.fx=t.x,e.fy=t.y,e.x=t.x,e.y=t.y),this.graphInteraction.dragging(t.sourceEvent,t.subject),!this.engineRunning||!this.isEnabled()){const n=this.graphInteraction.hasActiveMultiselection()?this.dragSelection.map(r=>r.node):[e];this.graph.nextTickFor(n)}}).on("end.draggedelement",(t,e)=>{!t.active&&this.dragInProgress&&(this.dragInProgress=!1,this.restart(),this.simulation.alphaTarget(this.options.d3AlphaTarget).restart()),this.options.freezeNodesOnDrag||(this.graphInteraction.hasActiveMultiselection()?(this.dragSelection.forEach(({node:n})=>n.unfreeze()),this.dragSelection=[]):e.unfreeze()),this.graphInteraction.dragended(t.sourceEvent,t.subject)})}isDragging(){return this.dragInProgress}getForceSimulation(){return this.simulationForces}getSimulation(){return this.simulation}async changeLayout(t,e={}){var n;this.layout&&((n=this.layout)==null||n.unregisterLayout(),this.layout=void 0),e=e??{},e.layout=e.layout??{},e.layout.type=t,t==="force"?this.applyScalledSimulationOptions():t==="tree"&&(this.layout=new lt(this.graph,this.simulation,this.simulationForces,e.layout)),this.options.layout.type=t,this.update(),this.pause(),await this.runSimulationWorkerRouter(e),this.restart(),await this.waitForSimulationStop(),this.graph.renderer.fitAndCenter()}}const Cd='',Md='',Ed=' ',Sd=` - -`,_d=` - -`,kd=` - -`,Nd='',Ad='',Id='',on='',an='',ln='',cn='',hn='',dn='',Yr='',Xr='',Wr='',Td=` - -`,Ld=` - -`,Od=` - -`,oi=i=>` - - - - -`,Kr=i=>``,Pd=' ',Zr=``,Qr=` - -`,Dd='',Fd=` - - - - -`,zd=` - - - - -`,Bd='',Rd='',Hd='',$d='',Gd='',oe='',un='',qd='',Jr='',Vd='',pn='',ts='',es='',Ud='',jd='',Yd='',Xd='';function ae(i,t){if(Array.isArray(i)&&Array.isArray(t))return[...i,...t];if(typeof i=="object"&&typeof t=="object"&&i&&t){const e={...i};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(n in i?e[n]=ae(i[n],t[n]):e[n]=t[n]);return e}return t}const Wd={topbar:[{title:"Pin Nodes",svgIcon:oe,variant:"outline-primary",visible:!0,onclick(i,t){t.forEach(e=>{e.freeze()})}},{title:"Unpin Node",svgIcon:un,variant:"outline-primary",visible:!0,onclick(i,t){t.forEach(e=>{e.unfreeze(),this.uiManager.graph.simulation.reheat()})}},{title:"Hide Nodes",svgIcon:pn,variant:"outline-danger",visible:!0,flushRight:!0,onclick(i,t){t.forEach(e=>{this.uiManager.graph.queryEngine.excludeNode(e),this.uiManager.graph.renderer.getGraphInteraction().unselectAll()})}}],menu:[{text:"Expand Nodes",title:"Expand Node",svgIcon:es,variant:"outline-primary",visible:!1},{text:"Pin Nodes",title:"Pin Nodes",svgIcon:oe,variant:"outline-primary",visible:!0,onclick(i,t){t.forEach(e=>{e.freeze()})}}]};class Kd{constructor(t){g(this,"uiManager");g(this,"navigation");g(this,"selectionMenu");g(this,"layoutMenu");g(this,"selectionMenuShown",!1);g(this,"menuNode");g(this,"layoutTypeOptions",[{root:{id:"pvt-graphcontrols-simulation-toggle",class:"",title:"Toggle graph physic simulation",svgIcon:dn,onClick:()=>{this.togglePhysicSimulation()}},children:[{id:"pvt-graphcontrols-simulation-stop",class:"",title:"Stop graph physic simulation",svgIcon:Yr,onClick:()=>{this.togglePhysicSimulation(!1)}},{id:"pvt-graphcontrols-simulation-start",class:"",title:"Start graph physic simulation",svgIcon:dn,onClick:()=>{this.togglePhysicSimulation(!0)}}]},{root:{id:"pvt-graphcontrols-layout-organic",class:"",title:"Change Graph Layout to Organic",svgIcon:Ed,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force")}},children:[{id:"pvt-graphcontrols-layout-organic-5",class:"",title:"Run Organic Layout for 5 seconds. Or until it stabilises",svgIcon:Nd,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force",{cooldownTime:5e3})}},{id:"pvt-graphcontrols-layout-organic-10",class:"",title:"Run Organic Layout for 10 seconds. Or until it stabilises",svgIcon:Ad,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force",{cooldownTime:1e4})}},{id:"pvt-graphcontrols-layout-organic-15",class:"",title:"Run Organic Layout for 15 seconds. Or until it stabilises",svgIcon:Id,onClick:()=>{this.uiManager.graph.simulation.changeLayout("force",{cooldownTime:15e3})}}]},{root:{id:"pvt-graphcontrols-layout-tree-v",class:"pvt-graphcontrols-layout-tree-v-options",title:"Change Graph Layout to Vertical Tree",svgIcon:Sd,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1}})}},children:[{id:"pvt-graphcontrols-layout-tree-v-FirstZeroInDegree",class:"pvt-graphcontrols-layout-tree-v-options",title:"Pick the first valid 0 in-degree node",svgIcon:on,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"FirstZeroInDegree"}})}},{id:"pvt-graphcontrols-layout-tree-v-MaxReachability",class:"pvt-graphcontrols-layout-tree-v-options",title:"Pick the most connected node based on the reachability to others",svgIcon:an,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MaxReachability"}})}},{id:"pvt-graphcontrols-layout-tree-v-MinMaxDistance",class:"pvt-graphcontrols-layout-tree-v-options",title:"Minimize max distance by trying to balance subtree",svgIcon:ln,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MinMaxDistance"}})}},{id:"pvt-graphcontrols-layout-tree-v-MinHeight",class:"pvt-graphcontrols-layout-tree-v-options",title:"Pick node minimizing tree height",svgIcon:cn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MinHeight"}})}},{id:"pvt-graphcontrols-layout-tree-v-FlipEdgeDirection",class:"pvt-graphcontrols-layout-tree-v-options",title:"Flip the direction of all edges, then pick the most connected node based on the reachability to others",svgIcon:hn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!1,rootIdAlgorithmFinder:"MaxReachability",flipEdgeDirection:!0}})}}]},{root:{id:"pvt-graphcontrols-layout-tree-h",class:"pvt-graphcontrols-layout-tree-h-options",title:"Change Graph Layout to Horizontal Tree",svgIcon:_d,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0}})}},children:[{id:"pvt-graphcontrols-layout-tree-h-FirstZeroInDegree",class:"pvt-graphcontrols-layout-tree-h-options",title:"Pick the first valid 0 in-degree node",svgIcon:on,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"FirstZeroInDegree"}})}},{id:"pvt-graphcontrols-layout-tree-h-MaxReachability",class:"pvt-graphcontrols-layout-tree-h-options",title:"Pick the most connected node based on the reachability to others",svgIcon:an,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MaxReachability"}})}},{id:"pvt-graphcontrols-layout-tree-h-MinMaxDistance",class:"pvt-graphcontrols-layout-tree-h-options",title:"Minimize max distance by trying to balance subtree",svgIcon:ln,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MinMaxDistance"}})}},{id:"pvt-graphcontrols-layout-tree-h-MinHeight",class:"pvt-graphcontrols-layout-tree-h-options",title:"Pick node minimizing tree height",svgIcon:cn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MinHeight"}})}},{id:"pvt-graphcontrols-layout-tree-h-FlipEdgeDirection",class:"pvt-graphcontrols-layout-tree-h-options",title:"Flip the direction of all edges, then pick the most connected node based on the reachability to others",svgIcon:hn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{horizontal:!0,rootIdAlgorithmFinder:"MaxReachability",flipEdgeDirection:!0}})}}]},{root:{id:"pvt-graphcontrols-layout-tree-r",class:"pvt-graphcontrols-layout-tree-r-options",title:"Change Graph Layout to Radial Tree",svgIcon:kd,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0}})}},children:[{id:"pvt-graphcontrols-layout-tree-r-FirstZeroInDegree",class:"pvt-graphcontrols-layout-tree-r-options",title:"Pick the first valid 0 in-degree node",svgIcon:on,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"FirstZeroInDegree"}})}},{id:"pvt-graphcontrols-layout-tree-r-MaxReachability",class:"pvt-graphcontrols-layout-tree-r-options",title:"Pick the most connected node based on the reachability to others",svgIcon:an,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MaxReachability"}})}},{id:"pvt-graphcontrols-layout-tree-r-MinMaxDistance",class:"pvt-graphcontrols-layout-tree-r-options",title:"Minimize max distance by trying to balance subtree",svgIcon:ln,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MinMaxDistance"}})}},{id:"pvt-graphcontrols-layout-tree-r-MinHeight",class:"pvt-graphcontrols-layout-tree-r-options",title:"Pick node minimizing tree height",svgIcon:cn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MinHeight"}})}},{id:"pvt-graphcontrols-layout-tree-r-FlipEdgeDirection",class:"pvt-graphcontrols-layout-tree-r-options",title:"Flip the direction of all edges, then pick the most connected node based on the reachability to others",svgIcon:hn,onClick:()=>{this.uiManager.graph.simulation.changeLayout("tree",{layout:{radial:!0,rootIdAlgorithmFinder:"MaxReachability",flipEdgeDirection:!0}})}}]}]);this.uiManager=t,this.menuNode=ae(Wd,this.uiManager.getOptions().selectionMenu.menuNode??{})}mount(t){if(!t)return;const e=document.createElement("template");e.innerHTML=` -
-
-
-
-
-
-
-
-`,this.navigation=e.content.firstElementChild,t.appendChild(this.navigation)}destroy(){var t;(t=this.navigation)==null||t.remove(),this.navigation=void 0}afterMount(){this.navigation&&(this.selectionMenu=this.navigation.querySelector(".pvt-graphcontrols-selection"),this.layoutMenu=this.navigation.querySelector(".pvt-graphcontrols-layout"),this.createLayoutOptionAndBind(this.layoutTypeOptions))}graphReady(){if(!this.navigation)return;const t=this.uiManager.graph.getNodes(),e=this.uiManager.graph.getEdges();ke(t,e)?(this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-v-options").forEach(n=>{n.setAttribute("disabled","disabled"),n.setAttribute("data-old-title",n.getAttribute("title")??""),n.setAttribute("title","The graph contains a cycle, so it cannot be displayed as a tree.")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-h-options").forEach(n=>{n.setAttribute("disabled","disabled"),n.setAttribute("data-old-title",n.getAttribute("title")??""),n.setAttribute("title","The graph contains a cycle, so it cannot be displayed as a tree.")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-r-options").forEach(n=>{n.setAttribute("disabled","disabled"),n.setAttribute("data-old-title",n.getAttribute("title")??""),n.setAttribute("title","The graph contains a cycle, so it cannot be displayed as a tree.")})):(this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-v-options").forEach(n=>{n.removeAttribute("disabled"),n.setAttribute("title",n.getAttribute("data-old-title")??"")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-h-options").forEach(n=>{n.removeAttribute("disabled"),n.setAttribute("title",n.getAttribute("data-old-title")??"")}),this.navigation.querySelectorAll(".pvt-graphcontrols-layout-tree-r-options").forEach(n=>{n.removeAttribute("disabled"),n.setAttribute("title",n.getAttribute("data-old-title")??"")})),this.uiManager.graph.renderer.getGraphInteraction().on("selectNodes",n=>{this.populateNodeSelectionContainer(n),this.showSelectionMenu()}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectNodes",()=>{this.hideSelectionMenu(),setTimeout(this.clearSelectionContainer,200)})}showSelectionMenu(){this.selectionMenuShown||this.selectionMenu&&(this.selectionMenu.classList.add("shown"),this.selectionMenuShown=!0)}hideSelectionMenu(){this.selectionMenuShown&&this.selectionMenu&&(this.selectionMenu.classList.remove("shown"),this.selectionMenuShown=!1)}populateNodeSelectionContainer(t){if(!this.navigation||!this.selectionMenu)return;const e=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-title"),n=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-topbar"),r=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-mainmenu"),s=this.getNodesFromSelection(t);e.innerHTML="",n.innerHTML="",r.innerHTML="",e.textContent=`${s.length} nodes selected`,n.appendChild(De(this,this.menuNode.topbar,s)),r.appendChild(Fe(this,this.menuNode.menu,s))}clearSelectionContainer(){if(!this.navigation||!this.selectionMenu)return;const t=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-title"),e=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-topbar"),n=this.selectionMenu.querySelector(".pvt-graphcontrols-selection-mainmenu");t.innerHTML="",e.innerHTML="",n.innerHTML=""}getNodesFromSelection(t){return t.map(e=>{const{node:n}=e;return n})}createLayoutOptionAndBind(t){t.forEach((e,n)=>{if(!this.layoutMenu)return;n>0&&this.layoutMenu.appendChild(O("div",{class:"pivotick-divider"},[]));const r=e.root,s=e.children,o=O("div",{},[this.createLayoutOption(r)]),a=this.createLayoutOptionMenu(s),c=O("div",{class:"pvt-graphcontrols-layout-type-container"},[o,a]);this.layoutMenu.appendChild(c);const l=c.querySelector(`#${r.id}`);l&&typeof r.onClick=="function"&&l.addEventListener("click",r.onClick),s.forEach(h=>{const d=a.querySelector(`#${h.id}`);d&&typeof h.onClick=="function"&&d.addEventListener("click",h.onClick)})})}createLayoutOptionMenu(t){const e=O("div",{class:["pvt-graphcontrols-layout-type-options"]});return t.forEach(n=>{const r=this.createLayoutOption(n);e.appendChild(r)}),e}createLayoutOption(t){return O("button",{id:t.id,class:t.class,title:t.title},[t.html?t.html():j({svgIcon:t.svgIcon})])}togglePhysicSimulation(t){const e=this.uiManager.graph.simulation;if(!e)return;t??!e.isEnabled()?(e.enable(),this.updatePhysicSimulationIndicator(!0)):(this.updatePhysicSimulationIndicator(!1),e.disable())}updatePhysicSimulationIndicator(t){const e=this.layoutMenu.querySelector("#pvt-graphcontrols-simulation-toggle"),n=e.querySelector(".pvt-icon");!e||!n||(t?n.outerHTML=j({svgIcon:dn}).outerHTML:n.outerHTML=j({svgIcon:Yr}).outerHTML)}}class Zd{constructor(t){g(this,"uiManager");g(this,"navigation");this.uiManager=t}mount(t){if(!t)return;const e=document.createElement("template");e.innerHTML=` -
-
- -
-
- -
- -
-
-`,this.navigation=e.content.firstElementChild,t.appendChild(this.navigation)}destroy(){var t;(t=this.navigation)==null||t.remove(),this.navigation=void 0}afterMount(){if(!this.navigation)return;const t=this.navigation.querySelector("#pvt-graphnavigation-zoom-in"),e=this.navigation.querySelector("#pvt-graphnavigation-zoom-out"),n=this.navigation.querySelector("#pvt-graphnavigation-reset");t==null||t.addEventListener("click",()=>{this.uiManager.graph.renderer.zoomIn()}),e==null||e.addEventListener("click",()=>{this.uiManager.graph.renderer.zoomOut()}),n==null||n.addEventListener("click",()=>{this.uiManager.graph.renderer.fitAndCenter()})}graphReady(){}}class Qd{constructor(){g(this,"layout");g(this,"canvas");g(this,"sidebar");g(this,"toolbar");g(this,"notification");g(this,"modal");g(this,"slidePanel");g(this,"graphnavigation");g(this,"graphcontrols")}mount(t,e="full"){this.layout=document.createElement("div"),this.layout.className=`pvt-layout mode-${e}`,this.canvas=document.createElement("div"),this.canvas.className="pvt-canvas",this.layout.appendChild(this.canvas),this.notification=document.createElement("div"),this.notification.className="pvt-notification",this.canvas.appendChild(this.notification),e==="full"&&(this.sidebar=document.createElement("div"),this.sidebar.className="pvt-sidebar",this.layout.appendChild(this.sidebar)),(e==="light"||e==="full")&&(this.toolbar=document.createElement("div"),this.toolbar.className="pvt-toolbar",this.layout.appendChild(this.toolbar),this.modal=document.createElement("div"),this.modal.className="pvt-modalcontainer",t.appendChild(this.modal),this.slidePanel=document.createElement("div"),this.slidePanel.className="pvt-slidepanel-container",this.canvas.appendChild(this.slidePanel)),e!=="static"&&(this.graphnavigation=document.createElement("div"),this.graphnavigation.className="pvt-graphnavigation",this.canvas.appendChild(this.graphnavigation),this.graphcontrols=document.createElement("div"),this.graphcontrols.className="pvt-graphcontrols",this.canvas.appendChild(this.graphcontrols)),t.appendChild(this.layout)}destroy(){var t;(t=this.layout)==null||t.remove(),this.layout=void 0}afterMount(){}graphReady(){}}class Jd{constructor(t){g(this,"uiManager");g(this,"panel");g(this,"renderCb");this.uiManager=t,this.renderCb=typeof this.uiManager.getOptions().mainHeader.render=="function"?this.uiManager.getOptions().mainHeader.render:void 0}mount(t){t&&(this.panel=t)}destroy(){var t;(t=this.panel)==null||t.remove(),this.panel=void 0}afterMount(){this.clearOverview()}graphReady(){this.clearOverview()}renderCustomContent(t){var n;if(!this.panel||!this.renderCb)return;this.panel.innerHTML="";const e=_t(this.renderCb,t);e&&((n=this.panel)==null||n.appendChild(e))}clearOverview(){if(this.panel){if(this.renderCb){this.renderCustomContent(null);return}this.panel.innerHTML="",this.showTotalNodeCount()}}updateNodeOverview(t,e){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t);return}this.panel.innerHTML="";const n=42,r=` -
-
- -
-
-
-
-
-
-
-
`,s=st(r),o=s.querySelector(".pvt-mainheader-icon"),a=s.querySelector(".pvt-mainheader-nodeinfo-name"),c=s.querySelector(".pvt-mainheader-nodeinfo-subtitle");if(o&&e&&e instanceof SVGGElement){const l=e.cloneNode(!0),h=e.getBBox(),d=n/Math.max(h.width,h.height);l.setAttribute("transform",`translate(${(n-h.width*d)/2-h.x*d}, ${(n-h.height*d)/2-h.y*d}) scale(${d})`),o.appendChild(l)}if(a&&(a.textContent=Yt(t,this.uiManager.getOptions().mainHeader)),c){const l=$r(t,this.uiManager.getOptions().mainHeader);c.textContent=l??""}this.panel.appendChild(s),requestAnimationFrame(()=>{var l,h;(h=(l=this.panel)==null?void 0:l.firstElementChild)==null||h.classList.add("enter-active")})}updateEdgeOverview(t){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t);return}this.panel.innerHTML="";const n=`
-
- ${oi(42)} -
-
-
-
-
-
-
-
`,r=st(n),s=r.querySelector(".pvt-mainheader-nodeinfo-name"),o=r.querySelector(".pvt-mainheader-nodeinfo-subtitle");s&&(s.textContent=Ee(t,this.uiManager.getOptions().mainHeader)),o&&(o.textContent=Gr(t,this.uiManager.getOptions().mainHeader)),this.panel.appendChild(r),requestAnimationFrame(()=>{var a,c;(c=(a=this.panel)==null?void 0:a.firstElementChild)==null||c.classList.add("enter-active")})}updateNodesOverview(t){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t.map(c=>c.node));return}this.panel.innerHTML="";const e=42,n=`
-
- -
-
-
-
-
-
-
-
`,r=st(n),s=r.querySelector(".pvt-mainheader-icon"),o=r.querySelector(".pvt-mainheader-nodeinfo-name"),a=r.querySelector(".pvt-mainheader-nodeinfo-subtitle");if(s){const c=Kr(e),l=st(c);s.appendChild(l)}o&&(o.textContent=`${t.length} nodes selected`),a&&(a.textContent=`Out of ${this.uiManager.graph.getNodeCount()} total`),this.panel.appendChild(r),requestAnimationFrame(()=>{var c,l;(l=(c=this.panel)==null?void 0:c.firstElementChild)==null||l.classList.add("enter-active")})}updateEdgesOverview(t){if(!this.panel)return;if(this.renderCb){this.renderCustomContent(t.map(a=>a.edge));return}this.panel.innerHTML="";const n=`
-
- ${oi(42)} -
-
-
-
-
-
-
-
`,r=st(n),s=r.querySelector(".pvt-mainheader-nodeinfo-name"),o=r.querySelector(".pvt-mainheader-nodeinfo-subtitle");s&&(s.textContent=`${t.length} edges selected`),o&&(o.textContent=`Out of ${this.uiManager.graph.getEdgeCount()} total`),this.panel.appendChild(r),requestAnimationFrame(()=>{var a,c;(c=(a=this.panel)==null?void 0:a.firstElementChild)==null||c.classList.add("enter-active")})}showTotalNodeCount(){if(!this.panel)return;const t=this.uiManager.graph.getMutableVisibleNodes().length,e=this.uiManager.graph.getMutableVisibleEdges().length;this.panel.textContent=`Showing ${t} nodes and ${e} edges`}}function tu(i,t){const e=t>0?i/t*100:0,n=document.createElement("span");n.style.display="flex",n.style.alignItems="center",n.style.gap="0.5rem",n.style.fontFamily="sans-serif",n.style.fontSize="0.85rem",n.title=`${i} - ${e.toFixed(0)}%`;const r=document.createElement("span");r.classList.add("pivotick-inline-bar-container"),n.appendChild(r);const s=document.createElement("span");return s.classList.add("pivotick-inline-bar-fill"),s.style.width=`${e}%`,s.style.backgroundSize=`${100/(e/100)}% 100%`,r.appendChild(s),n}const fn="4dfd89de5d25fc9cc4b66c23d84b443af631c7dc",eu=6;function gn(i,t,e){const n=ru(i),r=document.createElement("div");for(const[s,o]of n){const a=O("div",{class:"pvt-aggregated-property-section"}),c=O("span",{class:"pvt-aggregated-property-title"},[`.${s}`]),l=O("div",{class:"pvt-aggregated-property-container"});let h=0;for(const[d,u]of o){if(h>=10){const m=O("div",{},[O("div",{style:"text-align: center; font-weight: 300; font-size: 0.9rem; color: var(--pvt-text-color-5);"},[`... ${o.size-h} more`])]);l.append(m);break}let p="";e&&(p=mn(d)?"":e(s,d));const f=O("div",{class:"pvt-aggregated-property-row"},[O("span",{class:["pvt-aggregated-property-value",mn(d)?"":"code-container"]},[O("span",{},[nu(iu(d),u),p])]),O("span",{class:"pvt-aggregated-property-count"},[tu(u,t)])]);l.append(f),h++}a.appendChild(c),a.appendChild(l),r.appendChild(a)}return r}function iu(i){return typeof i=="string"?i:JSON.stringify(i)}function nu(i,t){if(mn(i)){let e="",n="";return is(i)?(e="- empty -",n="The value is empty"):ns(i)&&(e=`- ${t} other unique values -`,n="All other values are unique"),O("span",{class:"pvt-aggregated-property-value-dim",title:n},[e])}return document.createTextNode(i)}function is(i){return i.length===0}function ns(i){return i===fn}function mn(i){return is(i)||ns(i)}function rs(i){const t=new Map;return i.forEach(e=>{e.forEach(n=>{if((typeof n.name=="string"||typeof n.name=="number"||typeof n.name=="boolean")&&(typeof n.value=="string"||typeof n.value=="number"||typeof n.value=="boolean")){t.has(n.name)||t.set(n.name,new Map);const r=t.get(n.name),s=r.get(n.value)||0;r.set(n.value,s+1)}})}),t}function ru(i,t=!0){const e=new Map;for(const[o,a]of i.entries()){const c=Array.from(a.entries()).sort((l,h)=>h[1]-l[1]);e.set(o,new Map(c))}const n=Array.from(e.entries()).sort((o,a)=>o[1].size-a[1].size),r=new Map(n);if(!t)return r;const s=new Map;for(const[o,a]of r)for(const[c,l]of a){s.has(o)||s.set(o,new Map);const h=s.get(o);if(a.size>eu&&l===1){const d=h.get(fn)||0;h.set(fn,d+1)}else h.set(c,l)}return s}class su{constructor(t){g(this,"uiManager");g(this,"panel");g(this,"header");g(this,"body");g(this,"renderCb");this.uiManager=t,this.renderCb=typeof this.uiManager.getOptions().propertiesPanel.render=="function"?this.uiManager.getOptions().propertiesPanel.render:void 0}mount(t){if(!t)return;const e=` -
-
-
-
`;this.panel=st(e),this.header=this.panel.querySelector(".pvt-properties-header-panel"),this.body=this.panel.querySelector(".pvt-properties-body-panel"),t.appendChild(this.panel)}destroy(){var t;(t=this.panel)==null||t.remove(),this.panel=void 0}afterMount(){this.clearProperties()}clearProperties(){if(this.body){if(this.renderCb){this.renderCustomContent(null);return}this.body.innerHTML="",this.hidePanel()}}graphReady(){}renderCustomContent(t){var n;if(!this.body||!this.renderCb)return;this.body.innerHTML="";const e=_t(this.renderCb,t);e&&((n=this.body)==null||n.appendChild(e))}setHeaderBasicNode(){this.header.textContent="Basic Node Properties"}setHeaderBasicEdge(){this.header.textContent="Basic Edge Properties"}setHeaderMultiSelectNode(){this.header.textContent="Aggregated Node Properties"}setHeaderMultiSelectEdge(){this.header.textContent="Aggregated Edge Properties"}showPanel(){this.panel.classList.add("enter-active")}hidePanel(){this.panel.classList.remove("enter-active")}updateNodeProperties(t){if(!this.body)return;if(this.setHeaderBasicNode(),this.showPanel(),this.renderCb){this.renderCustomContent(t);return}const n=st(` -
-
-
-
`),r=n.querySelector(".dl-container");if(r){const s=tn(t,this.uiManager.getOptions().propertiesPanel);r.append(Pe(s,t))}this.body.innerHTML="",this.body.appendChild(n)}updateEdgeProperties(t){if(!this.body)return;if(this.setHeaderBasicEdge(),this.showPanel(),this.renderCb){this.renderCustomContent(t);return}const n=st(` -
-
-
-
`),r=n.querySelector(".dl-container");if(r){const s=en(t,this.uiManager.getOptions().propertiesPanel);r.append(Pe(s,t))}this.body.innerHTML="",this.body.appendChild(n)}updateNodesProperties(t){if(!this.body)return;if(this.setHeaderMultiSelectNode(),this.showPanel(),this.renderCb){this.renderCustomContent(t.map(s=>s.node));return}const n=st(` -
-
-
-
-
`),r=n.querySelector("div.pvt-aggregated-properties");if(r){const s=[];t.forEach(c=>{const{node:l}=c,h=tn(l,this.uiManager.getOptions().propertiesPanel);s.push(h)});const o=rs(s),a=gn(o,t.length,this.genActionButtons.bind(this));r.appendChild(a)}this.body.innerHTML="",this.body.appendChild(n)}updateEdgesProperties(t){if(!this.body)return;if(this.setHeaderMultiSelectEdge(),this.showPanel(),this.renderCb){this.renderCustomContent(t.map(s=>s.edge));return}const n=st(` -
-
-
-
-
`),r=n.querySelector("div.pvt-aggregated-properties");if(r){const s=[];t.forEach(c=>{const{edge:l}=c,h=en(l,this.uiManager.getOptions().propertiesPanel);s.push(h)});const o=rs(s),a=gn(o,t.length,this.genActionButtons.bind(this));r.appendChild(a)}this.body.innerHTML="",this.body.appendChild(n)}genActionButtons(t,e){const n=O("button",{title:"Select Similar"},[j({svgIcon:Wr})]);n.addEventListener("click",()=>{const o=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes().filter(a=>a.node.getData()[t]!=e);this.uiManager.graph.renderer.getGraphInteraction().removeNodesFromSelection(o)});const r=O("button",{title:"Exclude Similar"},[j({svgIcon:Xr})]);return r.addEventListener("click",()=>{const o=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes().filter(a=>a.node.getData()[t]==e);this.uiManager.graph.renderer.getGraphInteraction().removeNodesFromSelection(o)}),O("div",{class:"pvt-aggregated-property-actions"},[n,r])}}class ou{constructor(t){g(this,"uiManager");g(this,"panelContainer");g(this,"panels");g(this,"allPanels",[]);this.uiManager=t,this.panels=this.uiManager.getOptions().extraPanels}mount(t){t&&(this.panelContainer=t)}destroy(){var t;(t=this.panelContainer)==null||t.remove(),this.panelContainer=void 0,this.allPanels=[]}afterMount(){this.mountPanels(),this.panels.forEach((t,e)=>{t.alwaysVisible===!0&&this.showPanel(this.allPanels[e])})}updateNode(t){this.showAll()}updateEdge(t){this.showAll()}updateNodes(t){this.showAll()}updateEdges(t){this.showAll()}clear(){this.hideAll()}showAll(){this.allPanels.forEach(t=>{this.showPanel(t)})}hideAll(){this.allPanels.forEach((t,e)=>{this.panels[e].alwaysVisible!==!0&&this.hidePanel(t)})}showPanel(t){t.classList.add("enter-active")}hidePanel(t){t.classList.remove("enter-active")}mountPanels(){this.panelContainer&&this.panels.forEach(t=>[this.mountPanel(t)])}mountPanel(t){if(!this.panelContainer)return;const n=st(` -
-
-
-
`),r=n.querySelector(".pivotick-extrapanel-header-panel"),s=n.querySelector(".pivotick-extrapanel-body-panel"),o=_t(t.title,null);o&&r.appendChild(o);const a=_t(t.render,null);a&&s.appendChild(a),this.allPanels.push(n),this.panelContainer.appendChild(n)}graphReady(){}}function au(i,t,e,n){const r=document.createElement("div");r.className="pivotick-tabs";const s=document.createElement("div");s.className="pivotick-tab-controls";const o=document.createElement("div");o.className="pivotick-tab-panels",n&&e?(n.appendChild(s),e.appendChild(o)):e?e.appendChild(r):r.append(s,o);function a(l){const h=l.id;o.querySelectorAll("[data-tab-panel]").forEach(p=>p.style.display="none"),s.querySelectorAll(".pivotick-button").forEach(p=>{p.classList.toggle("pivotick-button-primary",!1),p.classList.toggle("pivotick-button-outline-secondary",!0)});const d=o.querySelector(`[data-tab-panel="${h}"]`),u=s.querySelector(`[data-tab-control="${h}"]`);d&&(d.style.display="block"),u&&(u.classList.remove("pivotick-button-outline-secondary"),u.classList.add("pivotick-button-primary")),requestAnimationFrame(()=>{l.onShown&&(l==null||l.onShown())})}i.forEach(l=>{const h=vt({text:l.label,variant:"outline-secondary","data-tab-control":l.id,onclick:()=>a(l)});s.appendChild(h);const d=document.createElement("div");d.dataset.tabPanel=l.id,d.style.display="none",d.appendChild(l.content),o.appendChild(d)});const c=i[0];return a(c),n&&e?o:r}function ss(i){i.variant=i.variant??"primary";const{variant:t,size:e,iconUnicode:n,iconClass:r,svgIcon:s,imagePath:o,text:a,html:c,...l}=i,h=document.createElement("span");h.classList.add("pivotick-badge"),h.classList.add(`pivotick-badge-${t}`),e&&h.classList.add(`pivotick-badge-${e}`);for(const[p,f]of Object.entries(l))p==="class"?Array.isArray(f)?h.classList.add(...f):h.classList.add(String(f)):p in h?h[p]=f:h.setAttribute(p,String(f));let d;n&&(d=j({iconUnicode:n})),r&&(d=j({iconClass:r})),s&&(d=j({svgIcon:s})),o&&(d=j({imagePath:o})),d&&h.append(d);const u=document.createElement("text");return a&&(d&&(d.style.marginRight="0.1em"),u.textContent=a),h.append(u),c&&h.appendChild(c),h}class lu{constructor(t){g(this,"uiManager");g(this,"panel");g(this,"header");g(this,"body");g(this,"neighborCount");g(this,"egographContainer");g(this,"statContainer");g(this,"listContainer");g(this,"egoGraph");g(this,"renderCb");this.uiManager=t,this.renderCb=typeof this.uiManager.getOptions().neighborsPanel.render=="function"?this.uiManager.getOptions().neighborsPanel.render:void 0}mount(t){if(!t)return;const e=` -
-
-
-
`;this.panel=st(e),this.header=this.panel.querySelector(".pvt-neighbors-header-panel"),this.body=this.panel.querySelector(".pvt-neighbors-body-panel"),this.neighborCount=O("div",{class:"pvt-neighbors-count"}),t.appendChild(this.panel),this.egographContainer=O("div",{class:"main-egograph-container"},["Egograph here"]),this.statContainer=O("div",{class:"main-stats-container"},["Stats here"]),this.listContainer=O("div",{class:"main-list-container"},["List here"]);const n=au([{id:"egograph",label:"Neighbor Graph",content:this.egographContainer,onShown:()=>{requestAnimationFrame(async()=>{this.egoGraph&&(await this.egoGraph.simulation.start(),await this.egoGraph.simulation.waitForSimulationStop(),this.egoGraph.renderer.fitAndCenter())})}},{id:"stats",label:"Stats",content:this.statContainer},{id:"list",label:"List",content:this.listContainer}],void 0,this.body,this.header);n.style.height="100%",this.body.appendChild(this.neighborCount)}destroy(){var t;(t=this.panel)==null||t.remove(),this.panel=void 0}afterMount(){this.clearNeighbors()}clearNeighbors(){if(this.body){if(this.renderCb){this.renderCustomContent(null);return}this.renderCb?this.body.innerHTML="":this.egographContainer&&this.statContainer&&this.listContainer&&(this.egographContainer.innerHTML="",this.statContainer.innerHTML="",this.listContainer.innerHTML=""),this.hidePanel()}}graphReady(){}renderCustomContent(t){var n;if(!this.body||!this.renderCb)return;this.body.innerHTML="";const e=_t(this.renderCb,t);e&&((n=this.body)==null||n.appendChild(e))}showPanel(){this.panel.classList.add("enter-active")}hidePanel(){this.panel.classList.remove("enter-active")}updateNodeNeighbors(t){if(this.showPanel(),!this.neighborCount)return;if(this.renderCb){this.renderCustomContent(t);return}this.buildEgoGraph(t),this.buildList(t),this.buildStats(t);const e=t.degree(),n=e>1?`${e} connections`:"1 connection";this.neighborCount.textContent=n}updateEdgeNeighbors(t){if(this.showPanel(),this.renderCb){this.renderCustomContent(t);return}}updateNodesNeighbors(t){if(this.showPanel(),!this.neighborCount)return;if(this.renderCb){this.renderCustomContent(t.map(s=>s.node));return}if(t.length<=1)return;const e=this.mergeNodesIntoNode(t.map(s=>s.node));this.buildEgoGraph(e,!1),this.buildList(e),this.buildStats(e);const n=e.degree(),r=n>1?`${n} connections`:"1 connection";this.neighborCount.textContent=r}updateEdgesNeighbors(t){if(this.showPanel(),this.renderCb){this.renderCustomContent(t.map(e=>e.edge));return}}buildEgoGraph(t,e=!0){if(!this.egographContainer)return;this.egographContainer.innerHTML="",this.egoGraph&&this.egoGraph.destroy(),this.egographContainer.style.visibility="hidden";const n=new Map;for(const l of[t,...t.getConnectedNodes(),...t.getConnectingNodes()])n.set(l.id.toString(),l);const r=[...t.getEdgesOut(),...t.getEdgesIn()],s=new Map;r.forEach(l=>{!l||l.id==null||s.set(l.id.toString(),l)}),n.forEach(l=>{l.getEdgesOut().forEach(h=>{const d=h.to;n.has(d.id.toString())&&d.id!==t.id&&s.set(h.id.toString(),h)})});const a={nodes:[...n.values()].filter(l=>{var h;return l.getDeepestNodeClone()===void 0?!0:((h=l.getDeepestNodeClone())==null?void 0:h.visible)??!1}).map(l=>l.toDict(!0)),edges:[...s.values()].map(l=>l.toDict())},c={UI:{mode:"viewer",tooltip:{enabled:!1,allowPinning:!1},contextMenu:{enabled:!1},navigation:{enabled:!1}},layout:{type:"egoTree",radial:!0,radialGap:120,rootId:t.id},render:{...this.uiManager.graph.getOptions().render,dragEnabled:!1,enableFocusMode:!1,enableNodeExpansion:!1,interactionEnabled:!0,zoomEnabled:!1,zoomAnimationDuration:100},simulation:{useWorker:!1,warmupTicks:0,cooldownTime:0},callbacks:{onNodeHoverIn:(l,h)=>{const d=this.uiManager.graph.getMutableNode(h.id);d&&this.uiManager.graph.highlightElement(d)},onNodeHoverOut:(l,h)=>{const d=this.uiManager.graph.getMutableNode(h.id);d&&this.uiManager.graph.unHighlightElement(d)}}};this.egoGraph=new ft(this.egographContainer,a,c),this.egoGraph.on("ready",()=>{setTimeout(()=>{this.egographContainer.style.visibility="visible"},20),e&&this.egoGraph.selectElement(this.egoGraph.getMutableNode(t.id))})}buildList(t){if(!this.listContainer)return;this.listContainer.innerHTML="";const e=26,n=[...t.getEdgesOut(),...t.getEdgesIn()];n.sort((s,o)=>{const a=s.from.id===t.id?s.to:s.from,c=o.from.id===t.id?o.to:o.from,l=Yt(a,this.uiManager.getOptions().mainHeader),h=Yt(c,this.uiManager.getOptions().mainHeader);return l.localeCompare(h)});const r=O("div",{class:""});for(const s of n){const o=s.from.id===t.id,a=o?s.to:s.from,c=Ee(s,this.uiManager.getOptions().mainHeader)||"",l=j(o?{svgIcon:$d}:{svgIcon:Hd});l.classList.add("edge"),l.classList.add(o?"edge-out":"edge-in"),l.setAttribute("title",o?"Outgoing edge":"Incoming edge");const h=Yt(a,this.uiManager.getOptions().mainHeader),d=document.createElement("template");d.innerHTML=` -
- - - - ${h} -
`;const u=d.content.firstElementChild,p=u.querySelector(".pvt-neighbors-list__nodepreview .pvt-mainheader-icon")??void 0,f=a.getGraphElement();if(p&&f&&f instanceof SVGGElement){const w=f.cloneNode(!0),M=f.getBBox(),C=e/Math.max(M.width,M.height);w.setAttribute("transform",`translate(${(e-M.width*C)/2-M.x*C}, ${(e-M.height*C)/2-M.y*C}) scale(${C})`),p.appendChild(w)}const m=ss({text:c||"- empty -",size:"sm",variant:"secondary",class:["pvt-neighbor-edge-description",c||"empty-label"]}),y=O("div",{class:"edge-details"},[l,u,m]);r.appendChild(y)}this.listContainer.appendChild(r)}buildStats(t){if(!this.statContainer)return;this.statContainer.innerHTML="";const e=O("dl",{class:"pvt-property-list"}),n=O("dl",{class:"pvt-property-row"},[O("dt",{class:"pvt-property-name",title:"Total connections",style:"font-size: 1em;"},["Degree"]),O("dd",{class:"pvt-property-value",style:"display: flex; align-items: center; font-size: 1em;"},[O("span",{style:"margin-right: 8px;"},[t.degree().toString()]),O("span",{style:"display: inline-flex; align-items: center; margin-right: 8px; color: var(--pvt-text-color-secondary)",title:"Outgoing edges"},[j({svgIcon:Yd}),t.getEdgesOut().length.toString()]),O("span",{style:"display: inline-flex; align-items: center; color: var(--pvt-text-color-secondary)",title:"Incoming edges"},[j({svgIcon:Xd}),t.getEdgesIn().length.toString()])])]);e.append(n);const r=O("div",{class:"core-stats"},[e]),s=new Map;[...t.getEdgesOut(),...t.getEdgesIn()].forEach(h=>{const d=Ee(h,this.uiManager.getOptions().mainHeader)||"",u=s.get(d)||0;s.set(d,u+1)});const a=new Map;a.set("Label",s);const c=gn(a,t.degree(),this.genActionButtonsSingleSelection.bind(this)),l=O("div",{class:"aggregated-labels"},[c]);this.statContainer.appendChild(r),this.statContainer.appendChild(l)}genActionButtonsSingleSelection(t,e){const n=O("button",{title:"Select nodes linked with this label"},[j({svgIcon:Wr})]);n.addEventListener("click",()=>{const o=this.getNodesMatchingFilteredEdgeName(e);o&&(this.uiManager.graph.renderer.getGraphInteraction().clearNodeSelectionList(),o.length>1?this.uiManager.graph.renderer.getGraphInteraction().selectNodes(o):this.uiManager.graph.renderer.getGraphInteraction().selectNode(o[0].element,o[0].node))});const r=O("button",{title:"Exclude nodes linked with this label"},[j({svgIcon:Xr})]);return r.addEventListener("click",()=>{const o=this.getNodesMatchingFilteredEdgeName(e,!0);o&&(this.uiManager.graph.renderer.getGraphInteraction().clearNodeSelectionList(),o.length>1?this.uiManager.graph.renderer.getGraphInteraction().selectNodes(o):this.uiManager.graph.renderer.getGraphInteraction().selectNode(o[0].element,o[0].node))}),O("div",{class:"pvt-aggregated-property-actions"},[n,r])}getNodesMatchingFilteredEdgeName(t,e=!1){const n=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNode();if(!n)return;const r=n.node,s=[...r.getEdgesOut(),...r.getEdgesIn()],o=new Map;return s.filter(a=>{const c=Ee(a,this.uiManager.getOptions().mainHeader);return e?c!==t:c===t}).forEach(a=>{const c=r===a.from?a.to:a.from;o.set(c.id.toString(),c)}),[...o.values()].map(a=>({node:a,element:a.getGraphElement()}))}mergeNodesIntoNode(t){const e={size:50,shape:"square",color:"transparent",strokeColor:"transparent",html:l=>{const d=l.getData().aggregated_node_count,u=j({svgIcon:Kr(28)});return u.style="position: absolute;",st(`
- ${u.outerHTML} -
-
+${d}
-
Group
-
-
`)}},n={label:`${t.length} nodes`,aggregated_node_count:t.length},r=new yt("aggregated-node",n,e);r.weight=10;const s=new Set(t.map(l=>l.id.toString())),o=t.flatMap(l=>[...l.getEdgesOut(),...l.getEdgesIn()]),a=[],c=[];for(const l of o){const h=s.has(l.from.id),d=s.has(l.to.id);h!==d&&(h?a.push(l):c.push(l))}return a.forEach((l,h)=>{const d=l.to.clone();new bt(`outgoing-${h}`,r,d,l.getData(),l.getStyle())}),c.forEach((l,h)=>{const d=l.from.clone();new bt(`incoming-${h}`,d,r,l.getData(),l.getStyle())}),r}}class cu{constructor(t){g(this,"uiManager");g(this,"sidebar");g(this,"sidebarOpen",!0);g(this,"sidebarMainHeader");g(this,"sidebarProperties");g(this,"sidebarNeighbors");g(this,"extraPanelManager");g(this,"mainHeaderPanel");g(this,"mainBodyPanel");g(this,"neighborPanel");g(this,"extraPanelContainer");g(this,"collapse");this.uiManager=t,this.sidebarMainHeader=new Jd(this.uiManager),this.sidebarProperties=new su(this.uiManager),this.sidebarNeighbors=new lu(this.uiManager),this.extraPanelManager=new ou(this.uiManager)}mount(t){if(!t)return;const e=` -
-
-
-
-
-
-
-
-
`;this.sidebar=st(e),t.appendChild(this.sidebar)}destroy(){var t;this.sidebarMainHeader.destroy(),this.sidebarProperties.destroy(),(t=this.sidebar)==null||t.remove(),this.sidebar=void 0}afterMount(){var t,e;this.sidebar&&(this.mainHeaderPanel=this.sidebar.querySelector(".pvt-mainheader-panel")??void 0,this.sidebarMainHeader.mount(this.mainHeaderPanel),this.mainBodyPanel=this.sidebar.querySelector(".pvt-properties-panel")??void 0,this.sidebarProperties.mount(this.mainBodyPanel),this.neighborPanel=this.sidebar.querySelector(".pvt-neighbor-panel")??void 0,this.sidebarNeighbors.mount(this.neighborPanel),this.extraPanelContainer=this.sidebar.querySelector(".pvt-extra-panel")??void 0,this.extraPanelManager.mount(this.extraPanelContainer),this.collapse=O("span",{class:"pvt-sidebar-collapse-container"},[O("span",{class:"pvt-sidebar-collapse-button pvt-sidebar-collapse-button-collapse"},[j({svgIcon:Md})]),O("span",{class:"pvt-sidebar-collapse-button pvt-sidebar-collapse-button-expand"},[j({svgIcon:Cd})])]),this.sidebar.parentElement.appendChild(this.collapse),((e=(t=this.uiManager.getOptions())==null?void 0:t.sidebar)==null?void 0:e.collapsed)===!0?this.hideSidebar():this.showSidebar(),this.sidebarMainHeader.afterMount(),this.sidebarProperties.afterMount(),this.sidebarNeighbors.afterMount(),this.extraPanelManager.afterMount())}graphReady(){var t;this.sidebarMainHeader.graphReady(),this.sidebarProperties.graphReady(),this.sidebarNeighbors.graphReady(),this.extraPanelManager.graphReady(),this.uiManager.graph.renderer.getGraphInteraction().on("selectNode",(e,n)=>{this.sidebarMainHeader.updateNodeOverview(e,n),this.sidebarProperties.updateNodeProperties(e),this.sidebarNeighbors.updateNodeNeighbors(e),this.extraPanelManager.updateNode(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectNode",()=>{this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear()}),this.uiManager.graph.renderer.getGraphInteraction().on("selectEdge",e=>{this.sidebarMainHeader.updateEdgeOverview(e),this.sidebarProperties.updateEdgeProperties(e),this.sidebarNeighbors.updateEdgeNeighbors(e),this.extraPanelManager.updateEdge(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectEdge",()=>{this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear()}),this.uiManager.graph.renderer.getGraphInteraction().on("selectNodes",e=>{const n=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes();this.sidebarMainHeader.updateNodesOverview(n),this.sidebarProperties.updateNodesProperties(n),this.sidebarNeighbors.updateNodesNeighbors(n),this.extraPanelManager.updateNodes(n)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectNodes",()=>{const e=this.uiManager.graph.renderer.getGraphInteraction().getSelectedNodes();e.length>0?(this.sidebarMainHeader.updateNodesOverview(e),this.sidebarProperties.updateNodesProperties(e),this.sidebarNeighbors.updateNodesNeighbors(e),this.extraPanelManager.updateNodes(e)):(this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear())}),this.uiManager.graph.renderer.getGraphInteraction().on("selectEdges",e=>{this.sidebarMainHeader.updateEdgesOverview(e),this.sidebarProperties.updateEdgesProperties(e),this.sidebarNeighbors.updateEdgesNeighbors(e),this.extraPanelManager.updateEdges(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("unselectEdges",()=>{this.sidebarMainHeader.clearOverview(),this.sidebarProperties.clearProperties(),this.sidebarNeighbors.clearNeighbors(),this.extraPanelManager.clear()}),(t=this.collapse)==null||t.addEventListener("click",()=>{this.toggleSidebar()})}toggleSidebar(){this.sidebar.closest(".pvt-sidebar").classList.toggle("pvt-sidebar-collapsed",this.sidebarOpen),this.sidebarOpen=!this.sidebarOpen}showSidebar(){this.sidebar.closest(".pvt-sidebar").classList.remove("pvt-sidebar-collapsed"),this.sidebarOpen=!0}hideSidebar(){this.sidebar.closest(".pvt-sidebar").classList.add("pvt-sidebar-collapsed"),this.sidebarOpen=!1}}class hu{constructor(t,e={}){g(this,"uiManager");g(this,"options");g(this,"slidePanel");g(this,"header");g(this,"body");g(this,"isOpen",!1);g(this,"DEFAULT_HEADER",null);g(this,"DEFAULT_BODY","- empty panel -");this.uiManager=t,this.options=e,this.options.header||(this.options.header=this.DEFAULT_HEADER),this.options.body||(this.options.body=this.DEFAULT_BODY)}mount(t){if(!t)return;const e=document.createElement("template");if(e.innerHTML=` -
-
-`,this.slidePanel=e.content.firstElementChild,this.slidePanel.innerHTML="",this.options.header!=null){this.header=document.createElement("div"),this.header.className="pvt-slide-panel__header",this.setHeader(this.options.header),this.slidePanel.appendChild(this.header);const n=vt({text:"×",onClick:()=>{this.close()},id:"pvt-sidePanel-close",class:"pvt-close-button",style:"margin-left: auto;"});this.header.appendChild(n)}this.body=document.createElement("div"),this.body.className="pvt-slide-panel__content",this.setBody(this.options.body),this.slidePanel.appendChild(this.body),this.options.noBodyPadding?this.body.style.padding="0":this.body.style.padding="",t.appendChild(this.slidePanel)}destroy(){var t;(t=this.slidePanel)==null||t.remove(),this.slidePanel=void 0}afterMount(){}graphReady(){}open(){var t;this.isOpen=!0,(t=this.slidePanel)==null||t.classList.add("open")}close(){var t;this.isOpen=!1,(t=this.slidePanel)==null||t.classList.remove("open")}toggle(){this.isOpen?this.close():this.open()}setHeader(t){this.header&&(this.header.innerHTML="",t&&(this.options.header instanceof HTMLElement?this.header.appendChild(this.options.header):this.options.rawHeader?this.header.innerHTML=this.options.header:this.header.textContent=this.options.header))}setBody(t){this.body&&(this.body.innerHTML="",t&&(t instanceof HTMLElement?this.body.appendChild(t):this.options.rawBody?this.body.innerHTML=t:this.body.textContent=t))}}class du{constructor(t){g(this,"uiManager");g(this,"searchBox");g(this,"searchInput");g(this,"searchResultsContainer");g(this,"searchSummaryContainer");g(this,"results");g(this,"highlightedIndex",0);g(this,"MAX_RESULT_COUNT",12);this.uiManager=t}mount(t){t&&(this.searchBox=this.build(),t.appendChild(this.searchBox))}build(){var e,n;const t=document.createElement("template");return t.innerHTML=` - -`,this.searchBox=t.content.firstElementChild,this.searchInput=this.searchBox.querySelector("#pvt-search-input")??void 0,this.searchResultsContainer=this.searchBox.querySelector(".pvt-search-results")??void 0,this.searchSummaryContainer=this.searchBox.querySelector(".pvt-search-summary")??void 0,(e=this.searchInput)==null||e.addEventListener("input",()=>{this.searchAndShowResults(this.searchInput.value),this.updateHighlight()}),(n=this.searchInput)==null||n.addEventListener("keydown",r=>{var o;if(r.key=="Escape"){this.dispatchEvent("pvt-searchbox-close");return}if(!this.results||this.results.length<1)return;const s=Math.min(this.MAX_RESULT_COUNT,this.results.length);switch(r.key){case"ArrowDown":r.preventDefault(),this.highlightedIndex=(this.highlightedIndex+1)%s,this.updateHighlight();break;case"ArrowUp":r.preventDefault(),this.highlightedIndex=(this.highlightedIndex-1+s)%s,this.updateHighlight();break;case"Enter":if(r.preventDefault(),this.highlightedIndex>=0){const a=(o=this.searchResultsContainer)==null?void 0:o.children[this.highlightedIndex];a==null||a.click()}break}}),this.searchBox}destroy(){var t;(t=this.searchBox)==null||t.remove(),this.searchBox=void 0}afterMount(){}graphReady(){}buildResult(t){const n=document.createElement("template");n.innerHTML=` -
-
-
- -
-
-
-
-
-
-
-
-`;const r=t[0],s=t[1],o=n.content.firstElementChild,a=o.querySelector(".pvt-search-result__nodepreview .pvt-mainheader-icon")??void 0,c=o.querySelector(".pvt-search-result__name")??void 0,l=o.querySelector(".pvt-search-result__info_key")??void 0,h=o.querySelector(".pvt-search-result__info_value")??void 0;o.addEventListener("click",()=>{this.clickHandler(r)});const d=r.getGraphElement();if(d&&d instanceof SVGGElement){const u=d.cloneNode(!0),p=d.getBBox(),f=30/Math.max(p.width,p.height);u.setAttribute("transform",`translate(${(30-p.width*f)/2-p.x*f}, ${(30-p.height*f)/2-p.y*f}) scale(${f})`),a.appendChild(u)}return c.textContent=Yt(r,this.uiManager.getOptions().mainHeader),l.textContent=`.${s.key}: `,h.textContent=s.value,o}updateHighlight(){!this.results||!this.searchResultsContainer||this.results.forEach((t,e)=>{var r;const n=(r=this.searchResultsContainer)==null?void 0:r.children[e];n&&(e===this.highlightedIndex?n.classList.add("active"):n.classList.remove("active"))})}search(t){const e=[],n=t.trim().toLowerCase();if(!(!n||n.length<2)){for(const r of this.uiManager.graph.getMutableNodes()){const s=r.getData();for(const o in s){const a=s[o];if(a==null)continue;const c=String(a).toLowerCase();let l=n.startsWith('"')?n.slice(1):n;const h=n.startsWith('"')&&n.endsWith('"');if(h&&(l=l.slice(0,-1).trim()),h?c===l:c.includes(l)){const u={key:o,value:String(a)};e.push([r,u]);break}}}return e}}clickHandler(t){this.dispatchEvent("pvt-searchbox-select",t)}searchAndShowResults(t){if(!(!this.searchResultsContainer||!this.searchSummaryContainer)&&(this.results=void 0,this.searchResultsContainer.innerHTML="",this.searchSummaryContainer.innerHTML="",this.results=this.search(t),this.results)){const e=[];for(const n of this.results){if(e.length>=this.MAX_RESULT_COUNT)break;e.push(this.buildResult(n))}e.forEach(n=>{var r;(r=this.searchResultsContainer)==null||r.appendChild(n)}),this.searchSummaryContainer.appendChild(this.createSummary())}}createSummary(){if(!this.results)return document.createElement("div");let t="";this.results.length===0?t="No results found":this.results.length>this.MAX_RESULT_COUNT?t=`Showing top ${this.MAX_RESULT_COUNT} of ${this.results.length} results`:t=`${this.results.length} results`;const e=document.createElement("template");return e.innerHTML=` -
- ${t} -
-`,e.content.firstElementChild}dispatchEvent(t,e){if(!this.searchBox)return;const n=new CustomEvent(t,{detail:e,bubbles:!0,cancelable:!0});this.searchBox.dispatchEvent(n)}}function vn(i,t){i.split(/\s+/).forEach(e=>{t(e)})}class uu{constructor(){this._events={}}on(t,e){vn(t,n=>{const r=this._events[n]||[];r.push(e),this._events[n]=r})}off(t,e){var n=arguments.length;if(n===0){this._events={};return}vn(t,r=>{if(n===1){delete this._events[r];return}const s=this._events[r];s!==void 0&&(s.splice(s.indexOf(e),1),this._events[r]=s)})}trigger(t,...e){var n=this;vn(t,r=>{const s=n._events[r];s!==void 0&&s.forEach(o=>{o.apply(n,e)})})}}function pu(i){return i.plugins={},class extends i{constructor(){super(...arguments),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(t,e){i.plugins[t]={name:t,fn:e}}initializePlugins(t){var e,n;const r=this,s=[];if(Array.isArray(t))t.forEach(o=>{typeof o=="string"?s.push(o):(r.plugins.settings[o.name]=o.options,s.push(o.name))});else if(t)for(e in t)t.hasOwnProperty(e)&&(r.plugins.settings[e]=t[e],s.push(e));for(;n=s.shift();)r.require(n)}loadPlugin(t){var e=this,n=e.plugins,r=i.plugins[t];if(!i.plugins.hasOwnProperty(t))throw new Error('Unable to find "'+t+'" plugin');n.requested[t]=!0,n.loaded[t]=r.fn.apply(e,[e.plugins.settings[t]||{}]),n.names.push(t)}require(t){var e=this,n=e.plugins;if(!e.plugins.loaded.hasOwnProperty(t)){if(n.requested[t])throw new Error('Plugin has circular dependency ("'+t+'")');e.loadPlugin(t)}return n.loaded[t]}}}const ai=i=>(i=i.filter(Boolean),i.length<2?i[0]||"":gu(i)==1?"["+i.join("")+"]":"(?:"+i.join("|")+")"),os=i=>{if(!fu(i))return i.join("");let t="",e=0;const n=()=>{e>1&&(t+="{"+e+"}")};return i.forEach((r,s)=>{if(r===i[s-1]){e++;return}n(),t+=r,e=1}),n(),t},as=i=>{let t=Array.from(i);return ai(t)},fu=i=>new Set(i).size!==i.length,Ne=i=>(i+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),gu=i=>i.reduce((t,e)=>Math.max(t,mu(e)),0),mu=i=>Array.from(i).length,ls=i=>{if(i.length===1)return[[i]];let t=[];const e=i.substring(1);return ls(e).forEach(function(r){let s=r.slice(0);s[0]=i.charAt(0)+s[0],t.push(s),s=r.slice(0),s.unshift(i.charAt(0)),t.push(s)}),t},vu=[[0,65535]],yu="[̀-ͯ·ʾʼ]";let li,cs;const bu=3,yn={},hs={"/":"⁄∕",0:"߀",a:"ⱥɐɑ",aa:"ꜳ",ae:"æǽǣ",ao:"ꜵ",au:"ꜷ",av:"ꜹꜻ",ay:"ꜽ",b:"ƀɓƃ",c:"ꜿƈȼↄ",d:"đɗɖᴅƌꮷԁɦ",e:"ɛǝᴇɇ",f:"ꝼƒ",g:"ǥɠꞡᵹꝿɢ",h:"ħⱨⱶɥ",i:"ɨı",j:"ɉȷ",k:"ƙⱪꝁꝃꝅꞣ",l:"łƚɫⱡꝉꝇꞁɭ",m:"ɱɯϻ",n:"ꞥƞɲꞑᴎлԉ",o:"øǿɔɵꝋꝍᴑ",oe:"œ",oi:"ƣ",oo:"ꝏ",ou:"ȣ",p:"ƥᵽꝑꝓꝕρ",q:"ꝗꝙɋ",r:"ɍɽꝛꞧꞃ",s:"ßȿꞩꞅʂ",t:"ŧƭʈⱦꞇ",th:"þ",tz:"ꜩ",u:"ʉ",v:"ʋꝟʌ",vy:"ꝡ",w:"ⱳ",y:"ƴɏỿ",z:"ƶȥɀⱬꝣ",hv:"ƕ"};for(let i in hs){let t=hs[i]||"";for(let e=0;e{li===void 0&&(li=Su(vu))},ds=(i,t="NFKD")=>i.normalize(t),ci=i=>Array.from(i).reduce((t,e)=>t+Cu(e),""),Cu=i=>(i=ds(i).toLowerCase().replace(wu,t=>yn[t]||""),ds(i,"NFC"));function*Mu(i){for(const[t,e]of i)for(let n=t;n<=e;n++){let r=String.fromCharCode(n),s=ci(r);s!=r.toLowerCase()&&(s.length>bu||s.length!=0&&(yield{folded:s,composed:r,code_point:n}))}}const Eu=i=>{const t={},e=(n,r)=>{const s=t[n]||new Set,o=new RegExp("^"+as(s)+"$","iu");r.match(o)||(s.add(Ne(r)),t[n]=s)};for(let n of Mu(i))e(n.folded,n.folded),e(n.folded,n.composed);return t},Su=i=>{const t=Eu(i),e={};let n=[];for(let s in t){let o=t[s];o&&(e[s]=as(o)),s.length>1&&n.push(Ne(s))}n.sort((s,o)=>o.length-s.length);const r=ai(n);return cs=new RegExp("^"+r,"u"),e},_u=(i,t=1)=>{let e=0;return i=i.map(n=>(li[n]&&(e+=n.length),li[n]||n)),e>=t?os(i):""},ku=(i,t=1)=>(t=Math.max(t,i.length-1),ai(ls(i).map(e=>_u(e,t)))),us=(i,t=!0)=>{let e=i.length>1?1:0;return ai(i.map(n=>{let r=[];const s=t?n.length():n.length()-1;for(let o=0;o{for(const e of t){if(e.start!=i.start||e.end!=i.end||e.substrs.join("")!==i.substrs.join(""))continue;let n=i.parts;const r=o=>{for(const a of n){if(a.start===o.start&&a.substr===o.substr)return!1;if(!(o.length==1||a.length==1)&&(o.starta.start||a.starto.start))return!0}return!1};if(!(e.parts.filter(r).length>0))return!0}return!1};class hi{constructor(){g(this,"parts");g(this,"substrs");g(this,"start");g(this,"end");this.parts=[],this.substrs=[],this.start=0,this.end=0}add(t){t&&(this.parts.push(t),this.substrs.push(t.substr),this.start=Math.min(t.start,this.start),this.end=Math.max(t.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(t,e){let n=new hi,r=JSON.parse(JSON.stringify(this.parts)),s=r.pop();for(const c of r)n.add(c);let o=e.substr.substring(0,t-s.start),a=o.length;return n.add({start:s.start,end:s.start+a,length:a,substr:o}),n}}const Au=i=>{xu(),i=ci(i);let t="",e=[new hi];for(let n=0;n0){c=c.sort((h,d)=>h.length()-d.length());for(let h of c)Nu(h,e)||e.push(h);continue}if(n>0&&l.size==1&&!l.has("3")){t+=us(e,!1);let h=new hi;const d=e[0];d&&h.add(d.last()),e=[h]}}return t+=us(e,!0),t},Iu=(i,t)=>{if(i)return i[t]},Tu=(i,t)=>{if(i){for(var e,n=t.split(".");(e=n.shift())&&(i=i[e]););return i}},bn=(i,t,e)=>{var n,r;return!i||(i=i+"",t.regex==null)||(r=i.search(t.regex),r===-1)?0:(n=t.string.length/i.length,r===0&&(n+=.5),n*e)},wn=(i,t)=>{var e=i[t];if(typeof e=="function")return e;e&&!Array.isArray(e)&&(i[t]=[e])},di=(i,t)=>{if(Array.isArray(i))i.forEach(t);else for(var e in i)i.hasOwnProperty(e)&&t(i[e],e)},Lu=(i,t)=>typeof i=="number"&&typeof t=="number"?i>t?1:it?1:t>i?-1:0);class Ou{constructor(t,e){g(this,"items");g(this,"settings");this.items=t,this.settings=e||{diacritics:!0}}tokenize(t,e,n){if(!t||!t.length)return[];const r=[],s=t.split(/\s+/);var o;return n&&(o=new RegExp("^("+Object.keys(n).map(Ne).join("|")+"):(.*)$")),s.forEach(a=>{let c,l=null,h=null;o&&(c=a.match(o))&&(l=c[1],a=c[2]),a.length>0&&(this.settings.diacritics?h=Au(a)||null:h=Ne(a),h&&e&&(h="\\b"+h)),r.push({string:a,regex:h?new RegExp(h,"iu"):null,field:l})}),r}getScoreFunction(t,e){var n=this.prepareSearch(t,e);return this._getScoreFunction(n)}_getScoreFunction(t){const e=t.tokens,n=e.length;if(!n)return function(){return 0};const r=t.options.fields,s=t.weights,o=r.length,a=t.getAttrFn;if(!o)return function(){return 1};const c=(function(){return o===1?function(l,h){const d=r[0].field;return bn(a(h,d),l,s[d]||1)}:function(l,h){var d=0;if(l.field){const u=a(h,l.field);!l.regex&&u?d+=1/o:d+=bn(u,l,1)}else di(s,(u,p)=>{d+=bn(a(h,p),l,u)});return d/o}})();return n===1?function(l){return c(e[0],l)}:t.options.conjunction==="and"?function(l){var h,d=0;for(let u of e){if(h=c(u,l),h<=0)return 0;d+=h}return d/n}:function(l){var h=0;return di(e,d=>{h+=c(d,l)}),h/n}}getSortFunction(t,e){var n=this.prepareSearch(t,e);return this._getSortFunction(n)}_getSortFunction(t){var e,n=[];const r=this,s=t.options,o=!t.query&&s.sort_empty?s.sort_empty:s.sort;if(typeof o=="function")return o.bind(this);const a=function(l,h){return l==="$score"?h.score:t.getAttrFn(r.items[h.id],l)};if(o)for(let l of o)(t.query||l.field!=="$score")&&n.push(l);if(t.query){e=!0;for(let l of n)if(l.field==="$score"){e=!1;break}e&&n.unshift({field:"$score",direction:"desc"})}else n=n.filter(l=>l.field!=="$score");return n.length?function(l,h){var d,u;for(let p of n)if(u=p.field,d=(p.direction==="desc"?-1:1)*Lu(a(u,l),a(u,h)),d)return d;return 0}:null}prepareSearch(t,e){const n={};var r=Object.assign({},e);if(wn(r,"sort"),wn(r,"sort_empty"),r.fields){wn(r,"fields");const s=[];r.fields.forEach(o=>{typeof o=="string"&&(o={field:o,weight:1}),s.push(o),n[o.field]="weight"in o?o.weight:1}),r.fields=s}return{options:r,query:t.toLowerCase().trim(),tokens:this.tokenize(t,r.respect_word_boundaries,n),total:0,items:[],weights:n,getAttrFn:r.nesting?Tu:Iu}}search(t,e){var n=this,r,s;s=this.prepareSearch(t,e),e=s.options,t=s.query;const o=e.score||n._getScoreFunction(s);t.length?di(n.items,(c,l)=>{r=o(c),(e.filter===!1||r>0)&&s.items.push({score:r,id:l})}):di(n.items,(c,l)=>{s.items.push({score:1,id:l})});const a=n._getSortFunction(s);return a&&s.items.sort(a),s.total=s.items.length,typeof e.limit=="number"&&(s.items=s.items.slice(0,e.limit)),s}}const At=i=>typeof i>"u"||i===null?null:ui(i),ui=i=>typeof i=="boolean"?i?"1":"0":i+"",xn=i=>(i+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Pu=(i,t)=>t>0?window.setTimeout(i,t):(i.call(null),null),Du=(i,t)=>{var e;return function(n,r){var s=this;e&&(s.loading=Math.max(s.loading-1,0),clearTimeout(e)),e=setTimeout(function(){e=null,s.loadedSearches[n]=!0,i.call(s,n,r)},t)}},ps=(i,t,e)=>{var n,r=i.trigger,s={};i.trigger=function(){var o=arguments[0];if(t.indexOf(o)!==-1)s[o]=arguments;else return r.apply(i,arguments)},e.apply(i,[]),i.trigger=r;for(n of t)n in s&&r.apply(i,s[n])},Fu=i=>({start:i.selectionStart||0,length:(i.selectionEnd||0)-(i.selectionStart||0)}),tt=(i,t=!1)=>{i&&(i.preventDefault(),t&&i.stopPropagation())},pt=(i,t,e,n)=>{i.addEventListener(t,e,n)},Wt=(i,t)=>{if(!t||!t[i])return!1;var e=(t.altKey?1:0)+(t.ctrlKey?1:0)+(t.shiftKey?1:0)+(t.metaKey?1:0);return e===1},Cn=(i,t)=>{const e=i.getAttribute("id");return e||(i.setAttribute("id",t),t)},fs=i=>i.replace(/[\\"']/g,"\\$&"),Kt=(i,t)=>{t&&i.append(t)},ot=(i,t)=>{if(Array.isArray(i))i.forEach(t);else for(var e in i)i.hasOwnProperty(e)&&t(i[e],e)},Ot=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(gs(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},gs=i=>typeof i=="string"&&i.indexOf("<")>-1,zu=i=>i.replace(/['"\\]/g,"\\$&"),Mn=(i,t)=>{var e=document.createEvent("HTMLEvents");e.initEvent(t,!0,!1),i.dispatchEvent(e)},pi=(i,t)=>{Object.assign(i.style,t)},Mt=(i,...t)=>{var e=ms(t);i=vs(i),i.map(n=>{e.map(r=>{n.classList.add(r)})})},Gt=(i,...t)=>{var e=ms(t);i=vs(i),i.map(n=>{e.map(r=>{n.classList.remove(r)})})},ms=i=>{var t=[];return ot(i,e=>{typeof e=="string"&&(e=e.trim().split(/[\t\n\f\r\s]/)),Array.isArray(e)&&(t=t.concat(e))}),t.filter(Boolean)},vs=i=>(Array.isArray(i)||(i=[i]),i),En=(i,t,e)=>{if(!(e&&!e.contains(i)))for(;i&&i.matches;){if(i.matches(t))return i;i=i.parentNode}},ys=(i,t=0)=>t>0?i[i.length-1]:i[0],Bu=i=>Object.keys(i).length===0,bs=(i,t)=>{if(!i)return-1;t=t||i.nodeName;for(var e=0;i=i.previousElementSibling;)i.matches(t)&&e++;return e},X=(i,t)=>{ot(t,(e,n)=>{e==null?i.removeAttribute(n):i.setAttribute(n,""+e)})},Sn=(i,t)=>{i.parentNode&&i.parentNode.replaceChild(t,i)},Ru=(i,t)=>{if(t===null)return;if(typeof t=="string"){if(!t.length)return;t=new RegExp(t,"i")}const e=s=>{var o=s.data.match(t);if(o&&s.data.length>0){var a=document.createElement("span");a.className="highlight";var c=s.splitText(o.index);c.splitText(o[0].length);var l=c.cloneNode(!0);return a.appendChild(l),Sn(c,a),1}return 0},n=s=>{s.nodeType===1&&s.childNodes&&!/(script|style)/i.test(s.tagName)&&(s.className!=="highlight"||s.tagName!=="SPAN")&&Array.from(s.childNodes).forEach(o=>{r(o)})},r=s=>s.nodeType===3?e(s):(n(s),0);r(i)},Hu=i=>{var t=i.querySelectorAll("span.highlight");Array.prototype.forEach.call(t,function(e){var n=e.parentNode;n.replaceChild(e.firstChild,e),n.normalize()})},$u=65,Gu=13,qu=27,Vu=37,Uu=38,ju=39,Yu=40,ws=8,Xu=46,xs=9,fi=(typeof navigator>"u"?!1:/Mac/.test(navigator.userAgent))?"metaKey":"ctrlKey",Cs={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:null,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,shouldOpen:null,maxOptions:50,maxItems:null,hideSelected:null,duplicates:!1,addPrecedence:!1,selectOnTab:!1,preload:null,allowEmptyOption:!1,refreshThrottle:300,loadThrottle:300,loadingClass:"loading",dataAttr:null,optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"ts-wrapper",controlClass:"ts-control",dropdownClass:"ts-dropdown",dropdownContentClass:"ts-dropdown-content",itemClass:"item",optionClass:"option",dropdownParent:null,controlInput:'',copyClassesToDropdown:!1,placeholder:null,hidePlaceholder:null,shouldLoad:function(i){return i.length>0},render:{}};function Ms(i,t){var e=Object.assign({},Cs,t),n=e.dataAttr,r=e.labelField,s=e.valueField,o=e.disabledField,a=e.optgroupField,c=e.optgroupLabelField,l=e.optgroupValueField,h=i.tagName.toLowerCase(),d=i.getAttribute("placeholder")||i.getAttribute("data-placeholder");if(!d&&!e.allowEmptyOption){let m=i.querySelector('option[value=""]');m&&(d=m.textContent)}var u={placeholder:d,options:[],optgroups:[],items:[],maxItems:null},p=()=>{var m,b=u.options,y={},w=1;let M=0;var C=k=>{var A=Object.assign({},k.dataset),I=n&&A[n];return typeof I=="string"&&I.length&&(A=Object.assign(A,JSON.parse(I))),A},N=(k,A)=>{var I=At(k.value);if(I!=null&&!(!I&&!e.allowEmptyOption)){if(y.hasOwnProperty(I)){if(A){var z=y[I][a];z?Array.isArray(z)?z.push(A):y[I][a]=[z,A]:y[I][a]=A}}else{var F=C(k);F[r]=F[r]||k.textContent,F[s]=F[s]||I,F[o]=F[o]||k.disabled,F[a]=F[a]||A,F.$option=k,F.$order=F.$order||++M,y[I]=F,b.push(F)}k.selected&&u.items.push(I)}},P=k=>{var A,I;I=C(k),I[c]=I[c]||k.getAttribute("label")||"",I[l]=I[l]||w++,I[o]=I[o]||k.disabled,I.$order=I.$order||++M,u.optgroups.push(I),A=I[l],ot(k.children,z=>{N(z,A)})};u.maxItems=i.hasAttribute("multiple")?null:1,ot(i.children,k=>{m=k.tagName.toLowerCase(),m==="optgroup"?P(k):m==="option"&&N(k)})},f=()=>{const m=i.getAttribute(n);if(m)u.options=JSON.parse(m),ot(u.options,y=>{u.items.push(y[s])});else{var b=i.value.trim()||"";if(!e.allowEmptyOption&&!b.length)return;const y=b.split(e.delimiter);ot(y,w=>{const M={};M[r]=w,M[s]=w,u.options.push(M)}),u.items=y}};return h==="select"?p():f(),Object.assign({},Cs,u,t)}var Es=0;class ct extends pu(uu){constructor(t,e){super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,Es++;var n,r=Ot(t);if(r.tomselect)throw new Error("Tom Select already initialized on this element");r.tomselect=this;var s=window.getComputedStyle&&window.getComputedStyle(r,null);n=s.getPropertyValue("direction");const o=Ms(r,e);this.settings=o,this.input=r,this.tabIndex=r.tabIndex||0,this.is_select_tag=r.tagName.toLowerCase()==="select",this.rtl=/rtl/i.test(n),this.inputId=Cn(r,"tomselect-"+Es),this.isRequired=r.required,this.sifter=new Ou(this.options,{diacritics:o.diacritics}),o.mode=o.mode||(o.maxItems===1?"single":"multi"),typeof o.hideSelected!="boolean"&&(o.hideSelected=o.mode==="multi"),typeof o.hidePlaceholder!="boolean"&&(o.hidePlaceholder=o.mode!=="multi");var a=o.createFilter;typeof a!="function"&&(typeof a=="string"&&(a=new RegExp(a)),a instanceof RegExp?o.createFilter=b=>a.test(b):o.createFilter=b=>this.settings.duplicates||!this.options[b]),this.initializePlugins(o.plugins),this.setupCallbacks(),this.setupTemplates();const c=Ot("
"),l=Ot("
"),h=this._render("dropdown"),d=Ot('
'),u=this.input.getAttribute("class")||"",p=o.mode;var f;if(Mt(c,o.wrapperClass,u,p),Mt(l,o.controlClass),Kt(c,l),Mt(h,o.dropdownClass,p),o.copyClassesToDropdown&&Mt(h,u),Mt(d,o.dropdownContentClass),Kt(h,d),Ot(o.dropdownParent||c).appendChild(h),gs(o.controlInput)){f=Ot(o.controlInput);var m=["autocorrect","autocapitalize","autocomplete","spellcheck"];ot(m,b=>{r.getAttribute(b)&&X(f,{[b]:r.getAttribute(b)})}),f.tabIndex=-1,l.appendChild(f),this.focus_node=f}else o.controlInput?(f=Ot(o.controlInput),this.focus_node=f):(f=Ot(""),this.focus_node=l);this.wrapper=c,this.dropdown=h,this.dropdown_content=d,this.control=l,this.control_input=f,this.setup()}setup(){const t=this,e=t.settings,n=t.control_input,r=t.dropdown,s=t.dropdown_content,o=t.wrapper,a=t.control,c=t.input,l=t.focus_node,h={passive:!0},d=t.inputId+"-ts-dropdown";X(s,{id:d}),X(l,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":d});const u=Cn(l,t.inputId+"-ts-control"),p="label[for='"+zu(t.inputId)+"']",f=document.querySelector(p),m=t.focus.bind(t);if(f){pt(f,"click",m),X(f,{for:u});const w=Cn(f,t.inputId+"-ts-label");X(l,{"aria-labelledby":w}),X(s,{"aria-labelledby":w})}if(o.style.width=c.style.width,t.plugins.names.length){const w="plugin-"+t.plugins.names.join(" plugin-");Mt([o,r],w)}(e.maxItems===null||e.maxItems>1)&&t.is_select_tag&&X(c,{multiple:"multiple"}),e.placeholder&&X(n,{placeholder:e.placeholder}),!e.splitOn&&e.delimiter&&(e.splitOn=new RegExp("\\s*"+Ne(e.delimiter)+"+\\s*")),e.load&&e.loadThrottle&&(e.load=Du(e.load,e.loadThrottle)),pt(r,"mousemove",()=>{t.ignoreHover=!1}),pt(r,"mouseenter",w=>{var M=En(w.target,"[data-selectable]",r);M&&t.onOptionHover(w,M)},{capture:!0}),pt(r,"click",w=>{const M=En(w.target,"[data-selectable]");M&&(t.onOptionSelect(w,M),tt(w,!0))}),pt(a,"click",w=>{var M=En(w.target,"[data-ts-item]",a);if(M&&t.onItemSelect(w,M)){tt(w,!0);return}n.value==""&&(t.onClick(),tt(w,!0))}),pt(l,"keydown",w=>t.onKeyDown(w)),pt(n,"keypress",w=>t.onKeyPress(w)),pt(n,"input",w=>t.onInput(w)),pt(l,"blur",w=>t.onBlur(w)),pt(l,"focus",w=>t.onFocus(w)),pt(n,"paste",w=>t.onPaste(w));const b=w=>{const M=w.composedPath()[0];if(!o.contains(M)&&!r.contains(M)){t.isFocused&&t.blur(),t.inputState();return}M==n&&t.isOpen?w.stopPropagation():tt(w,!0)},y=()=>{t.isOpen&&t.positionDropdown()};pt(document,"mousedown",b),pt(window,"scroll",y,h),pt(window,"resize",y,h),this._destroy=()=>{document.removeEventListener("mousedown",b),window.removeEventListener("scroll",y),window.removeEventListener("resize",y),f&&f.removeEventListener("click",m)},this.revertSettings={innerHTML:c.innerHTML,tabIndex:c.tabIndex},c.tabIndex=-1,c.insertAdjacentElement("afterend",t.wrapper),t.sync(!1),e.items=[],delete e.optgroups,delete e.options,pt(c,"invalid",()=>{t.isValid&&(t.isValid=!1,t.isInvalid=!0,t.refreshState())}),t.updateOriginalInput(),t.refreshItems(),t.close(!1),t.inputState(),t.isSetup=!0,c.disabled?t.disable():c.readOnly?t.setReadOnly(!0):t.enable(),t.on("change",this.onChange),Mt(c,"tomselected","ts-hidden-accessible"),t.trigger("initialize"),e.preload===!0&&t.preload()}setupOptions(t=[],e=[]){this.addOptions(t),ot(e,n=>{this.registerOptionGroup(n)})}setupTemplates(){var t=this,e=t.settings.labelField,n=t.settings.optgroupLabelField,r={optgroup:s=>{let o=document.createElement("div");return o.className="optgroup",o.appendChild(s.options),o},optgroup_header:(s,o)=>'
'+o(s[n])+"
",option:(s,o)=>"
"+o(s[e])+"
",item:(s,o)=>"
"+o(s[e])+"
",option_create:(s,o)=>'
Add '+o(s.input)+"
",no_results:()=>'
No results found
',loading:()=>'
',not_loading:()=>{},dropdown:()=>"
"};t.settings.render=Object.assign({},r,t.settings.render)}setupCallbacks(){var t,e,n={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(t in n)e=this.settings[n[t]],e&&this.on(t,e)}sync(t=!0){const e=this,n=t?Ms(e.input,{delimiter:e.settings.delimiter}):e.settings;e.setupOptions(n.options,n.optgroups),e.setValue(n.items||[],!0),e.lastQuery=null}onClick(){var t=this;if(t.activeItems.length>0){t.clearActiveItems(),t.focus();return}t.isFocused&&t.isOpen?t.blur():t.focus()}onMouseDown(){}onChange(){Mn(this.input,"input"),Mn(this.input,"change")}onPaste(t){var e=this;if(e.isInputHidden||e.isLocked){tt(t);return}e.settings.splitOn&&setTimeout(()=>{var n=e.inputValue();if(n.match(e.settings.splitOn)){var r=n.trim().split(e.settings.splitOn);ot(r,s=>{At(s)&&(this.options[s]?e.addItem(s):e.createItem(s))})}},0)}onKeyPress(t){var e=this;if(e.isLocked){tt(t);return}var n=String.fromCharCode(t.keyCode||t.which);if(e.settings.create&&e.settings.mode==="multi"&&n===e.settings.delimiter){e.createItem(),tt(t);return}}onKeyDown(t){var e=this;if(e.ignoreHover=!0,e.isLocked){t.keyCode!==xs&&tt(t);return}switch(t.keyCode){case $u:if(Wt(fi,t)&&e.control_input.value==""){tt(t),e.selectAll();return}break;case qu:e.isOpen&&(tt(t,!0),e.close()),e.clearActiveItems();return;case Yu:if(!e.isOpen&&e.hasOptions)e.open();else if(e.activeOption){let n=e.getAdjacent(e.activeOption,1);n&&e.setActiveOption(n)}tt(t);return;case Uu:if(e.activeOption){let n=e.getAdjacent(e.activeOption,-1);n&&e.setActiveOption(n)}tt(t);return;case Gu:e.canSelect(e.activeOption)?(e.onOptionSelect(t,e.activeOption),tt(t)):(e.settings.create&&e.createItem()||document.activeElement==e.control_input&&e.isOpen)&&tt(t);return;case Vu:e.advanceSelection(-1,t);return;case ju:e.advanceSelection(1,t);return;case xs:e.settings.selectOnTab&&(e.canSelect(e.activeOption)&&(e.onOptionSelect(t,e.activeOption),tt(t)),e.settings.create&&e.createItem()&&tt(t));return;case ws:case Xu:e.deleteSelection(t);return}e.isInputHidden&&!Wt(fi,t)&&tt(t)}onInput(t){if(this.isLocked)return;const e=this.inputValue();if(this.lastValue!==e){if(this.lastValue=e,e==""){this._onInput();return}this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=Pu(()=>{this.refreshTimeout=null,this._onInput()},this.settings.refreshThrottle)}}_onInput(){const t=this.lastValue;this.settings.shouldLoad.call(this,t)&&this.load(t),this.refreshOptions(),this.trigger("type",t)}onOptionHover(t,e){this.ignoreHover||this.setActiveOption(e,!1)}onFocus(t){var e=this,n=e.isFocused;if(e.isDisabled||e.isReadOnly){e.blur(),tt(t);return}e.ignoreFocus||(e.isFocused=!0,e.settings.preload==="focus"&&e.preload(),n||e.trigger("focus"),e.activeItems.length||(e.inputState(),e.refreshOptions(!!e.settings.openOnFocus)),e.refreshState())}onBlur(t){if(document.hasFocus()!==!1){var e=this;if(e.isFocused){e.isFocused=!1,e.ignoreFocus=!1;var n=()=>{e.close(),e.setActiveItem(),e.setCaret(e.items.length),e.trigger("blur")};e.settings.create&&e.settings.createOnBlur?e.createItem(null,n):n()}}}onOptionSelect(t,e){var n,r=this;e.parentElement&&e.parentElement.matches("[data-disabled]")||(e.classList.contains("create")?r.createItem(null,()=>{r.settings.closeAfterSelect&&r.close()}):(n=e.dataset.value,typeof n<"u"&&(r.lastQuery=null,r.addItem(n),r.settings.closeAfterSelect&&r.close(),!r.settings.hideSelected&&t.type&&/click/.test(t.type)&&r.setActiveOption(e))))}canSelect(t){return!!(this.isOpen&&t&&this.dropdown_content.contains(t))}onItemSelect(t,e){var n=this;return!n.isLocked&&n.settings.mode==="multi"?(tt(t),n.setActiveItem(e,t),!0):!1}canLoad(t){return!(!this.settings.load||this.loadedSearches.hasOwnProperty(t))}load(t){const e=this;if(!e.canLoad(t))return;Mt(e.wrapper,e.settings.loadingClass),e.loading++;const n=e.loadCallback.bind(e);e.settings.load.call(e,t,n)}loadCallback(t,e){const n=this;n.loading=Math.max(n.loading-1,0),n.lastQuery=null,n.clearActiveOption(),n.setupOptions(t,e),n.refreshOptions(n.isFocused&&!n.isInputHidden),n.loading||Gt(n.wrapper,n.settings.loadingClass),n.trigger("load",t,e)}preload(){var t=this.wrapper.classList;t.contains("preloaded")||(t.add("preloaded"),this.load(""))}setTextboxValue(t=""){var e=this.control_input,n=e.value!==t;n&&(e.value=t,Mn(e,"update"),this.lastValue=t)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(t,e){var n=e?[]:["change"];ps(this,n,()=>{this.clear(e),this.addItems(t,e)})}setMaxItems(t){t===0&&(t=null),this.settings.maxItems=t,this.refreshState()}setActiveItem(t,e){var n=this,r,s,o,a,c,l;if(n.settings.mode!=="single"){if(!t){n.clearActiveItems(),n.isFocused&&n.inputState();return}if(r=e&&e.type.toLowerCase(),r==="click"&&Wt("shiftKey",e)&&n.activeItems.length){for(l=n.getLastActive(),o=Array.prototype.indexOf.call(n.control.children,l),a=Array.prototype.indexOf.call(n.control.children,t),o>a&&(c=o,o=a,a=c),s=o;s<=a;s++)t=n.control.children[s],n.activeItems.indexOf(t)===-1&&n.setActiveItemClass(t);tt(e)}else r==="click"&&Wt(fi,e)||r==="keydown"&&Wt("shiftKey",e)?t.classList.contains("active")?n.removeActiveItem(t):n.setActiveItemClass(t):(n.clearActiveItems(),n.setActiveItemClass(t));n.inputState(),n.isFocused||n.focus()}}setActiveItemClass(t){const e=this,n=e.control.querySelector(".last-active");n&&Gt(n,"last-active"),Mt(t,"active last-active"),e.trigger("item_select",t),e.activeItems.indexOf(t)==-1&&e.activeItems.push(t)}removeActiveItem(t){var e=this.activeItems.indexOf(t);this.activeItems.splice(e,1),Gt(t,"active")}clearActiveItems(){Gt(this.activeItems,"active"),this.activeItems=[]}setActiveOption(t,e=!0){t!==this.activeOption&&(this.clearActiveOption(),t&&(this.activeOption=t,X(this.focus_node,{"aria-activedescendant":t.getAttribute("id")}),X(t,{"aria-selected":"true"}),Mt(t,"active"),e&&this.scrollToOption(t)))}scrollToOption(t,e){if(!t)return;const n=this.dropdown_content,r=n.clientHeight,s=n.scrollTop||0,o=t.offsetHeight,a=t.getBoundingClientRect().top-n.getBoundingClientRect().top+s;a+o>r+s?this.scroll(a-r+o,e):a{t.setActiveItemClass(n)}))}inputState(){var t=this;t.control.contains(t.control_input)&&(X(t.control_input,{placeholder:t.settings.placeholder}),t.activeItems.length>0||!t.isFocused&&t.settings.hidePlaceholder&&t.items.length>0?(t.setTextboxValue(),t.isInputHidden=!0):(t.settings.hidePlaceholder&&t.items.length>0&&X(t.control_input,{placeholder:""}),t.isInputHidden=!1),t.wrapper.classList.toggle("input-hidden",t.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var t=this;t.isDisabled||t.isReadOnly||(t.ignoreFocus=!0,t.control_input.offsetWidth?t.control_input.focus():t.focus_node.focus(),setTimeout(()=>{t.ignoreFocus=!1,t.onFocus()},0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(t){return this.sifter.getScoreFunction(t,this.getSearchOptions())}getSearchOptions(){var t=this.settings,e=t.sortField;return typeof t.sortField=="string"&&(e=[{field:t.sortField}]),{fields:t.searchField,conjunction:t.searchConjunction,sort:e,nesting:t.nesting}}search(t){var e,n,r=this,s=this.getSearchOptions();if(r.settings.score&&(n=r.settings.score.call(r,t),typeof n!="function"))throw new Error('Tom Select "score" setting must be a function that returns a function');return t!==r.lastQuery?(r.lastQuery=t,e=r.sifter.search(t,Object.assign(s,{score:n})),r.currentResults=e):e=Object.assign({},r.currentResults),r.settings.hideSelected&&(e.items=e.items.filter(o=>{let a=At(o.id);return!(a&&r.items.indexOf(a)!==-1)})),e}refreshOptions(t=!0){var e,n,r,s,o,a,c,l,h,d;const u={},p=[];var f=this,m=f.inputValue();const b=m===f.lastQuery||m==""&&f.lastQuery==null;var y=f.search(m),w=null,M=f.settings.shouldOpen||!1,C=f.dropdown_content;b&&(w=f.activeOption,w&&(h=w.closest("[data-group]"))),s=y.items.length,typeof f.settings.maxOptions=="number"&&(s=Math.min(s,f.settings.maxOptions)),s>0&&(M=!0);const N=(k,A)=>{let I=u[k];if(I!==void 0){let F=p[I];if(F!==void 0)return[I,F.fragment]}let z=document.createDocumentFragment();return I=p.length,p.push({fragment:z,order:A,optgroup:k}),[I,z]};for(e=0;e0&&(F=F.cloneNode(!0),X(F,{id:I.$id+"-clone-"+n,"aria-selected":null}),F.classList.add("ts-cloned"),Gt(F,"active"),f.activeOption&&f.activeOption.dataset.value==A&&h&&h.dataset.group===o.toString()&&(w=F)),T.appendChild(F),o!=""&&(u[o]=S)}}f.settings.lockOptgroupOrder&&p.sort((k,A)=>k.order-A.order),c=document.createDocumentFragment(),ot(p,k=>{let A=k.fragment,I=k.optgroup;if(!A||!A.children.length)return;let z=f.optgroups[I];if(z!==void 0){let F=document.createDocumentFragment(),Z=f.render("optgroup_header",z);Kt(F,Z),Kt(F,A);let Q=f.render("optgroup",{group:z,options:F});Kt(c,Q)}else Kt(c,A)}),C.innerHTML="",Kt(C,c),f.settings.highlight&&(Hu(C),y.query.length&&y.tokens.length&&ot(y.tokens,k=>{Ru(C,k.regex)}));var P=k=>{let A=f.render(k,{input:m});return A&&(M=!0,C.insertBefore(A,C.firstChild)),A};if(f.loading?P("loading"):f.settings.shouldLoad.call(f,m)?y.items.length===0&&P("no_results"):P("not_loading"),l=f.canCreate(m),l&&(d=P("option_create")),f.hasOptions=y.items.length>0||l,M){if(y.items.length>0){if(!w&&f.settings.mode==="single"&&f.items[0]!=null&&(w=f.getOption(f.items[0])),!C.contains(w)){let k=0;d&&!f.settings.addPrecedence&&(k=1),w=f.selectable()[k]}}else d&&(w=d);t&&!f.isOpen&&(f.open(),f.scrollToOption(w,"auto")),f.setActiveOption(w)}else f.clearActiveOption(),t&&f.isOpen&&f.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(t,e=!1){const n=this;if(Array.isArray(t))return n.addOptions(t,e),!1;const r=At(t[n.settings.valueField]);return r===null||n.options.hasOwnProperty(r)?!1:(t.$order=t.$order||++n.order,t.$id=n.inputId+"-opt-"+t.$order,n.options[r]=t,n.lastQuery=null,e&&(n.userOptions[r]=e,n.trigger("option_add",r,t)),r)}addOptions(t,e=!1){ot(t,n=>{this.addOption(n,e)})}registerOption(t){return this.addOption(t)}registerOptionGroup(t){var e=At(t[this.settings.optgroupValueField]);return e===null?!1:(t.$order=t.$order||++this.order,this.optgroups[e]=t,e)}addOptionGroup(t,e){var n;e[this.settings.optgroupValueField]=t,(n=this.registerOptionGroup(e))&&this.trigger("optgroup_add",n,e)}removeOptionGroup(t){this.optgroups.hasOwnProperty(t)&&(delete this.optgroups[t],this.clearCache(),this.trigger("optgroup_remove",t))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(t,e){const n=this;var r,s;const o=At(t),a=At(e[n.settings.valueField]);if(o===null)return;const c=n.options[o];if(c==null)return;if(typeof a!="string")throw new Error("Value must be set in option data");const l=n.getOption(o),h=n.getItem(o);if(e.$order=e.$order||c.$order,delete n.options[o],n.uncacheValue(a),n.options[a]=e,l){if(n.dropdown_content.contains(l)){const d=n._render("option",e);Sn(l,d),n.activeOption===l&&n.setActiveOption(d)}l.remove()}h&&(s=n.items.indexOf(o),s!==-1&&n.items.splice(s,1,a),r=n._render("item",e),h.classList.contains("active")&&Mt(r,"active"),Sn(h,r)),n.lastQuery=null}removeOption(t,e){const n=this;t=ui(t),n.uncacheValue(t),delete n.userOptions[t],delete n.options[t],n.lastQuery=null,n.trigger("option_remove",t),n.removeItem(t,e)}clearOptions(t){const e=(t||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();const n={};ot(this.options,(r,s)=>{e(r,s)&&(n[s]=r)}),this.options=this.sifter.items=n,this.lastQuery=null,this.trigger("option_clear")}clearFilter(t,e){return this.items.indexOf(e)>=0}getOption(t,e=!1){const n=At(t);if(n===null)return null;const r=this.options[n];if(r!=null){if(r.$div)return r.$div;if(e)return this._render("option",r)}return null}getAdjacent(t,e,n="option"){var r=this,s;if(!t)return null;n=="item"?s=r.controlChildren():s=r.dropdown_content.querySelectorAll("[data-selectable]");for(let o=0;o0?s[o+1]:s[o-1];return null}getItem(t){if(typeof t=="object")return t;var e=At(t);return e!==null?this.control.querySelector(`[data-value="${fs(e)}"]`):null}addItems(t,e){var n=this,r=Array.isArray(t)?t:[t];r=r.filter(o=>n.items.indexOf(o)===-1);const s=r[r.length-1];r.forEach(o=>{n.isPending=o!==s,n.addItem(o,e)})}addItem(t,e){var n=e?[]:["change","dropdown_close"];ps(this,n,()=>{var r,s;const o=this,a=o.settings.mode,c=At(t);if(!(c&&o.items.indexOf(c)!==-1&&(a==="single"&&o.close(),a==="single"||!o.settings.duplicates))&&!(c===null||!o.options.hasOwnProperty(c))&&(a==="single"&&o.clear(e),!(a==="multi"&&o.isFull()))){if(r=o._render("item",o.options[c]),o.control.contains(r)&&(r=r.cloneNode(!0)),s=o.isFull(),o.items.splice(o.caretPos,0,c),o.insertAtCaret(r),o.isSetup){if(!o.isPending&&o.settings.hideSelected){let l=o.getOption(c),h=o.getAdjacent(l,1);h&&o.setActiveOption(h)}!o.isPending&&!o.settings.closeAfterSelect&&o.refreshOptions(o.isFocused&&a!=="single"),o.settings.closeAfterSelect!=!1&&o.isFull()?o.close():o.isPending||o.positionDropdown(),o.trigger("item_add",c,r),o.isPending||o.updateOriginalInput({silent:e})}(!o.isPending||!s&&o.isFull())&&(o.inputState(),o.refreshState())}})}removeItem(t=null,e){const n=this;if(t=n.getItem(t),!t)return;var r,s;const o=t.dataset.value;r=bs(t),t.remove(),t.classList.contains("active")&&(s=n.activeItems.indexOf(t),n.activeItems.splice(s,1),Gt(t,"active")),n.items.splice(r,1),n.lastQuery=null,!n.settings.persist&&n.userOptions.hasOwnProperty(o)&&n.removeOption(o,e),r{}){arguments.length===3&&(e=arguments[2]),typeof e!="function"&&(e=()=>{});var n=this,r=n.caretPos,s;if(t=t||n.inputValue(),!n.canCreate(t))return e(),!1;n.lock();var o=!1,a=c=>{if(n.unlock(),!c||typeof c!="object")return e();var l=At(c[n.settings.valueField]);if(typeof l!="string")return e();n.setTextboxValue(),n.addOption(c,!0),n.setCaret(r),n.addItem(l),e(c),o=!0};return typeof n.settings.create=="function"?s=n.settings.create.call(this,t,a):s={[n.settings.labelField]:t,[n.settings.valueField]:t},o||a(s),!0}refreshItems(){var t=this;t.lastQuery=null,t.isSetup&&t.addItems(t.items),t.updateOriginalInput(),t.refreshState()}refreshState(){const t=this;t.refreshValidityState();const e=t.isFull(),n=t.isLocked;t.wrapper.classList.toggle("rtl",t.rtl);const r=t.wrapper.classList;r.toggle("focus",t.isFocused),r.toggle("disabled",t.isDisabled),r.toggle("readonly",t.isReadOnly),r.toggle("required",t.isRequired),r.toggle("invalid",!t.isValid),r.toggle("locked",n),r.toggle("full",e),r.toggle("input-active",t.isFocused&&!t.isInputHidden),r.toggle("dropdown-active",t.isOpen),r.toggle("has-options",Bu(t.options)),r.toggle("has-items",t.items.length>0)}refreshValidityState(){var t=this;t.input.validity&&(t.isValid=t.input.validity.valid,t.isInvalid=!t.isValid)}isFull(){return this.settings.maxItems!==null&&this.items.length>=this.settings.maxItems}updateOriginalInput(t={}){const e=this;var n,r;const s=e.input.querySelector('option[value=""]');if(e.is_select_tag){let c=function(l,h,d){return l||(l=Ot('")),l!=s&&e.input.append(l),o.push(l),(l!=s||a>0)&&(l.selected=!0),l};const o=[],a=e.input.querySelectorAll("option:checked").length;e.input.querySelectorAll("option:checked").forEach(l=>{l.selected=!1}),e.items.length==0&&e.settings.mode=="single"?c(s,"",""):e.items.forEach(l=>{if(n=e.options[l],r=n[e.settings.labelField]||"",o.includes(n.$option)){const h=e.input.querySelector(`option[value="${fs(l)}"]:not(:checked)`);c(h,l,r)}else n.$option=c(n.$option,l,r)})}else e.input.value=e.getValue();e.isSetup&&(t.silent||e.trigger("change",e.getValue()))}open(){var t=this;t.isLocked||t.isOpen||t.settings.mode==="multi"&&t.isFull()||(t.isOpen=!0,X(t.focus_node,{"aria-expanded":"true"}),t.refreshState(),pi(t.dropdown,{visibility:"hidden",display:"block"}),t.positionDropdown(),pi(t.dropdown,{visibility:"visible",display:"block"}),t.focus(),t.trigger("dropdown_open",t.dropdown))}close(t=!0){var e=this,n=e.isOpen;t&&(e.setTextboxValue(),e.settings.mode==="single"&&e.items.length&&e.inputState()),e.isOpen=!1,X(e.focus_node,{"aria-expanded":"false"}),pi(e.dropdown,{display:"none"}),e.settings.hideSelected&&e.clearActiveOption(),e.refreshState(),n&&e.trigger("dropdown_close",e.dropdown)}positionDropdown(){if(this.settings.dropdownParent==="body"){var t=this.control,e=t.getBoundingClientRect(),n=t.offsetHeight+e.top+window.scrollY,r=e.left+window.scrollX;pi(this.dropdown,{width:e.width+"px",top:n+"px",left:r+"px"})}}clear(t){var e=this;if(e.items.length){var n=e.controlChildren();ot(n,r=>{e.removeItem(r,!0)}),e.inputState(),t||e.updateOriginalInput(),e.trigger("clear")}}insertAtCaret(t){const e=this,n=e.caretPos,r=e.control;r.insertBefore(t,r.children[n]||null),e.setCaret(n+1)}deleteSelection(t){var e,n,r,s,o=this;e=t&&t.keyCode===ws?-1:1,n=Fu(o.control_input);const a=[];if(o.activeItems.length)s=ys(o.activeItems,e),r=bs(s),e>0&&r++,ot(o.activeItems,c=>a.push(c));else if((o.isFocused||o.settings.mode==="single")&&o.items.length){const c=o.controlChildren();let l;e<0&&n.start===0&&n.length===0?l=c[o.caretPos-1]:e>0&&n.start===o.inputValue().length&&(l=c[o.caretPos]),l!==void 0&&a.push(l)}if(!o.shouldDelete(a,t))return!1;for(tt(t,!0),typeof r<"u"&&o.setCaret(r);a.length;)o.removeItem(a.pop());return o.inputState(),o.positionDropdown(),o.refreshOptions(!1),!0}shouldDelete(t,e){const n=t.map(r=>r.dataset.value);return!(!n.length||typeof this.settings.onDelete=="function"&&this.settings.onDelete(n,e)===!1)}advanceSelection(t,e){var n,r,s=this;s.rtl&&(t*=-1),!s.inputValue().length&&(Wt(fi,e)||Wt("shiftKey",e)?(n=s.getLastActive(t),n?n.classList.contains("active")?r=s.getAdjacent(n,t,"item"):r=n:t>0?r=s.control_input.nextElementSibling:r=s.control_input.previousElementSibling,r&&(r.classList.contains("active")&&s.removeActiveItem(n),s.setActiveItemClass(r))):s.moveCaret(t))}moveCaret(t){}getLastActive(t){let e=this.control.querySelector(".last-active");if(e)return e;var n=this.control.querySelectorAll(".active");if(n)return ys(n,t)}setCaret(t){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(t=this.isReadOnly||this.isDisabled){this.isLocked=t,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(t){this.focus_node.tabIndex=t?-1:this.tabIndex,this.isDisabled=t,this.input.disabled=t,this.control_input.disabled=t,this.setLocked()}setReadOnly(t){this.isReadOnly=t,this.input.readOnly=t,this.control_input.readOnly=t,this.setLocked()}destroy(){var t=this,e=t.revertSettings;t.trigger("destroy"),t.off(),t.wrapper.remove(),t.dropdown.remove(),t.input.innerHTML=e.innerHTML,t.input.tabIndex=e.tabIndex,Gt(t.input,"tomselected","ts-hidden-accessible"),t._destroy(),delete t.input.tomselect}render(t,e){var n,r;const s=this;if(typeof this.settings.render[t]!="function"||(r=s.settings.render[t].call(this,e,xn),!r))return null;if(r=Ot(r),t==="option"||t==="option_create"?e[s.settings.disabledField]?X(r,{"aria-disabled":"true"}):X(r,{"data-selectable":""}):t==="optgroup"&&(n=e.group[s.settings.optgroupValueField],X(r,{"data-group":n}),e.group[s.settings.disabledField]&&X(r,{"data-disabled":""})),t==="option"||t==="item"){const o=ui(e[s.settings.valueField]);X(r,{"data-value":o}),t==="item"?(Mt(r,s.settings.itemClass),X(r,{"data-ts-item":""})):(Mt(r,s.settings.optionClass),X(r,{role:"option",id:e.$id}),e.$div=r,s.options[o]=e)}return r}_render(t,e){const n=this.render(t,e);if(n==null)throw"HTMLElement expected";return n}clearCache(){ot(this.options,t=>{t.$div&&(t.$div.remove(),delete t.$div)})}uncacheValue(t){const e=this.getOption(t);e&&e.remove()}canCreate(t){return this.settings.create&&t.length>0&&this.settings.createFilter.call(this,t)}hook(t,e,n){var r=this,s=r[e];r[e]=function(){var o,a;return t==="after"&&(o=s.apply(r,arguments)),a=n.apply(r,arguments),t==="instead"?a:(t==="before"&&(o=s.apply(r,arguments)),o)}}}const Wu=(i,t,e,n)=>{i.addEventListener(t,e,n)};function Ku(){Wu(this.input,"change",()=>{this.sync()})}const Zu=i=>typeof i>"u"||i===null?null:Qu(i),Qu=i=>typeof i=="boolean"?i?"1":"0":i+"",Ss=(i,t=!1)=>{i&&(i.preventDefault(),t&&i.stopPropagation())},Ju=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(tp(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},tp=i=>typeof i=="string"&&i.indexOf("<")>-1;function ep(i){var t=this,e=t.onOptionSelect;t.settings.hideSelected=!1;const n=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},i);var r=function(a,c){c?(a.checked=!0,n.uncheckedClassNames&&a.classList.remove(...n.uncheckedClassNames),n.checkedClassNames&&a.classList.add(...n.checkedClassNames)):(a.checked=!1,n.checkedClassNames&&a.classList.remove(...n.checkedClassNames),n.uncheckedClassNames&&a.classList.add(...n.uncheckedClassNames))},s=function(a){setTimeout(()=>{var c=a.querySelector("input."+n.className);c instanceof HTMLInputElement&&r(c,a.classList.contains("selected"))},1)};t.hook("after","setupTemplates",()=>{var o=t.settings.render.option;t.settings.render.option=(a,c)=>{var l=Ju(o.call(t,a,c)),h=document.createElement("input");n.className&&h.classList.add(n.className),h.addEventListener("click",function(u){Ss(u)}),h.type="checkbox";const d=Zu(a[t.settings.valueField]);return r(h,!!(d&&t.items.indexOf(d)>-1)),l.prepend(h),l}}),t.on("item_remove",o=>{var a=t.getOption(o);a&&(a.classList.remove("selected"),s(a))}),t.on("item_add",o=>{var a=t.getOption(o);a&&s(a)}),t.hook("instead","onOptionSelect",(o,a)=>{if(a.classList.contains("selected")){a.classList.remove("selected"),t.removeItem(a.dataset.value),t.refreshOptions(),Ss(o,!0);return}e.call(t,o,a),s(a)})}const ip=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(np(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},np=i=>typeof i=="string"&&i.indexOf("<")>-1;function rp(i){const t=this,e=Object.assign({className:"clear-button",title:"Clear All",html:n=>`
`},i);t.on("initialize",()=>{var n=ip(e.html(e));n.addEventListener("click",r=>{t.isLocked||(t.clear(),t.settings.mode==="single"&&t.settings.allowEmptyOption&&t.addItem(""),r.preventDefault(),r.stopPropagation())}),t.control.appendChild(n)})}const sp=(i,t=!1)=>{i&&(i.preventDefault(),t&&i.stopPropagation())},le=(i,t,e,n)=>{i.addEventListener(t,e,n)},op=(i,t)=>{if(Array.isArray(i))i.forEach(t);else for(var e in i)i.hasOwnProperty(e)&&t(i[e],e)},ap=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(lp(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},lp=i=>typeof i=="string"&&i.indexOf("<")>-1,cp=(i,t)=>{op(t,(e,n)=>{e==null?i.removeAttribute(n):i.setAttribute(n,""+e)})},hp=(i,t)=>{var e;(e=i.parentNode)==null||e.insertBefore(t,i.nextSibling)},dp=(i,t)=>{var e;(e=i.parentNode)==null||e.insertBefore(t,i)},up=(i,t)=>{do{var e;if(t=(e=t)==null?void 0:e.previousElementSibling,i==t)return!0}while(t&&t.previousElementSibling);return!1};function pp(){var i=this;if(i.settings.mode!=="multi")return;var t=i.lock,e=i.unlock;let n=!0,r;i.hook("after","setupTemplates",()=>{var s=i.settings.render.item;i.settings.render.item=(o,a)=>{const c=ap(s.call(i,o,a));cp(c,{draggable:"true"});const l=m=>{n||sp(m),m.stopPropagation()},h=m=>{r=c,setTimeout(()=>{c.classList.add("ts-dragging")},0)},d=m=>{m.preventDefault(),c.classList.add("ts-drag-over"),p(c,r)},u=()=>{c.classList.remove("ts-drag-over")},p=(m,b)=>{b!==void 0&&(up(b,c)?hp(m,b):dp(m,b))},f=()=>{var m;document.querySelectorAll(".ts-drag-over").forEach(y=>y.classList.remove("ts-drag-over")),(m=r)==null||m.classList.remove("ts-dragging"),r=void 0;var b=[];i.control.querySelectorAll("[data-value]").forEach(y=>{if(y.dataset.value){let w=y.dataset.value;w&&b.push(w)}}),i.setValue(b)};return le(c,"mousedown",l),le(c,"dragstart",h),le(c,"dragenter",d),le(c,"dragover",d),le(c,"dragleave",u),le(c,"dragend",f),c}}),i.hook("instead","lock",()=>(n=!1,t.call(i))),i.hook("instead","unlock",()=>(n=!0,e.call(i)))}const fp=(i,t=!1)=>{i&&(i.preventDefault(),t&&i.stopPropagation())},gp=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(mp(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},mp=i=>typeof i=="string"&&i.indexOf("<")>-1;function vp(i){const t=this,e=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:n=>'
'+n.title+'×
'},i);t.on("initialize",()=>{var n=gp(e.html(e)),r=n.querySelector("."+e.closeClass);r&&r.addEventListener("click",s=>{fp(s,!0),t.close()}),t.dropdown.insertBefore(n,t.dropdown.firstChild)})}const yp=(i,t)=>{if(Array.isArray(i))i.forEach(t);else for(var e in i)i.hasOwnProperty(e)&&t(i[e],e)},bp=(i,...t)=>{var e=wp(t);i=xp(i),i.map(n=>{e.map(r=>{n.classList.remove(r)})})},wp=i=>{var t=[];return yp(i,e=>{typeof e=="string"&&(e=e.trim().split(/[\t\n\f\r\s]/)),Array.isArray(e)&&(t=t.concat(e))}),t.filter(Boolean)},xp=i=>(Array.isArray(i)||(i=[i]),i),Cp=(i,t)=>{if(!i)return-1;t=t||i.nodeName;for(var e=0;i=i.previousElementSibling;)i.matches(t)&&e++;return e};function Mp(){var i=this;i.hook("instead","setCaret",t=>{i.settings.mode==="single"||!i.control.contains(i.control_input)?t=i.items.length:(t=Math.max(0,Math.min(i.items.length,t)),t!=i.caretPos&&!i.isPending&&i.controlChildren().forEach((e,n)=>{n{if(!i.isFocused)return;const e=i.getLastActive(t);if(e){const n=Cp(e);i.setCaret(t>0?n+1:n),i.setActiveItem(),bp(e,"last-active")}else i.setCaret(i.caretPos+t)})}const Ep=27,Sp=9,_p=(i,t=!1)=>{i&&(i.preventDefault(),t&&i.stopPropagation())},kp=(i,t,e,n)=>{i.addEventListener(t,e,n)},Np=(i,t)=>{if(Array.isArray(i))i.forEach(t);else for(var e in i)i.hasOwnProperty(e)&&t(i[e],e)},_s=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(Ap(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},Ap=i=>typeof i=="string"&&i.indexOf("<")>-1,Ip=(i,...t)=>{var e=Tp(t);i=Lp(i),i.map(n=>{e.map(r=>{n.classList.add(r)})})},Tp=i=>{var t=[];return Np(i,e=>{typeof e=="string"&&(e=e.trim().split(/[\t\n\f\r\s]/)),Array.isArray(e)&&(t=t.concat(e))}),t.filter(Boolean)},Lp=i=>(Array.isArray(i)||(i=[i]),i);function Op(){const i=this;i.settings.shouldOpen=!0,i.hook("before","setup",()=>{i.focus_node=i.control,Ip(i.control_input,"dropdown-input");const t=_s('
diff --git a/var/www/templates/chats_explorer/block_message.html b/var/www/templates/chats_explorer/block_message.html index 9c414d07..e6916b15 100644 --- a/var/www/templates/chats_explorer/block_message.html +++ b/var/www/templates/chats_explorer/block_message.html @@ -17,6 +17,7 @@ } .object_image { filter: blur(var(--object-image-blur, 5px)); + max-width: 100%; } @@ -217,11 +218,11 @@

{% else %}
{{ message['content'][:message['extracted'][0][0]] }}{% for row in message['extracted'] %}{{ message['content'][row[0]:row[1]] }}{% if loop.index + 1 > message['extracted']|length %}{{ message['content'][message['extracted'][-1][1]:] }}{% else %}{{ message['content'][row[1]:message['extracted'][loop.index][0]] }}{% endif %}{% endfor %}
{% endif %} - {% if message['translation'] %} + {% set mess_id_escape= message['id'] | replace("/", "_") %} +

-
{{ message['translation'] }}
- - {% endif %} +
{{ message['translation'] if message['translation'] else '' }}
+
{% for reaction in message['reactions'] %} {{ reaction }} {{ message['reactions'][reaction] }} {% endfor %} @@ -236,10 +237,17 @@

{% endfor %}
- {% set mess_id_escape= message['id'] | replace("/", "_") %} + {% if message['language'] %} + + {% endif %}
@@ -247,7 +255,7 @@

Source: - {% if not translation_target or translation_target == "Don't Translate" %} - - {% else %} - - - {% endif %} - {% for language in translation_languages %} - - {% endfor %} - -

+ {% if language_source %} +
+ Source: + +
+ {% endif %}
Target: + +
+
+ + + +
+ + Lookyloo +

+
+ + @@ -249,6 +288,11 @@
 Adjust crawling interval as needed
$('#queue_type_selector').on("change", function () { queue_type_selector_input_controler(); }); + + $('#lookyloo_archive').on('change', function(){ + const fileName = $(this).val().split('\\').pop(); + $(this).next('.custom-file-label').html(fileName || 'Choose Lookyloo archive (.zip)'); + }); }); function toggle_sidebar(){ diff --git a/var/www/templates/crawler/crawler_splash/dashboard_crawler.html b/var/www/templates/crawler/crawler_splash/dashboard_crawler.html index bccb546a..c02a86bb 100644 --- a/var/www/templates/crawler/crawler_splash/dashboard_crawler.html +++ b/var/www/templates/crawler/crawler_splash/dashboard_crawler.html @@ -15,6 +15,34 @@ + @@ -31,20 +59,25 @@ {% include 'crawler/crawler_disabled.html' %} -
-
+
+

Crawler Dashboard

+ Live crawler status and domain search tools +
+ +
+
-
+
@@ -52,34 +85,34 @@
-
-
+
@@ -87,7 +120,40 @@
+ + +
Recent Crawler Activity
+
+ {% for crawler in crawlers_status %} @@ -110,40 +176,29 @@
- {% include 'crawler/show_domains_by_daterange.html' %} - +
+
-
-
-
-
- - Onion Domain Explorer - +
+
Search
+
+
+ {% include 'crawler/show_domains_by_daterange.html' %}
-
-
-
- - Web Domain Explorer - +
+ {% with object_type='domain' %} + {% include 'tags/block_obj_tags_search.html' %} + {% endwith %} +
+
+ {% with object_type='domain' %} + {% include 'domains/block_languages_search.html' %} + {% endwith %}
- - - {% with object_type='domain' %} - {% include 'tags/block_obj_tags_search.html' %} - {% endwith %} - - {% with object_type='domain' %} - {% include 'domains/block_languages_search.html' %} - {% endwith %} + {% include 'domains/block_domains_name_search.html' %}
@@ -220,6 +275,11 @@
@@ -30,51 +92,59 @@ {% include 'crawler/menu_sidebar.html' %} -
+
-
-
+
+

Domain Explorer

+

Browse crawled domains with clearer filters, improved image controls, and streamlined navigation.

+
- {% with domain_type=dict_data['domain_type'], date_from=dict_data['date_from'], date_to=dict_data['date_to'], domain_type=domain_type%} - {% include 'domains/filter_domains.html' %} - {% endwith %} +
+
+
+ {% with domain_type=dict_data['domain_type'], date_from=dict_data['date_from'], date_to=dict_data['date_to'], domain_type=domain_type%} + {% include 'domains/filter_domains.html' %} + {% endwith %} +
-
- -
+
+
{% include 'objects/image/block_blur_img_slider.html' %}
-
+
+
+

Discovered Domains

+ {% if 'nb_all_elem' in dict_data %} +

Total: {{ dict_data['nb_all_elem'] }}

+ {% endif %} +
- {% with l_dict_domains=dict_data['list_elem'], bootstrap_label=bootstrap_label %} - {% include 'domains/card_img_domain.html' %} - {% endwith %} - -
-
- - {%if 'list_elem' in dict_data%} - {% with page=dict_data['page'], nb_page_max=dict_data['nb_pages'], nb_first_elem=dict_data['nb_first_elem'], nb_last_elem=dict_data['nb_last_elem'], nb_all_elem=dict_data['nb_all_elem'] %} - {% set object_name="domain" %} - {%if domain_type=='onion'%} - {% set target_url=url_for('crawler_splash.domains_explorer_onion') + "?domain_type=onion" %} - {%elif domain_type=='i2p'%} - {% set target_url=url_for('crawler_splash.domains_explorer_i2p') + "?domain_type=i2p" %} - {%else%} - {% set target_url=url_for('crawler_splash.domains_explorer_web') + "?domain_type=regular" %} - {%endif%} - {%if 'date_from' in dict_data %} - {% set target_url = target_url + '&date_from=' + dict_data['date_from'] + '&date_to=' + dict_data['date_to'] %} - {%endif%} - {% include 'pagination.html' %} + {% with l_dict_domains=dict_data['list_elem'], bootstrap_label=bootstrap_label %} + {% include 'domains/card_img_domain.html' %} {% endwith %} - {%endif%} - - + {%if 'list_elem' in dict_data%} +
+ {% with page=dict_data['page'], nb_page_max=dict_data['nb_pages'], nb_first_elem=dict_data['nb_first_elem'], nb_last_elem=dict_data['nb_last_elem'], nb_all_elem=dict_data['nb_all_elem'] %} + {% set object_name="domain" %} + {%if domain_type=='onion'%} + {% set target_url=url_for('crawler_splash.domains_explorer_onion') + "?domain_type=onion" %} + {%elif domain_type=='i2p'%} + {% set target_url=url_for('crawler_splash.domains_explorer_i2p') + "?domain_type=i2p" %} + {%else%} + {% set target_url=url_for('crawler_splash.domains_explorer_web') + "?domain_type=regular" %} + {%endif%} + {%if 'date_from' in dict_data %} + {% set target_url = target_url + '&date_from=' + dict_data['date_from'] + '&date_to=' + dict_data['date_to'] %} + {%endif%} + {% include 'pagination.html' %} + {% endwith %} +
+ {%endif%} +
diff --git a/var/www/templates/crawler/crawler_splash/settings_crawler.html b/var/www/templates/crawler/crawler_splash/settings_crawler.html index ab631fc8..8e5835c3 100644 --- a/var/www/templates/crawler/crawler_splash/settings_crawler.html +++ b/var/www/templates/crawler/crawler_splash/settings_crawler.html @@ -56,6 +56,21 @@ max-height: 260px; overflow-y: auto; } + .network-badge { + font-size: .9rem; + } + .network-result-card { + border-radius: .5rem; + } + .network-result-card .card-body { + padding: .9rem 1rem; + } + .crawler-logs-output { + border-radius: .5rem; + max-height: 360px; + overflow-y: auto; + white-space: pre; + } @@ -72,7 +87,7 @@

Crawler Settings

-

Configure Lacus, manage queues, and validate crawler connectivity.

+

Set up Lacus, manage crawler queues, run connectivity checks, and monitor crawler health.

@@ -107,7 +122,7 @@

AIL Lacus Crawler

+ + + + + Blacklisted domains + +
+ {% set web_available = crawler_test_metadata['web_success'] == 'True' %} + {% set onion_available = crawler_test_metadata['onion_success'] == 'True' %} +
-

Crawler Health & Runtime

+

Connectivity Check

{% if is_crawler_working %}Operational{% else %}Error{% endif %}
- -
+
-
TOR crawler diagnostic test
-

Run this check to verify crawler dependencies and connectivity.

+
Test crawler connectivity (Web + Onion)
+

Use this test to confirm that Lacus can reach both normal websites and Tor hidden services before you launch or troubleshoot crawls.

- Run Test Again + Run Connectivity Test
-
----------------------------
-- TOR CRAWLER TEST OUTPUT: -
-----------------------------
-
-{{crawler_error_mess}}
- -
-
-
-
Concurrent Crawlers
-

Number of crawler workers launched in parallel.

+
+
+
+
+
+
Web access
+
Normal websites
+
+ + {% if web_available %}Available{% else %}Unavailable{% endif %} + +
-
-
{{ nb_captures }}
- - Update Value - +
+
+
+
+
+
Onion access
+
Tor hidden services
+
+ + {% if onion_available %}Available{% else %}Unavailable{% endif %} + +
-
-
-
- Filter Local IPs - - {% if is_crawler_filter_local_ips_enabled %}Enabled{% else %}Disabled{% endif %} - -
-

- This option prevents crawler tasks from being added when the submitted URL is invalid, cannot be resolved, or resolves to non-public IP addresses such as localhost, private network ranges, link-local addresses, or other non-global addresses. -

- {% if is_crawler_filter_local_ips_enabled %} - - Disable Local IP Filter - - {% else %} - - Enable Local IP Filter - - {% endif %} - -
- -
- Filter Unsafe Onion - - {% if is_onion_filter_enabled %}Enabled{% else %}Disabled{% endif %} - -
-

- This option enables filtering of onion domains that are considered unsafe due to containing violent content, child sexual abuse material (CSAM), or other harmful materials. When enabled, the system will attempt to identify and exclude such domains from crawling. -

- -

- - Disabling this option may result in crawling and downloading content that includes CSAM, extreme violence, or other harmful materials.
- Users are strongly advised to keep this feature enabled to avoid unintentional exposure to such content. -

- -

- 🔍 How It Works: The filtering mechanism leverages known blocklists, heuristics, and automated detection techniques to reduce the risk of crawling unsafe content. While no filtering system is perfect, we continuously strive to improve detection and minimize exposure to harmful materials. -

- -

- By using this feature, you benefit from an added layer of protection, but please note that some unsafe onion domains may still bypass detection due to evolving content and obfuscation techniques.
- We encourage users to remain cautious and use this feature as an additional safeguard. -

- {% if is_onion_filter_enabled %} - - Disable Unsafe Onion Filter - - {% else %} - - Enable Unsafe Onion Filter - - {% endif %} - -
- -
- Crawl Unknown Onion - - {% if is_onion_filter_unknown %}Enabled{% else %}Disabled{% endif %} - -
-

This option controls whether the crawler should proceed with crawling onion domains that have not yet been classified as safe or unsafe.

- -
    -
  • If disabled: The crawler will process domains that have never been checked, potentially discovering new useful content but also increasing the risk of encountering unsafe materials.
  • -
  • If enabled: The crawler will only process domains that have been explicitly identified as safe, reducing risk but potentially missing new, unclassified domains.
  • -
- -

This option is useful for users who want to explore uncharted domains while still benefiting from the filter_unsafe_onion protection. However, enabling this option increases the likelihood of encountering harmful content, so caution is advised.

- {% if is_onion_filter_unknown %} - - Disable Unknown Onion Crawl - - {% else %} - - Enable Unknown Onion Crawl - - {% endif %} + {% if web_available and onion_available %} +
+ + Both connectivity checks passed. The crawler is ready for web and onion capture tasks. +
+ {% elif not web_available or not onion_available %} +
+ + One or more connectivity checks failed. Review the details below, then run the test again after applying fixes. +
+
{% if not web_available %}Web issue: {{ crawler_test_metadata['web_message'] }}{% endif %}
+{% if not web_available and not onion_available %}
+{% endif %}
+{% if not onion_available %}Onion issue: {{ crawler_test_metadata['onion_message'] }}{% endif %}
+ {% endif %} + +

Last tested: {{ crawler_test_metadata['date_test'] }}

+ +
+ How to read these results:
+ These values reflect the latest test run on {{ crawler_test_metadata['date_test'] }} and are not live telemetry.
+ Web status indicates whether Lacus can crawl normal websites.
+ Onion status indicates whether Lacus can crawl Tor hidden services.
+ Re-run the test after configuration or infrastructure changes. +
+
+
+
+
+
+
+
Filter Local IPs
+

Reject invalid URLs and targets that resolve to non-public addresses.

+ + {% if is_crawler_filter_local_ips_enabled %}Enabled{% else %}Disabled{% endif %} +
- - Blacklisted domains - +

+ When enabled, crawler tasks are rejected if the submitted URL is invalid, cannot be resolved, or resolves to a non-global address such as localhost, a private network, or a link-local range. +

+ + {% if is_crawler_filter_local_ips_enabled %} + + Disable Local IP Filter + + {% else %} + + Enable Local IP Filter + + {% endif %} +
+
+ +
+
+

Onion Safety Controls

+
+
+
+ Filter Unsafe Onion + + {% if is_onion_filter_enabled %}Enabled{% else %}Disabled{% endif %} + +
+

+ This option enables filtering of onion domains that are considered unsafe due to containing violent content, child sexual abuse material (CSAM), or other harmful materials. When enabled, the system will attempt to identify and exclude such domains from crawling. +

+ +

+ + Disabling this option may result in crawling and downloading content that includes CSAM, extreme violence, or other harmful materials.
+ Users are strongly advised to keep this feature enabled to avoid unintentional exposure to such content. +

+ +

+ 🔍 How It Works: The filtering mechanism leverages known blocklists, heuristics, and automated detection techniques to reduce the risk of crawling unsafe content. While no filtering system is perfect, we continuously strive to improve detection and minimize exposure to harmful materials. +

+ +

+ By using this feature, you benefit from an added layer of protection, but please note that some unsafe onion domains may still bypass detection due to evolving content and obfuscation techniques.
+ We encourage users to remain cautious and use this feature as an additional safeguard. +

+ {% if is_onion_filter_enabled %} + + Disable Unsafe Onion Filter + + {% else %} + + Enable Unsafe Onion Filter + + {% endif %} + +
+ +
+ Crawl Unknown Onion + + {% if is_onion_filter_unknown %}Enabled{% else %}Disabled{% endif %} + +
+

This option controls whether the crawler should proceed with crawling onion domains that have not yet been classified as safe or unsafe.

+ +
    +
  • If enabled: The crawler will process domains that have never been checked, potentially discovering new useful content but also increasing the risk of encountering unsafe materials.
  • +
  • If disabled: The crawler will only process domains that have been explicitly identified as safe, reducing risk but potentially missing new, unclassified domains.
  • +
+ +

This option is useful for users who want to explore uncharted domains while still benefiting from the filter_unsafe_onion protection. However, enabling this option increases the likelihood of encountering harmful content, so caution is advised.

+ {% if is_onion_filter_unknown %} + + Disable Unknown Onion Filter + + {% else %} + + Enable Unknown Onion Filter + + {% endif %} +
+
+ +
+
+

Logs & Diagnostics

+
+
+
Recent crawler logs
+

Recent crawler errors and status messages from logs/crawlers.log (last 100 lines).

+
{% for line in crawler_logs %}{{ line }}
+{% endfor %}
+
@@ -266,4 +355,4 @@
+ \ No newline at end of file diff --git a/var/www/templates/crawler/show_domains_by_daterange.html b/var/www/templates/crawler/show_domains_by_daterange.html index acb05c4e..07110720 100644 --- a/var/www/templates/crawler/show_domains_by_daterange.html +++ b/var/www/templates/crawler/show_domains_by_daterange.html @@ -1,4 +1,4 @@ -
+
{% if crawler_stats %}
@@ -14,7 +14,7 @@
{% endif %}
-
Search Domains by Date :
+
Search Domains by Date
@@ -43,9 +43,9 @@
Search Domains by Date :
- - +
diff --git a/var/www/templates/domains/block_domains_name_search.html b/var/www/templates/domains/block_domains_name_search.html index 5d4d974e..828d1e17 100644 --- a/var/www/templates/domains/block_domains_name_search.html +++ b/var/www/templates/domains/block_domains_name_search.html @@ -1,7 +1,7 @@
-
Search Domain by name:
+
Search Domain by name:
@@ -18,6 +18,12 @@
Onion Domains
+
+ + +