streamlit-nightly 1.38.1.dev20240915__py2.py3-none-any.whl → 1.38.1.dev20240917__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. streamlit/commands/navigation.py +1 -1
  2. streamlit/elements/arrow.py +1 -1
  3. streamlit/elements/vega_charts.py +1 -1
  4. streamlit/navigation/page.py +1 -1
  5. streamlit/runtime/fragment.py +1 -3
  6. streamlit/runtime/pages_manager.py +19 -50
  7. streamlit/runtime/scriptrunner/script_runner.py +0 -1
  8. streamlit/runtime/scriptrunner_utils/script_run_context.py +27 -3
  9. streamlit/runtime/state/session_state.py +62 -17
  10. streamlit/static/asset-manifest.json +3 -3
  11. streamlit/static/index.html +1 -1
  12. streamlit/static/static/js/7591.b3928443.chunk.js +2 -0
  13. streamlit/static/static/js/7591.b3928443.chunk.js.LICENSE.txt +1 -0
  14. streamlit/static/static/js/{main.8721af5a.js → main.50e02474.js} +2 -2
  15. {streamlit_nightly-1.38.1.dev20240915.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/METADATA +1 -1
  16. {streamlit_nightly-1.38.1.dev20240915.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/RECORD +21 -21
  17. {streamlit_nightly-1.38.1.dev20240915.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/WHEEL +1 -1
  18. streamlit/static/static/js/7591.116b650a.chunk.js +0 -2
  19. streamlit/static/static/js/7591.116b650a.chunk.js.LICENSE.txt +0 -1
  20. /streamlit/static/static/js/{main.8721af5a.js.LICENSE.txt → main.50e02474.js.LICENSE.txt} +0 -0
  21. {streamlit_nightly-1.38.1.dev20240915.data → streamlit_nightly-1.38.1.dev20240917.data}/scripts/streamlit.cmd +0 -0
  22. {streamlit_nightly-1.38.1.dev20240915.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/entry_points.txt +0 -0
  23. {streamlit_nightly-1.38.1.dev20240915.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/top_level.txt +0 -0
@@ -256,7 +256,7 @@ def navigation(
256
256
  page_to_return._can_be_called = True
257
257
  msg.navigation.page_script_hash = page_to_return._script_hash
258
258
  # Set the current page script hash to the page that is going to be executed
259
- ctx.pages_manager.set_current_page_script_hash(page_to_return._script_hash)
259
+ ctx.set_mpa_v2_page(page_to_return._script_hash)
260
260
 
261
261
  # This will either navigation or yield if the page is not found
262
262
  ctx.enqueue(msg)
@@ -578,7 +578,7 @@ class ArrowMixin:
578
578
  selection_mode=selection_mode,
579
579
  is_selection_activated=is_selection_activated,
580
580
  form_id=proto.form_id,
581
- page=ctx.page_script_hash if ctx else None,
581
+ page=ctx.active_script_hash if ctx else None,
582
582
  )
583
583
 
584
584
  serde = DataframeSelectionSerde()
@@ -1906,7 +1906,7 @@ class VegaChartsMixin:
1906
1906
  use_container_width=use_container_width,
1907
1907
  selection_mode=parsed_selection_modes,
1908
1908
  form_id=vega_lite_proto.form_id,
1909
- page=ctx.page_script_hash if ctx else None,
1909
+ page=ctx.active_script_hash if ctx else None,
1910
1910
  )
1911
1911
 
1912
1912
  serde = VegaLiteStateSerde(parsed_selection_modes)
@@ -282,7 +282,7 @@ class StreamlitPage:
282
282
  if not ctx:
283
283
  return
284
284
 
285
- with ctx.pages_manager.run_with_active_hash(self._script_hash):
285
+ with ctx.run_with_active_hash(self._script_hash):
286
286
  if callable(self._page):
287
287
  self._page()
288
288
  return
@@ -222,9 +222,7 @@ def _fragment(
222
222
  # This ensures that elements (especially widgets) are tied
223
223
  # to a consistent active script hash
224
224
  active_hash_context = (
225
- ctx.pages_manager.run_with_active_hash(
226
- initialized_active_script_hash
227
- )
225
+ ctx.run_with_active_hash(initialized_active_script_hash)
228
226
  if initialized_active_script_hash != ctx.active_script_hash
229
227
  else contextlib.nullcontext()
230
228
  )
@@ -14,7 +14,6 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- import contextlib
18
17
  import os
19
18
  import threading
20
19
  from pathlib import Path
@@ -74,15 +73,9 @@ class PagesStrategyV1:
74
73
  if setup_watcher:
75
74
  PagesStrategyV1.watch_pages_dir(pages_manager)
76
75
 
77
- # In MPA v1, there's no difference between the active hash
78
- # and the page script hash.
79
- def get_active_script_hash(self) -> PageHash:
80
- return self.pages_manager.current_page_hash
81
-
82
- def set_active_script_hash(self, _page_hash: PageHash):
83
- # Intentionally do nothing as MPA v1 active_script_hash does not
84
- # differentiate the active_script_hash and the page_script_hash
85
- pass
76
+ @property
77
+ def initial_active_script_hash(self) -> PageHash:
78
+ return self.pages_manager.current_page_script_hash
86
79
 
87
80
  def get_initial_active_script(
88
81
  self, page_script_hash: PageHash, page_name: PageName
@@ -147,15 +140,8 @@ class PagesStrategyV2:
147
140
 
148
141
  def __init__(self, pages_manager: PagesManager, **kwargs):
149
142
  self.pages_manager = pages_manager
150
- self._active_script_hash: PageHash = self.pages_manager.main_script_hash
151
143
  self._pages: dict[PageHash, PageInfo] | None = None
152
144
 
153
- def get_active_script_hash(self) -> PageHash:
154
- return self._active_script_hash
155
-
156
- def set_active_script_hash(self, page_hash: PageHash):
157
- self._active_script_hash = page_hash
158
-
159
145
  def get_initial_active_script(
160
146
  self, page_script_hash: PageHash, page_name: PageName
161
147
  ) -> PageInfo:
@@ -166,6 +152,10 @@ class PagesStrategyV2:
166
152
  or self.pages_manager.main_script_hash, # Default Hash
167
153
  }
168
154
 
155
+ @property
156
+ def initial_active_script_hash(self) -> PageHash:
157
+ return self.pages_manager.main_script_hash
158
+
169
159
  def get_page_script(self, fallback_page_hash: PageHash) -> PageInfo | None:
170
160
  if self._pages is None:
171
161
  return None
@@ -243,15 +233,11 @@ class PagesManager:
243
233
  ):
244
234
  self._main_script_path = main_script_path
245
235
  self._main_script_hash: PageHash = calc_md5(main_script_path)
246
- self._current_page_hash: PageHash = self._main_script_hash
247
236
  self.pages_strategy = PagesManager.DefaultStrategy(self, **kwargs)
248
237
  self._script_cache = script_cache
249
238
  self._intended_page_script_hash: PageHash | None = None
250
239
  self._intended_page_name: PageName | None = None
251
-
252
- @property
253
- def current_page_hash(self) -> PageHash:
254
- return self._current_page_hash
240
+ self._current_page_script_hash: PageHash = ""
255
241
 
256
242
  @property
257
243
  def main_script_path(self) -> ScriptPath:
@@ -261,6 +247,10 @@ class PagesManager:
261
247
  def main_script_hash(self) -> PageHash:
262
248
  return self._main_script_hash
263
249
 
250
+ @property
251
+ def current_page_script_hash(self) -> PageHash:
252
+ return self._current_page_script_hash
253
+
264
254
  @property
265
255
  def intended_page_name(self) -> PageName | None:
266
256
  return self._intended_page_name
@@ -269,34 +259,23 @@ class PagesManager:
269
259
  def intended_page_script_hash(self) -> PageHash | None:
270
260
  return self._intended_page_script_hash
271
261
 
262
+ @property
263
+ def initial_active_script_hash(self) -> PageHash:
264
+ return self.pages_strategy.initial_active_script_hash
265
+
272
266
  @property
273
267
  def mpa_version(self) -> int:
274
268
  return 2 if isinstance(self.pages_strategy, PagesStrategyV2) else 1
275
269
 
270
+ def set_current_page_script_hash(self, page_script_hash: PageHash) -> None:
271
+ self._current_page_script_hash = page_script_hash
272
+
276
273
  def get_main_page(self) -> PageInfo:
277
274
  return {
278
275
  "script_path": self._main_script_path,
279
276
  "page_script_hash": self._main_script_hash,
280
277
  }
281
278
 
282
- def get_current_page_script_hash(self) -> PageHash:
283
- """Gets the script hash of the associated page of a script."""
284
- return self._current_page_hash
285
-
286
- def set_current_page_script_hash(self, page_hash: PageHash) -> None:
287
- self._current_page_hash = page_hash
288
-
289
- def get_active_script_hash(self) -> PageHash:
290
- """Gets the script hash of the currently executing script."""
291
- return self.pages_strategy.get_active_script_hash()
292
-
293
- def set_active_script_hash(self, page_hash: PageHash):
294
- return self.pages_strategy.set_active_script_hash(page_hash)
295
-
296
- def reset_active_script_hash(self):
297
- # This will only apply to the V2 strategy as V1 ignores the concept
298
- self.set_active_script_hash(self.main_script_hash)
299
-
300
279
  def set_script_intent(
301
280
  self, page_script_hash: PageHash, page_name: PageName
302
281
  ) -> None:
@@ -310,16 +289,6 @@ class PagesManager:
310
289
  page_script_hash, page_name
311
290
  )
312
291
 
313
- @contextlib.contextmanager
314
- def run_with_active_hash(self, page_hash: PageHash):
315
- original_page_hash = self.get_active_script_hash()
316
- self.set_active_script_hash(page_hash)
317
- try:
318
- yield
319
- finally:
320
- # in the event of any exception, ensure we set the active hash back
321
- self.set_active_script_hash(original_page_hash)
322
-
323
292
  def get_pages(self) -> dict[PageHash, PageInfo]:
324
293
  return self.pages_strategy.get_pages()
325
294
 
@@ -467,7 +467,6 @@ class ScriptRunner:
467
467
  page_script_hash=page_script_hash,
468
468
  fragment_ids_this_run=fragment_ids_this_run,
469
469
  )
470
- self._pages_manager.reset_active_script_hash()
471
470
 
472
471
  self.on_event.send(
473
472
  self,
@@ -15,10 +15,18 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import collections
18
+ import contextlib
18
19
  import contextvars
19
20
  import threading
20
21
  from dataclasses import dataclass, field
21
- from typing import TYPE_CHECKING, Callable, Counter, Dict, Final, Union
22
+ from typing import (
23
+ TYPE_CHECKING,
24
+ Callable,
25
+ Counter,
26
+ Dict,
27
+ Final,
28
+ Union,
29
+ )
22
30
  from urllib import parse
23
31
 
24
32
  from typing_extensions import TypeAlias
@@ -90,6 +98,7 @@ class ScriptRunContext:
90
98
  current_fragment_id: str | None = None
91
99
  fragment_ids_this_run: list[str] | None = None
92
100
  new_fragment_ids: set[str] = field(default_factory=set)
101
+ _active_script_hash: str = ""
93
102
  # we allow only one dialog to be open at the same time
94
103
  has_dialog_opened: bool = False
95
104
 
@@ -99,11 +108,25 @@ class ScriptRunContext:
99
108
 
100
109
  @property
101
110
  def page_script_hash(self):
102
- return self.pages_manager.get_current_page_script_hash()
111
+ return self.pages_manager.current_page_script_hash
103
112
 
104
113
  @property
105
114
  def active_script_hash(self):
106
- return self.pages_manager.get_active_script_hash()
115
+ return self._active_script_hash
116
+
117
+ @contextlib.contextmanager
118
+ def run_with_active_hash(self, page_hash: str):
119
+ original_page_hash = self._active_script_hash
120
+ self._active_script_hash = page_hash
121
+ try:
122
+ yield
123
+ finally:
124
+ # in the event of any exception, ensure we set the active hash back
125
+ self._active_script_hash = original_page_hash
126
+
127
+ def set_mpa_v2_page(self, page_script_hash: str):
128
+ self._active_script_hash = self.pages_manager.main_script_hash
129
+ self.pages_manager.set_current_page_script_hash(page_script_hash)
107
130
 
108
131
  def reset(
109
132
  self,
@@ -117,6 +140,7 @@ class ScriptRunContext:
117
140
  self.form_ids_this_run = set()
118
141
  self.query_string = query_string
119
142
  self.pages_manager.set_current_page_script_hash(page_script_hash)
143
+ self._active_script_hash = self.pages_manager.initial_active_script_hash
120
144
  # Permit set_page_config when the ScriptRunContext is reused on a rerun
121
145
  self._set_page_config_allowed = True
122
146
  self._has_script_started = False
@@ -280,6 +280,56 @@ def _missing_key_error_message(key: str) -> str:
280
280
  )
281
281
 
282
282
 
283
+ @dataclass
284
+ class KeyIdMapper:
285
+ """A mapping of user-provided keys to element IDs.
286
+ It also maps element IDs to user-provided keys so that this reverse mapping
287
+ does not have to be computed ad-hoc.
288
+ All built-in dict-operations such as setting and deleting expect the key as the
289
+ argument, not the element ID.
290
+ """
291
+
292
+ _key_id_mapping: dict[str, str] = field(default_factory=dict)
293
+ _id_key_mapping: dict[str, str] = field(default_factory=dict)
294
+
295
+ def __contains__(self, key: str) -> bool:
296
+ return key in self._key_id_mapping
297
+
298
+ def __setitem__(self, key: str, widget_id: Any) -> None:
299
+ self._key_id_mapping[key] = widget_id
300
+ self._id_key_mapping[widget_id] = key
301
+
302
+ def __delitem__(self, key: str) -> None:
303
+ self.delete(key)
304
+
305
+ @property
306
+ def id_key_mapping(self) -> dict[str, str]:
307
+ return self._id_key_mapping
308
+
309
+ def set_key_id_mapping(self, key_id_mapping: dict[str, str]) -> None:
310
+ self._key_id_mapping = key_id_mapping
311
+ self._id_key_mapping = {v: k for k, v in key_id_mapping.items()}
312
+
313
+ def get_id_from_key(self, key: str, default: Any = None) -> str:
314
+ return self._key_id_mapping.get(key, default)
315
+
316
+ def get_key_from_id(self, widget_id: str) -> str:
317
+ return self._id_key_mapping[widget_id]
318
+
319
+ def update(self, other: KeyIdMapper) -> None:
320
+ self._key_id_mapping.update(other._key_id_mapping)
321
+ self._id_key_mapping.update(other._id_key_mapping)
322
+
323
+ def clear(self):
324
+ self._key_id_mapping.clear()
325
+ self._id_key_mapping.clear()
326
+
327
+ def delete(self, key: str):
328
+ widget_id = self._key_id_mapping[key]
329
+ del self._key_id_mapping[key]
330
+ del self._id_key_mapping[widget_id]
331
+
332
+
283
333
  @dataclass
284
334
  class SessionState:
285
335
  """SessionState allows users to store values that persist between app
@@ -308,10 +358,11 @@ class SessionState:
308
358
  # Widget values from the frontend, usually one changing prompted the script rerun
309
359
  _new_widget_state: WStates = field(default_factory=WStates)
310
360
 
311
- # Keys used for widgets will be eagerly converted to the matching widget id
312
- _key_id_mapping: dict[str, str] = field(default_factory=dict)
361
+ # Keys used for widgets will be eagerly converted to the matching element id
362
+ _key_id_mapper: KeyIdMapper = field(default_factory=KeyIdMapper)
313
363
 
314
- # query params are stored in session state because query params will be tied with widget state at one point.
364
+ # query params are stored in session state because query params will be tied with
365
+ # widget state at one point.
315
366
  query_params: QueryParams = field(default_factory=QueryParams)
316
367
 
317
368
  def __repr__(self):
@@ -338,13 +389,13 @@ class SessionState:
338
389
  self._old_state.clear()
339
390
  self._new_session_state.clear()
340
391
  self._new_widget_state.clear()
341
- self._key_id_mapping.clear()
392
+ self._key_id_mapper.clear()
342
393
 
343
394
  @property
344
395
  def filtered_state(self) -> dict[str, Any]:
345
396
  """The combined session and widget state, excluding keyless widgets."""
346
397
 
347
- wid_key_map = self._reverse_key_wid_map
398
+ wid_key_map = self._key_id_mapper.id_key_mapping
348
399
 
349
400
  state: dict[str, Any] = {}
350
401
 
@@ -366,12 +417,6 @@ class SessionState:
366
417
 
367
418
  return state
368
419
 
369
- @property
370
- def _reverse_key_wid_map(self) -> dict[str, str]:
371
- """Return a mapping of widget_id : widget_key."""
372
- wid_key_map = {v: k for k, v in self._key_id_mapping.items()}
373
- return wid_key_map
374
-
375
420
  def _keys(self) -> set[str]:
376
421
  """All keys active in Session State, with widget keys converted
377
422
  to widget ids when one is known. (This includes autogenerated keys
@@ -400,7 +445,7 @@ class SessionState:
400
445
  return len(self._keys())
401
446
 
402
447
  def __getitem__(self, key: str) -> Any:
403
- wid_key_map = self._reverse_key_wid_map
448
+ wid_key_map = self._key_id_mapper.id_key_mapping
404
449
  widget_id = self._get_widget_id(key)
405
450
 
406
451
  if widget_id in wid_key_map and widget_id == key:
@@ -463,7 +508,7 @@ class SessionState:
463
508
  ctx = get_script_run_ctx()
464
509
 
465
510
  if ctx is not None:
466
- widget_id = self._key_id_mapping.get(user_key, None)
511
+ widget_id = self._key_id_mapper.get_id_from_key(user_key, None)
467
512
  widget_ids = ctx.widget_ids_this_run
468
513
  form_ids = ctx.form_ids_this_run
469
514
 
@@ -487,8 +532,8 @@ class SessionState:
487
532
  if key in self._old_state:
488
533
  del self._old_state[key]
489
534
 
490
- if key in self._key_id_mapping:
491
- del self._key_id_mapping[key]
535
+ if key in self._key_id_mapper:
536
+ self._key_id_mapper.delete(key)
492
537
 
493
538
  if widget_id in self._new_widget_state:
494
539
  del self._new_widget_state[widget_id]
@@ -608,10 +653,10 @@ class SessionState:
608
653
  """Turns a value that might be a widget id or a user provided key into
609
654
  an appropriate widget id.
610
655
  """
611
- return self._key_id_mapping.get(k, k)
656
+ return self._key_id_mapper.get_id_from_key(k, k)
612
657
 
613
658
  def _set_key_widget_mapping(self, widget_id: str, user_key: str) -> None:
614
- self._key_id_mapping[user_key] = widget_id
659
+ self._key_id_mapper[user_key] = widget_id
615
660
 
616
661
  def register_widget(
617
662
  self, metadata: WidgetMetadata[T], user_key: str | None
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "./static/css/main.5513bd04.css",
4
- "main.js": "./static/js/main.8721af5a.js",
4
+ "main.js": "./static/js/main.50e02474.js",
5
5
  "static/js/6679.265ca09c.chunk.js": "./static/js/6679.265ca09c.chunk.js",
6
6
  "static/js/9464.7e9a3c0a.chunk.js": "./static/js/9464.7e9a3c0a.chunk.js",
7
7
  "static/js/9077.e0a8db2a.chunk.js": "./static/js/9077.e0a8db2a.chunk.js",
@@ -62,7 +62,7 @@
62
62
  "static/js/797.36f1bf7d.chunk.js": "./static/js/797.36f1bf7d.chunk.js",
63
63
  "static/js/6198.956025ac.chunk.js": "./static/js/6198.956025ac.chunk.js",
64
64
  "static/js/1674.86aea8e0.chunk.js": "./static/js/1674.86aea8e0.chunk.js",
65
- "static/js/7591.116b650a.chunk.js": "./static/js/7591.116b650a.chunk.js",
65
+ "static/js/7591.b3928443.chunk.js": "./static/js/7591.b3928443.chunk.js",
66
66
  "static/media/MaterialSymbols-Rounded.woff2": "./static/media/MaterialSymbols-Rounded.ec07649f7a20048d5730.woff2",
67
67
  "static/media/fireworks.gif": "./static/media/fireworks.0906f02ea43f1018a6d2.gif",
68
68
  "static/media/flake-2.png": "./static/media/flake-2.e3f07d06933dd0e84c24.png",
@@ -153,6 +153,6 @@
153
153
  },
154
154
  "entrypoints": [
155
155
  "static/css/main.5513bd04.css",
156
- "static/js/main.8721af5a.js"
156
+ "static/js/main.50e02474.js"
157
157
  ]
158
158
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><link rel="shortcut icon" href="./favicon.png"/><link rel="preload" href="./static/media/SourceSansPro-Regular.0d69e5ff5e92ac64a0c9.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-SemiBold.abed79cd0df1827e18cf.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-Bold.118dea98980e20a81ced.woff2" as="font" type="font/woff2" crossorigin><title>Streamlit</title><script>window.prerenderReady=!1</script><script defer="defer" src="./static/js/main.8721af5a.js"></script><link href="./static/css/main.5513bd04.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><link rel="shortcut icon" href="./favicon.png"/><link rel="preload" href="./static/media/SourceSansPro-Regular.0d69e5ff5e92ac64a0c9.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-SemiBold.abed79cd0df1827e18cf.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-Bold.118dea98980e20a81ced.woff2" as="font" type="font/woff2" crossorigin><title>Streamlit</title><script>window.prerenderReady=!1</script><script defer="defer" src="./static/js/main.50e02474.js"></script><link href="./static/css/main.5513bd04.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
@@ -0,0 +1,2 @@
1
+ /*! For license information please see 7591.b3928443.chunk.js.LICENSE.txt */
2
+ "use strict";(self.webpackChunk_streamlit_app=self.webpackChunk_streamlit_app||[]).push([[7591],{17591:(e,t,n)=>{n.d(t,{A:()=>ie});const{entries:o,setPrototypeOf:r,isFrozen:i,getPrototypeOf:a,getOwnPropertyDescriptor:l}=Object;let{freeze:c,seal:s,create:u}=Object,{apply:m,construct:p}="undefined"!==typeof Reflect&&Reflect;c||(c=function(e){return e}),s||(s=function(e){return e}),m||(m=function(e,t,n){return e.apply(t,n)}),p||(p=function(e,t){return new e(...t)});const f=w(Array.prototype.forEach),d=w(Array.prototype.pop),h=w(Array.prototype.push),g=w(String.prototype.toLowerCase),T=w(String.prototype.toString),y=w(String.prototype.match),E=w(String.prototype.replace),_=w(String.prototype.indexOf),A=w(String.prototype.trim),N=w(Object.prototype.hasOwnProperty),b=w(RegExp.prototype.test),S=(R=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return p(R,t)});var R;function w(e){return function(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return m(e,t,o)}}function C(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:g;r&&r(e,null);let o=t.length;for(;o--;){let r=t[o];if("string"===typeof r){const e=n(r);e!==r&&(i(t)||(t[o]=e),r=e)}e[r]=!0}return e}function L(e){for(let t=0;t<e.length;t++){N(e,t)||(e[t]=null)}return e}function v(e){const t=u(null);for(const[n,r]of o(e)){N(e,n)&&(Array.isArray(r)?t[n]=L(r):r&&"object"===typeof r&&r.constructor===Object?t[n]=v(r):t[n]=r)}return t}function D(e,t){for(;null!==e;){const n=l(e,t);if(n){if(n.get)return w(n.get);if("function"===typeof n.value)return w(n.value)}e=a(e)}return function(){return null}}const k=c(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),O=c(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),x=c(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),I=c(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),M=c(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),U=c(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),P=c(["#text"]),F=c(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),H=c(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),z=c(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),B=c(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),W=s(/\{\{[\w\W]*|[\w\W]*\}\}/gm),G=s(/<%[\w\W]*|[\w\W]*%>/gm),Y=s(/\${[\w\W]*}/gm),j=s(/^data-[\-\w.\u00B7-\uFFFF]/),X=s(/^aria-[\-\w]+$/),q=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),$=s(/^(?:\w+script|data):/i),K=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),V=s(/^html$/i),Z=s(/^[a-z][.\w]*(-[.\w]+)+$/i);var J=Object.freeze({__proto__:null,MUSTACHE_EXPR:W,ERB_EXPR:G,TMPLIT_EXPR:Y,DATA_ATTR:j,ARIA_ATTR:X,IS_ALLOWED_URI:q,IS_SCRIPT_OR_DATA:$,ATTR_WHITESPACE:K,DOCTYPE_NAME:V,CUSTOM_ELEMENT:Z});const Q=1,ee=3,te=7,ne=8,oe=9,re=function(){return"undefined"===typeof window?null:window};var ie=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:re();const n=t=>e(t);if(n.version="3.1.6",n.removed=[],!t||!t.document||t.document.nodeType!==oe)return n.isSupported=!1,n;let{document:r}=t;const i=r,a=i.currentScript,{DocumentFragment:l,HTMLTemplateElement:s,Node:m,Element:p,NodeFilter:R,NamedNodeMap:w=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:L,DOMParser:W,trustedTypes:G}=t,Y=p.prototype,j=D(Y,"cloneNode"),X=D(Y,"remove"),$=D(Y,"nextSibling"),K=D(Y,"childNodes"),Z=D(Y,"parentNode");if("function"===typeof s){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let ie,ae="";const{implementation:le,createNodeIterator:ce,createDocumentFragment:se,getElementsByTagName:ue}=r,{importNode:me}=i;let pe={};n.isSupported="function"===typeof o&&"function"===typeof Z&&le&&void 0!==le.createHTMLDocument;const{MUSTACHE_EXPR:fe,ERB_EXPR:de,TMPLIT_EXPR:he,DATA_ATTR:ge,ARIA_ATTR:Te,IS_SCRIPT_OR_DATA:ye,ATTR_WHITESPACE:Ee,CUSTOM_ELEMENT:_e}=J;let{IS_ALLOWED_URI:Ae}=J,Ne=null;const be=C({},[...k,...O,...x,...M,...P]);let Se=null;const Re=C({},[...F,...H,...z,...B]);let we=Object.seal(u(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ce=null,Le=null,ve=!0,De=!0,ke=!1,Oe=!0,xe=!1,Ie=!0,Me=!1,Ue=!1,Pe=!1,Fe=!1,He=!1,ze=!1,Be=!0,We=!1,Ge=!0,Ye=!1,je={},Xe=null;const qe=C({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let $e=null;const Ke=C({},["audio","video","img","source","image","track"]);let Ve=null;const Ze=C({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Je="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",et="http://www.w3.org/1999/xhtml";let tt=et,nt=!1,ot=null;const rt=C({},[Je,Qe,et],T);let it=null;const at=["application/xhtml+xml","text/html"];let lt=null,ct=null;const st=r.createElement("form"),ut=function(e){return e instanceof RegExp||e instanceof Function},mt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!ct||ct!==e){if(e&&"object"===typeof e||(e={}),e=v(e),it=-1===at.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,lt="application/xhtml+xml"===it?T:g,Ne=N(e,"ALLOWED_TAGS")?C({},e.ALLOWED_TAGS,lt):be,Se=N(e,"ALLOWED_ATTR")?C({},e.ALLOWED_ATTR,lt):Re,ot=N(e,"ALLOWED_NAMESPACES")?C({},e.ALLOWED_NAMESPACES,T):rt,Ve=N(e,"ADD_URI_SAFE_ATTR")?C(v(Ze),e.ADD_URI_SAFE_ATTR,lt):Ze,$e=N(e,"ADD_DATA_URI_TAGS")?C(v(Ke),e.ADD_DATA_URI_TAGS,lt):Ke,Xe=N(e,"FORBID_CONTENTS")?C({},e.FORBID_CONTENTS,lt):qe,Ce=N(e,"FORBID_TAGS")?C({},e.FORBID_TAGS,lt):{},Le=N(e,"FORBID_ATTR")?C({},e.FORBID_ATTR,lt):{},je=!!N(e,"USE_PROFILES")&&e.USE_PROFILES,ve=!1!==e.ALLOW_ARIA_ATTR,De=!1!==e.ALLOW_DATA_ATTR,ke=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Oe=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,xe=e.SAFE_FOR_TEMPLATES||!1,Ie=!1!==e.SAFE_FOR_XML,Me=e.WHOLE_DOCUMENT||!1,Fe=e.RETURN_DOM||!1,He=e.RETURN_DOM_FRAGMENT||!1,ze=e.RETURN_TRUSTED_TYPE||!1,Pe=e.FORCE_BODY||!1,Be=!1!==e.SANITIZE_DOM,We=e.SANITIZE_NAMED_PROPS||!1,Ge=!1!==e.KEEP_CONTENT,Ye=e.IN_PLACE||!1,Ae=e.ALLOWED_URI_REGEXP||q,tt=e.NAMESPACE||et,we=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ut(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(we.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ut(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(we.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"===typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(we.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),xe&&(De=!1),He&&(Fe=!0),je&&(Ne=C({},P),Se=[],!0===je.html&&(C(Ne,k),C(Se,F)),!0===je.svg&&(C(Ne,O),C(Se,H),C(Se,B)),!0===je.svgFilters&&(C(Ne,x),C(Se,H),C(Se,B)),!0===je.mathMl&&(C(Ne,M),C(Se,z),C(Se,B))),e.ADD_TAGS&&(Ne===be&&(Ne=v(Ne)),C(Ne,e.ADD_TAGS,lt)),e.ADD_ATTR&&(Se===Re&&(Se=v(Se)),C(Se,e.ADD_ATTR,lt)),e.ADD_URI_SAFE_ATTR&&C(Ve,e.ADD_URI_SAFE_ATTR,lt),e.FORBID_CONTENTS&&(Xe===qe&&(Xe=v(Xe)),C(Xe,e.FORBID_CONTENTS,lt)),Ge&&(Ne["#text"]=!0),Me&&C(Ne,["html","head","body"]),Ne.table&&(C(Ne,["tbody"]),delete Ce.tbody),e.TRUSTED_TYPES_POLICY){if("function"!==typeof e.TRUSTED_TYPES_POLICY.createHTML)throw S('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!==typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw S('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ie=e.TRUSTED_TYPES_POLICY,ae=ie.createHTML("")}else void 0===ie&&(ie=function(e,t){if("object"!==typeof e||"function"!==typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(i){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(G,a)),null!==ie&&"string"===typeof ae&&(ae=ie.createHTML(""));c&&c(e),ct=e}},pt=C({},["mi","mo","mn","ms","mtext"]),ft=C({},["foreignobject","annotation-xml"]),dt=C({},["title","style","font","a","script"]),ht=C({},[...O,...x,...I]),gt=C({},[...M,...U]),Tt=function(e){h(n.removed,{element:e});try{Z(e).removeChild(e)}catch(t){X(e)}},yt=function(e,t){try{h(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(o){h(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Se[e])if(Fe||He)try{Tt(t)}catch(o){}else try{t.setAttribute(e,"")}catch(o){}},Et=function(e){let t=null,n=null;if(Pe)e="<remove></remove>"+e;else{const t=y(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===it&&tt===et&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=ie?ie.createHTML(e):e;if(tt===et)try{t=(new W).parseFromString(o,it)}catch(a){}if(!t||!t.documentElement){t=le.createDocument(tt,"template",null);try{t.documentElement.innerHTML=nt?ae:o}catch(a){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),tt===et?ue.call(t,Me?"html":"body")[0]:Me?t.documentElement:i},_t=function(e){return ce.call(e.ownerDocument||e,e,R.SHOW_ELEMENT|R.SHOW_COMMENT|R.SHOW_TEXT|R.SHOW_PROCESSING_INSTRUCTION|R.SHOW_CDATA_SECTION,null)},At=function(e){return e instanceof L&&("string"!==typeof e.nodeName||"string"!==typeof e.textContent||"function"!==typeof e.removeChild||!(e.attributes instanceof w)||"function"!==typeof e.removeAttribute||"function"!==typeof e.setAttribute||"string"!==typeof e.namespaceURI||"function"!==typeof e.insertBefore||"function"!==typeof e.hasChildNodes)},Nt=function(e){return"function"===typeof m&&e instanceof m},bt=function(e,t,o){pe[e]&&f(pe[e],(e=>{e.call(n,t,o,ct)}))},St=function(e){let t=null;if(bt("beforeSanitizeElements",e,null),At(e))return Tt(e),!0;const o=lt(e.nodeName);if(bt("uponSanitizeElement",e,{tagName:o,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return Tt(e),!0;if(e.nodeType===te)return Tt(e),!0;if(Ie&&e.nodeType===ne&&b(/<[/\w]/g,e.data))return Tt(e),!0;if(!Ne[o]||Ce[o]){if(!Ce[o]&&wt(o)){if(we.tagNameCheck instanceof RegExp&&b(we.tagNameCheck,o))return!1;if(we.tagNameCheck instanceof Function&&we.tagNameCheck(o))return!1}if(Ge&&!Xe[o]){const t=Z(e)||e.parentNode,n=K(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=j(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,$(e))}}}return Tt(e),!0}return e instanceof p&&!function(e){let t=Z(e);t&&t.tagName||(t={namespaceURI:tt,tagName:"template"});const n=g(e.tagName),o=g(t.tagName);return!!ot[e.namespaceURI]&&(e.namespaceURI===Qe?t.namespaceURI===et?"svg"===n:t.namespaceURI===Je?"svg"===n&&("annotation-xml"===o||pt[o]):Boolean(ht[n]):e.namespaceURI===Je?t.namespaceURI===et?"math"===n:t.namespaceURI===Qe?"math"===n&&ft[o]:Boolean(gt[n]):e.namespaceURI===et?!(t.namespaceURI===Qe&&!ft[o])&&!(t.namespaceURI===Je&&!pt[o])&&!gt[n]&&(dt[n]||!ht[n]):!("application/xhtml+xml"!==it||!ot[e.namespaceURI]))}(e)?(Tt(e),!0):"noscript"!==o&&"noembed"!==o&&"noframes"!==o||!b(/<\/no(script|embed|frames)/i,e.innerHTML)?(xe&&e.nodeType===ee&&(t=e.textContent,f([fe,de,he],(e=>{t=E(t,e," ")})),e.textContent!==t&&(h(n.removed,{element:e.cloneNode()}),e.textContent=t)),bt("afterSanitizeElements",e,null),!1):(Tt(e),!0)},Rt=function(e,t,n){if(Be&&("id"===t||"name"===t)&&(n in r||n in st))return!1;if(De&&!Le[t]&&b(ge,t));else if(ve&&b(Te,t));else if(!Se[t]||Le[t]){if(!(wt(e)&&(we.tagNameCheck instanceof RegExp&&b(we.tagNameCheck,e)||we.tagNameCheck instanceof Function&&we.tagNameCheck(e))&&(we.attributeNameCheck instanceof RegExp&&b(we.attributeNameCheck,t)||we.attributeNameCheck instanceof Function&&we.attributeNameCheck(t))||"is"===t&&we.allowCustomizedBuiltInElements&&(we.tagNameCheck instanceof RegExp&&b(we.tagNameCheck,n)||we.tagNameCheck instanceof Function&&we.tagNameCheck(n))))return!1}else if(Ve[t]);else if(b(Ae,E(n,Ee,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==_(n,"data:")||!$e[e]){if(ke&&!b(ye,E(n,Ee,"")));else if(n)return!1}else;return!0},wt=function(e){return"annotation-xml"!==e&&y(e,_e)},Ct=function(e){bt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const o={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Se};let r=t.length;for(;r--;){const a=t[r],{name:l,namespaceURI:c,value:s}=a,u=lt(l);let m="value"===l?s:A(s);if(o.attrName=u,o.attrValue=m,o.keepAttr=!0,o.forceKeepAttr=void 0,bt("uponSanitizeAttribute",e,o),m=o.attrValue,Ie&&b(/((--!?|])>)|<\/(style|title)/i,m)){yt(l,e);continue}if(o.forceKeepAttr)continue;if(yt(l,e),!o.keepAttr)continue;if(!Oe&&b(/\/>/i,m)){yt(l,e);continue}xe&&f([fe,de,he],(e=>{m=E(m,e," ")}));const p=lt(e.nodeName);if(Rt(p,u,m)){if(!We||"id"!==u&&"name"!==u||(yt(l,e),m="user-content-"+m),ie&&"object"===typeof G&&"function"===typeof G.getAttributeType)if(c);else switch(G.getAttributeType(p,u)){case"TrustedHTML":m=ie.createHTML(m);break;case"TrustedScriptURL":m=ie.createScriptURL(m)}try{c?e.setAttributeNS(c,l,m):e.setAttribute(l,m),At(e)?Tt(e):d(n.removed)}catch(i){}}}bt("afterSanitizeAttributes",e,null)},Lt=function e(t){let n=null;const o=_t(t);for(bt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)bt("uponSanitizeShadowNode",n,null),St(n)||(n.content instanceof l&&e(n.content),Ct(n));bt("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=null,r=null,a=null,c=null;if(nt=!e,nt&&(e="\x3c!--\x3e"),"string"!==typeof e&&!Nt(e)){if("function"!==typeof e.toString)throw S("toString is not a function");if("string"!==typeof(e=e.toString()))throw S("dirty is not a string, aborting")}if(!n.isSupported)return e;if(Ue||mt(t),n.removed=[],"string"===typeof e&&(Ye=!1),Ye){if(e.nodeName){const t=lt(e.nodeName);if(!Ne[t]||Ce[t])throw S("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof m)o=Et("\x3c!----\x3e"),r=o.ownerDocument.importNode(e,!0),r.nodeType===Q&&"BODY"===r.nodeName||"HTML"===r.nodeName?o=r:o.appendChild(r);else{if(!Fe&&!xe&&!Me&&-1===e.indexOf("<"))return ie&&ze?ie.createHTML(e):e;if(o=Et(e),!o)return Fe?null:ze?ae:""}o&&Pe&&Tt(o.firstChild);const s=_t(Ye?e:o);for(;a=s.nextNode();)St(a)||(a.content instanceof l&&Lt(a.content),Ct(a));if(Ye)return e;if(Fe){if(He)for(c=se.call(o.ownerDocument);o.firstChild;)c.appendChild(o.firstChild);else c=o;return(Se.shadowroot||Se.shadowrootmode)&&(c=me.call(i,c,!0)),c}let u=Me?o.outerHTML:o.innerHTML;return Me&&Ne["!doctype"]&&o.ownerDocument&&o.ownerDocument.doctype&&o.ownerDocument.doctype.name&&b(V,o.ownerDocument.doctype.name)&&(u="<!DOCTYPE "+o.ownerDocument.doctype.name+">\n"+u),xe&&f([fe,de,he],(e=>{u=E(u,e," ")})),ie&&ze?ie.createHTML(u):u},n.setConfig=function(){mt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ue=!0},n.clearConfig=function(){ct=null,Ue=!1},n.isValidAttribute=function(e,t,n){ct||mt({});const o=lt(e),r=lt(t);return Rt(o,r,n)},n.addHook=function(e,t){"function"===typeof t&&(pe[e]=pe[e]||[],h(pe[e],t))},n.removeHook=function(e){if(pe[e])return d(pe[e])},n.removeHooks=function(e){pe[e]&&(pe[e]=[])},n.removeAllHooks=function(){pe={}},n}()}}]);
@@ -0,0 +1 @@
1
+ /*! @license DOMPurify 3.1.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.6/LICENSE */